У меня есть огромный файл, хранящийся в HDFS, mydata.txt
, где каждая строка содержит данные, которые необходимо отправить в конечную точку REST. Мне интересно, как я могу эффективно группировать/разделять данные (строки в файле), а затем отправлять их в конечную точку REST, используя OkHttp
. Я хочу сгруппировать/разделить данные, потому что не хочу создавать слишком много HTTP-клиентов, а также распределять рабочую нагрузку.
Например, в настоящее время у меня есть что-то вроде следующего.
val sc = new SparkContext(new SparkConf())
val client = new OkHttpClient
val input = "hdfs://myserver/path/to/mydata.txt"
sc.textFile(input)
.foreach(line => {
val request = new Request.Builder()
.url("http://anotherserver/api/data")
.post(RequestBody.create(MediaType.parse("application/json"), line))
.build()
client.newCall(request).execute()
})
Насколько я понимаю, foreach
- это Action
, поэтому он вызывается в программе драйвера, поэтому client
не нужно сериализовать и его можно использовать для всех данных (строк). Конечно, это решение не распараллелено.
Я тоже думал о разбиении, но думаю, что foreachPartition
это тоже Action
.
sc.textFile(input)
.map(line => (Random.nextInt(10), line))
.partitionBy(new HashPartitioner(10))
.foreachPartition(iter => {
while(iter.hasNext) {
val item = iter.next()
val line = item._2
//submit to REST endpoint
}
})
Любые мысли о том, как распараллелить работу по отправке данных в конечную точку REST с помощью Spark?
EDIT Оказывается, OkHttpClient
не сериализуем и даже не может использоваться внутри цикла foreach
.