spark中的saveAsTextFile函数是否将数据传输给驱动程序?

时间:2015-12-30 21:50:37

标签: apache-spark dataframe apache-spark-sql

首先,我加入两个数据帧,第一个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();

1 个答案:

答案 0 :(得分:0)

在相关帖子https://stackoverflow.com/a/29602918/5957143

中找到了答案

总结@kuujo的答案:

  

saveAsTextFile不会将数据发送回驱动程序。而是   完成后,将保存结果发送回驱动程序。   即,saveAsTextFile是分布式的。唯一的情况不是   分布式是指您只有一个分区,或者   调用前将RDD合并回一个分区   saveAsTextFile。