spark中saveAsTextFile如何最终生成一个文件
2015-07-29 10:12
204 查看
一般而言,saveAsTextFile会按照执行task的多少生成多少个文件,比如part-00000一直到part-0000n,n自然就是task的个数,亦即是最后的stage的分区数。那么有没有办法最后只生成一个文件,而不是成百上千个文件了?答案自然是有办法。
在RDD上调用
事情最终就这么简单吗?显然不是。你虽然可以这么做,但代价是巨大的。因为Spark面对的是大量的数据,并且是并行执行的,如果强行要求最后只有一个分区,必然导致大量的磁盘IO和网络IO产生,并且最终执行reduce操作的节点的内存也会承受很大考验。Spark程序会很慢,甚至死掉。
这往往是初学Spark的一个思维陷阱,需要改变原先那种单线程单节点的思维,对程序的理解要转变多多个节点多个进程中去,需要熟悉多节点集群自然产生多个文件这种模式。
此外,saveAsTextFile要求保存的目录之前是没有的,否则会报错。所以,最好程序中保存前先判断一下目录是否存在。
在RDD上调用
coalesce(1,true).saveAsTextFile(),意味着做完计算之后将数据汇集到一个分区,然后再执行保存的动作,显然,一个分区,Spark自然只起一个task来执行保存的动作,也就只有一个文件产生了。又或者,可以调用repartition(1),它其实是
coalesce的一个包装,默认第二个参数为true。
事情最终就这么简单吗?显然不是。你虽然可以这么做,但代价是巨大的。因为Spark面对的是大量的数据,并且是并行执行的,如果强行要求最后只有一个分区,必然导致大量的磁盘IO和网络IO产生,并且最终执行reduce操作的节点的内存也会承受很大考验。Spark程序会很慢,甚至死掉。
这往往是初学Spark的一个思维陷阱,需要改变原先那种单线程单节点的思维,对程序的理解要转变多多个节点多个进程中去,需要熟悉多节点集群自然产生多个文件这种模式。
此外,saveAsTextFile要求保存的目录之前是没有的,否则会报错。所以,最好程序中保存前先判断一下目录是否存在。
相关文章推荐
- Easyui的validatebox验证方法自定义扩展
- Python:渗透测试开源项目
- 枚举+剪枝 codeforces303C Minimum Modular
- 插入排序(直接 和 希尔)
- Android学习之联系人PinnedHeaderListView(通讯录)
- 设置tableviewcell的分割线从头开始
- HDOJ Saving Beans 3037【Lucas定理】
- hibernate里createSQLQuery的addEntity()和setResultTransformer()方法
- JavaScript 数组的indexOf()、remove()、splice() , pop()方法
- python-urlib模块
- CImageList
- python 插入排序
- Radar Installation(POJ--1328
- android动画介绍之 自定义Animation动画实现qq抖一抖效果
- html5实现手机弹窗留言对话框
- Tomcat 7 内存设置
- struts(学习1)
- 陋室铭
- android动画介绍之 自定义Animation动画实现qq抖一抖效果
- POJ 3414 Pots