Spark中的saveAsTextFile函数是否将数据传输到驱动程序



首先,我将两个数据帧连接起来,第一个DF是从第二个DF中过滤出来的,大约为8MB(260000条记录),第二个测向来自cca 2GB(3700000条记录)的文件。然后我打电话给

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();

在相关帖子中找到答案https://stackoverflow.com/a/29602918/5957143

总结@kuujo的回答:

saveAsTextFile不会将数据发送回驱动程序。相反,它保存完成后,将保存结果发送回驱动程序。也就是说,saveAsTextFile是分布式的。唯一没有的情况分布式是指只有一个分区,或者在调用之前,将RDD合并回一个分区保存为文本文件。

相关内容

  • 没有找到相关文章

最新更新