火花节省结果到HDFS

时间:2016-04-27 10:14:56

标签: apache-spark hdfs pyspark

我在使用带有HDFS上的一个主节点和三个工作节点的spark保存解析的XML文件时遇到奇怪的行为,问题是

当我解析XMLFile并尝试保存在HDFS中时,文件无法使用所有已解析的结果进行保存。

当我通过指定

执行与本地模式相同的代码时
sc = SparkContext("local", "parser") 

and the spark-submit will be ./bin/spark-submit xml_parser.py

此运行在hdfs上为完整记录提供了117mb解析文件。

如果在spark-client模式下执行代码,那么我会执行以下操作,

 sc = SparkContext("spark://master:7077", "parser") 

火花提交是,

./bin/spark-submit --master yarn-client --deploy-mode client --driver-memory 7g --executor-memory 4g  --executor-cores 2  xml_parser.py 1000

在hdfs上给我19mb文件,记录不完整。

用于在我使用rdd.saveAsTextFile(" hdfs://")的情况下保存结果

我正在使用spark1.6.1-hadoop2.6 和Apache hadoop 2.7.2

任何人都可以帮助我。我不知道为什么会发生这种情况。 我有以下sparkCluster,

1-master 8GbRAM

2-workerNode1 8GbRAM

3-WorkerNode2 8GbRAM

4-workerNode3 8GbRAM

我在Hadoop-2.7.2上配置了上面的集群,其中包含1个主节点和3个DataNode,

如果我jps On severNode给了我,

24097大师

21652 Jps

23398 NameNode

23799 ResourceManager

23630 SecondaryNameNode

JPS在所有数据节点上,

8006工人

7819 NodeManager

27164 Jps

7678 DataNode

通过检查HadoopNameNode ui master:9000给我三个实时DataNodes

通过检查主人上的SparkMaster Ui:7077给了我三个现场工作人员

请看这里,

sc = SpakContext("spark://master:7077", "parser")
--------------------------------------------
 contains the logic of XMLParsing
--------------------------------------------
and I am appending the result in one list like,
cc_list.append([final_cll, Date,Time,int(cont[i]), float(values[i]),0])
Now I am Parallelizing the above cc_list like
 parallel_list = sc.parallelize(cc_list)
 parallel_list.saveAsTextFile("hdfs://master:9000/ some path")
 Now I am Doing some operations here.
 new_list = sc.textFile("hdfs://localhost:9000/some path/part-00000).map(lambda line:line.split(','))

 result = new_list.map(lambda x: (x[0]+',   '+x[3],float(x[4]))).sortByKey('true').coalesce(1)
 result = result.map(lambda x:x[0]+','+str(x[1]))
 result = result.map(lambda x: x.lstrip('[').rstrip(']').replace(' ','')).saveAsTextFile("hdfs://master:9000/some path1))

1 个答案:

答案 0 :(得分:1)

抱歉这里有这样的傻瓜问题。实际上我发现了两个问题

1)在多个worker上运行时,

 parallel_list = sc.parallelize(cc_list) 

创建4-5个部分文件,parallel_list保存在Hdfs中,部分00000到部分00004,并且在加载parallel_list时你可以在代码中看到上面

new_list = sc.textFile(pathto parallel_list/part-00000) ==> so it was taking only the first part.

2)在localMode上运行时,

 parallel_list = sc.parallelize(cc_list) was creating only one part file so i was able to pick whole file at one stroke.

因此,当与工人一起运行时,我想出了两个解决方案

1)我刚从parallel_list创建new_list时添加了部分 - *

2)通过使用spark submit传递 - conf spark.akka.frameSize = 1000 ,将spark.akka.frameSize增加到10000。