我正在使用带有mongodb的spark,我想知道输入rdd是如何在群集中的不同工作节点之间分割的,因为我的工作是将两个记录(一个是请求另一个是响应)合二为一,基于msg_id ,flag(flag表示请求或响应)字段,msg_id在两个记录中都是相同的。而spark splitting input rdd,每个节点分别为每个节点分配请求如果一个节点中的请求记录和另一个节点中的响应记录的情况。
答案 0 :(得分:0)
首先,Spark master不会分割数据。它只是控制工人。
其次,rdd拆分(从外部源读取时)由InputSplits决定,通过输入格式实现。这部分与map reduce非常相似。因此,在您的情况下,rdd拆分(或分区,以火花术语)由mongodb输入格式决定。
在您的情况下,我相信您要寻找的是将msg id的所有记录共同定位到一个节点。这可以使用partitionByKey函数来实现。
答案 1 :(得分:0)
将根据您的转换构建RDD(在场景下加注)并且主人在此处扮演角色的空间较小。请参阅此链接How does Spark paralellize slices to tasks/executors/workers?。 在您的情况下,您可能需要实现 groupby()或 groupbykey()(建议不要这样做)转换,以根据键(msg_id)对值进行分组。
例如
val baseRDD = sc.parallelize(Array("1111,REQUEST,abcd","1111,RESPONSE,wxyz","2222,REQUEST,abcd","2222,RESPONSE,wxyz"))
//convert your base rdd to keypair RDD
val keyValRDD =baseRDD.map { line => (line.split(",")(0),line)}
//Group it by message_id
val groupedRDD = keyValRDD.groupBy(keyvalue => keyvalue._1)
groupedRDD.saveAsTextFile("c:\\result")
结果:
(1111,CompactBuffer((1111,1111,REQUEST,abcd),(1111,1111,RESPONSE,wxyz))) (2222,CompactBuffer((2222,2222,REQUEST,abcd),(2222,2222,RESPONSE,wxyz)))
在上述情况下,在同一分区中拥有密钥的所有值的可能性很高(在运行时受数据量和可用计算资源的影响)