spark中saveAsTextFile如何最终生成一个文件
原文地址:
http://www.cnblogs.com/029zz010buct/p/4685173.html

一般而言,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要求保存的目录之前是没有的,否则会报错。所以,最好程序中保存前先判断一下目录是否存在。
================================================================================================
原链接:
http://blog.csdn.net/power0405hf/article/details/50596233
当我运行完一个Spark程序想把结果保存为saveAsTextFile, 
结果使用Hadoop fs -ls /output  后发现里面有一系列的part,好几千个。 
原因: 
运行Spark的时候把数据分成了很多份(partition),每个partition都把自己的数据保存成partxxx文件形式。 
如果想保存为一份的话,就要:
先collect
或者
data.coalesce(1,true).saveAsTextFile()
也或者
data.repartition(1).saveAsTextFile( ) //You can also use repartition(1), which is just a wrapper for coalesce() with the suffle argument set to true.
data.repartition(1).saveAsTextFile( “HDFS://OUTPUT”)
但是如果你的数据很大,难以在单机内存上装下,以上操作可能会造成单机内存不足。
原因在于以上操作都是讲分布在各个机器上的数据汇总到单机,然后再保存到磁盘(HDFS)上。
以上操作将各个机器上的RDD partition 合并到单一主机后再读入磁盘。
以下给出更安全的操作,即采用HDFS磁盘合并操作。
如果已经存了很多个part: 
可以把大文件夹getmerge:
把HDFS 上的多个文件 合并成一个 本地文件:
hadoop fs -getmerge /hdfs/output    /local/file.txt
也可以:
hadoop    fs   -cat    /hdfs/output/part-r-* >   /local/file.txt
spark中saveAsTextFile如何最终生成一个文件的更多相关文章
- 将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件
		
将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件import java.io.File;import java.io.FileOutputStre ...
 - 将一个文件中的内容,在另一个文件中生成.       for line in f1,           \n   f2.write(line)
		
将一个文件中的内容,在另一个文件中生成. 核心语句: for line in f1: f1中的所有一行 f2.write(line) ...
 - delphi中单独编译pas生成dcu文件
		
delphi中单独编译pas生成dcu文件 在网上下载了一个带源码的组件,结果碰到提示说缺少xxx.dcu.一看它的目录下确实没有,那能不能生成一个呢? 当然可以! 方法是使用delphi的安装目录\ ...
 - 100个Shell脚本——【脚本8】每日生成一个文件
		
[脚本8]每日生成一个文件 要求:请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如今天生成的文件为)2017-07-05.log, 并且把磁盘的使用情况写到到这个文件中,(不用考虑c ...
 - 工具:从一个文件夹中复制jar到另一个文件夹中
		
工具类:从一个文件夹中复制jar到另一个文件夹中 需要的小伙伴可以试一试,很爽哦,有时候真的很需要! 需求:当我们拿到一个maven项目时,而maven项目的jar包都是通过pom.xml文件管理的, ...
 - 使用IO流将数据库中数据生成一个文件,结果使用Notepad++打开部分数据结尾出现NUL
		
场景描述: 项目中通过java代码中从数据库中查询一系列数据,对数据做相应处理,然后通过字符流将数据写如一个新生成的文件中,将该项目部署在linux服务器上,最后生成的文件拿到本地使用notepad+ ...
 - spark中saveAsTextFile的错误
		
写了很简单的一段spark代码,将结果保存为windows本地文件,执行之后总是报错NullPointerException 查询之后 发现是本地缺少hadoop需要的一个文件所致 如果本地已经安装了 ...
 - Python中使用dom模块生成XML文件示例
		
在Python中解析XML文件也有Dom和Sax两种方式,这里先介绍如何是使用Dom解析XML,这一篇文章是Dom生成XML文件,下一篇文章再继续介绍Dom解析XML文件. 在生成XML文件中,我们主 ...
 - Java中使用DOM4J来生成xml文件和解析xml文件
		
一.前言 现在有不少需求,是需要我们解析xml文件中的数据,然后导入到数据库中,当然解析xml文件也有好多种方法,小编觉得还是DOM4J用的最多最广泛也最好理解的吧.小编也是最近需求里遇到了,就来整理 ...
 
随机推荐
- go 内建变量类型
			
bool,string (u)int,(u)int8,(u)int16,(u)int32,(u)int64,uintptr(指针) byte,rune(字符) float32,float64,comp ...
 - python 集合清空
			
setp = set(["Red", "Green"]) setq = setp.copy() print(setq) setp.clear() print(s ...
 - shell 求幂
			
$ let i=** $ echo $i $ ((i=**)) $ echo $i $ echo "5^2" | bc
 - java动态代理和cglib
			
1.代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代理:在程序运行时,运用反射机制动态创建而成. 2.JD ...
 - js 中的 堆栈
			
1.含义及对比 堆和栈都是运行时内存中分配的一个数据区,因此也被称为堆区和栈区: 二者存储的数据类型和处理速度不同: 堆(heap)用于复杂数据类型(引用类型)分配空间,例如数组对象.object对象 ...
 - NGUI中 鼠标划出屏幕后,停止对 UIDragScrollView 的 press
			
using UnityEngine; /// <summary> /// NGUI中 鼠标划出屏幕后,停止对 UIDragScrollView 的 press /// </summa ...
 - C++ 多态性和虚函数
			
2017-06-27 19:17:52 C++面向对象编程的一个重要的特性就是多态性,而多态性的实现需要依赖虚函数的帮助. 一.多态的作用: 隐藏实现细节,使得代码能够模块化: 接口重用,实现“一个接 ...
 - ASCII码、ISO8859-1、Unicode、GBK和UTF-8 的区别
			
为什么需要编码? 计算机中最小的存储单位是字节(byte),一个字节所能表示的字符数又有限,1byte=8bit,一个字节最多也只能表示255个字符,而世界上的语种又多,都有各种不同的字符,无法用一个 ...
 - R语言-attach、detach、with
			
在R语言中,对于串列,数据框中的数据的进行操作时,为了避免重复地键入对象名称,可使用attach或with. 1.attach() 假设data.frame包含列name,age attach(one ...
 - python打印ms
			
ct打印的是时间戳,时间戳的小数点后前三位为ms eg:1555644362.055328 ms = 055 import time ct = time.time() local_time = ...