我已经生成了一个约900MB的序列文件,其中包含15条记录,其中13条记录的大小约为64MB(我们的HDFS的块大小)。
在Pyspark中,我按如下方式阅读(键和值都是自定义java类):
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来实现相同的功能,但问题仍然存在。
我的工作设置为--master yarn --deploy-mode client --driver-memory 8G --num-executors 20 --executor-cores 1 --executor-memory 1500M
。
我的问题是:
任何建议都将受到高度赞赏!!