首先,我加入两个数据帧,第一个DF从第二个DF过滤,大约8MB(26万条记录),第二个DF来自cca 2GB(37 000 000条记录)的文件。然后我打电话给
joinedDF.javaRDD().saveAsTextFile("hdfs://xxx:9000/users/root/result");
我也尝试了
joinedDF.write().mode(SaveMode.Overwrite).json("hdfs://xxx:9000/users/root/result");
我有点困惑,因为我得到了一个例外
错误TaskSetManager:54个任务的序列化结果的总大小 (1034.6 MB)大于spark.driver.maxResultSize(1024.0 MB)
据我所知,saveAsTextFile应该直接从worker输出。那么为什么我得到与驱动程序相关的异常? 我知道增加spark.driver.maxResultSize的选项并将其设置为无限制,但它没有帮助,因为我的驱动程序总共只有4,8GB内存。
编辑:
DataFrame df1 = table.as("A");
DataFrame df2 = table.withColumnRenamed("id", "key").filter("value = 'foo'");
joinedDF = df1.join(df2.as("B"), col("A.id").
startsWith(col("B.key")),
"right_outer");
我也尝试了广播变量,更改是在df2
DataFrame df2 = sc.broadcast(table.withColumnRenamed("id", "key").filter("value = 'foo'")).getValue();
答案 0 :(得分:0)
在相关帖子https://stackoverflow.com/a/29602918/5957143
中找到了答案总结@kuujo的答案:
saveAsTextFile不会将数据发送回驱动程序。而是 完成后,将保存结果发送回驱动程序。 即,saveAsTextFile是分布式的。唯一的情况不是 分布式是指您只有一个分区,或者 调用前将RDD合并回一个分区 saveAsTextFile。