【发布时间】:2025-12-14 04:45:02
【问题描述】:
我有一个存储在 HDFS 中的大文件 mydata.txt,其中每一行都包含必须提交到 REST 端点的数据。我想知道如何有效地对数据(文件中的行)进行分组/分区,然后使用OkHttp 将它们提交到 REST 端点。我想对数据进行分组/分区,因为我不想创建太多 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
}
})
关于如何使用 Spark 并行化将数据提交到 REST 端点的工作有什么想法吗?
编辑原来OkHttpClient是不可序列化的,甚至不能在foreach循环中使用。
【问题讨论】:
标签: apache-spark parallel-processing okhttp3