Spark-saveAsTextFile 分区设置

Posted xiaopihaierletian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark-saveAsTextFile 分区设置相关的知识,希望对你有一定的参考价值。

scala> val rd1 =sc.parallelize(Array(1 to 10000))

rd1: org.apache.spark.rdd.RDD[scala.collection.immutable.Range.Inclusive] = ParallelCollectionRDD[24] at parallelize at <console>:24

scala> rd1.partitions.size

res32: Int = 24

scala> rd1.saveAsTextFile("/zhouwu/rd1")

[root@master]# hdfs dfs -ls /zhouwu/rd1
Found 25 items
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/_SUCCESS
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00000
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00001
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00002
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00003
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00004
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00005
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00006
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00007
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00008
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00009
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00010
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00011
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00012
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00013
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00014
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00015
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00016
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00017
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00018
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00019
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00020
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00021
-rw-r--r--   3 root supergroup          0 2018-01-26 16:57 /zhouwu/rd1/part-00022
-rw-r--r--   3 root supergroup       2464 2018-01-26 16:57 /zhouwu/rd1/part-00023

一般而言,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 分区设置的主要内容,如果未能解决你的问题,请参考以下文章

eMMC分区是怎么设置的?

安装Ubuntu的时候,哪些区该设置为主分区,哪些区该设置为逻辑分区

SATA硬盘分区设置及安装教程

ORACLE分区表设置,想问下以下问题:

linux设置开启swap交换分区基本命令(虚拟内存)

如何使用 BIOS 中断设置引导分区