Hadoop 在Spark中将SequenceFile读入RDD会导致任务不平衡
我已经生成了一个约900MB的序列文件,其中包含15条记录,其中13条记录的大小约为64MB(我们HDF的块大小) 在Pyspark中,我阅读了如下内容(键和值都是自定义java类):Hadoop 在Spark中将SequenceFile读入RDD会导致任务不平衡,hadoop,apache-spark,pyspark,Hadoop,Apache Spark,Pyspark,我已经生成了一个约900MB的序列文件,其中包含15条记录,其中13条记录的大小约为64MB(我们HDF的块大小) 在Pyspark中,我阅读了如下内容(键和值都是自定义java类): rdd=sc.sequenceFile(“hdfs:///Test.seq,keyClass=“ChunkID”,valueClass=“ChunkData”,keyConverter=“KeyToChunkConverter”,valueConverter=“DataToChunkConverter”) rdd
rdd=sc.sequenceFile(“hdfs:///Test.seq,keyClass=“ChunkID”,valueClass=“ChunkData”,keyConverter=“KeyToChunkConverter”,valueConverter=“DataToChunkConverter”)
rdd.getNumPartitions()
显示有14个分区。我尝试用它执行一些算法,如下所示:
def open_map():
def open_map_nested(key_value):
try:
# ChunkID, ChunkData
key, data = key_value
####Algorithm Ommited#####
if key[0] == 0:
return [['if', 'if', 'if']]
else:
return [["else","else","else"]]
except Exception, e:
logging.exception(e)
return [["None","None","None"],["None","None","None"]] #["None"]
return open_map_nested
result = rdd.flatMap(open_map()).count()
但是,当我打开Spark UI时,前两条记录总是分配给一个任务,如下图所示(输入大小也很奇怪):
这导致其他任务只包含一条等待任务完成的记录,并成为瓶颈。
我还尝试使用java实现相同的功能,但是问题仍然存在
我的作业的设置是--主线程--部署模式客户端--驱动程序内存8G--num executors 20--executor cores 1--executor内存1500M
我的问题是:
- 在spark中有没有标准的方法将sequencefile读入RDD李>
- 是否有任何参数可以避免spark将两条记录分配给第一个任务李>