博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spark中saveAsTextFile如何最终生成一个文件
阅读量:5289 次
发布时间:2019-06-14

本文共 650 字,大约阅读时间需要 2 分钟。

  一般而言,saveAsTextFile会按照执行task的多少生成多少个文件,比如part-00000一直到part-0000n,n自然就是task的个数,亦即是最后的stage的分区数。那么有没有办法最后只生成一个文件,而不是成百上千个文件了?答案自然是有办法。

  在RDD上调用coalesce(1,true).saveAsTextFile(),意味着做完计算之后将数据汇集到一个分区,然后再执行保存的动作,显然,一个分区,Spark自然只起一个task来执行保存的动作,也就只有一个文件产生了。又或者,可以调用repartition(1),它其实是coalesce的一个包装,默认第二个参数为true。

  事情最终就这么简单吗?显然不是。你虽然可以这么做,但代价是巨大的。因为Spark面对的是大量的数据,并且是并行执行的,如果强行要求最后只有一个分区,必然导致大量的磁盘IO和网络IO产生,并且最终执行reduce操作的节点的内存也会承受很大考验。Spark程序会很慢,甚至死掉。

  这往往是初学Spark的一个思维陷阱,需要改变原先那种单线程单节点的思维,对程序的理解要转变多多个节点多个进程中去,需要熟悉多节点集群自然产生多个文件这种模式。

  此外,saveAsTextFile要求保存的目录之前是没有的,否则会报错。所以,最好程序中保存前先判断一下目录是否存在。

 

转载于:https://www.cnblogs.com/029zz010buct/p/4685173.html

你可能感兴趣的文章
progressDialog 为什么设置了setProgress()方法无反应?
查看>>
P126 练习4.1 E2
查看>>
从零开始编写自己的C#框架(26)——小结
查看>>
记录近期小改K-Means至MapReduce上的心得
查看>>
ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView
查看>>
mvc route .html 后缀 404
查看>>
IE浏览器报Promise未定义
查看>>
STM32串口中断
查看>>
android5.0问题
查看>>
Android 使用PullToRefreshExpandableListView不能setAdapter的问题
查看>>
Java判断1个字符串中出现了几次其他字符串
查看>>
android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法
查看>>
Mysql备份--mysqldump&outfile
查看>>
学习siege实战
查看>>
Service IP 原理 - 每天5分钟玩转 Docker 容器技术(137)
查看>>
python网络爬虫入门范例
查看>>
css 阴影使用
查看>>
mysql 数据库 初步
查看>>
Android调用天气预报的WebService简单例子
查看>>
c++ map key 指针
查看>>