在不平衡任务中将SequenceFile读入Spark中的RDD结果

时间:2017-04-12 00:10:18

标签: hadoop apache-spark pyspark

我已经生成了一个约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时,前两个记录总是分配给一个任务,如下图所示(输入大小也很奇怪): inputsplit 这导致其他任务只包含一条记录,等待任务完成并成为瓶颈。 execution time 我也尝试使用java来实现相同的功能,但问题仍然存在。

我的工作设置为--master yarn --deploy-mode client --driver-memory 8G --num-executors 20 --executor-cores 1 --executor-memory 1500M

我的问题是:

  • 有什么标准的方法可以将序列文件读入spark中的RDD吗?
  • 是否有任何参数可以避免火花为第一项任务分配两条记录?

任何建议都将受到高度赞赏!!

0 个答案:

没有答案