Spark saveAsTextFile变慢

时间:2015-12-09 20:28:24

标签: amazon-s3 apache-spark pyspark

在pyspark我读了一个非常大的目录,大约4 TB,并且在映射之后,看起来需要几天时间才能重新保存。我真的不能等待,但我的管道无论如何都会破坏我是被迫离开Spark,所以这不是一个真正的选择。

我正在寻找一个更快的距离,无论是将文件保存为Gzip,还是将一些参数传递给我的群集,或其他任何东西,以加速保存操作。

注意:我在22500处合并为我提供了大约500 MB的22500个文件(我认为) - 但我不知道分区的数量是否重要。

datum = sc.textFile("s3n://file/path/*")

data2json = datum.map(lambda x: json.loads(x))
dataNew = data2json.flatMap(Encodes)
identifier = str(uuid.uuid4())
fileNamed = 's3n://new-file/path/new-files/' + identifier
dataNew.coalesce(225000, 'true').saveAsTextFile(fileNamed)

Encodes是下面的用户定义函数。它将JSON记录拆分为多个JSON记录。

def schemaEncode(jsStr):
    json_objects = []
    jst = json.loads(jsStr[0])
    entry = jsStr[0]
    val_one = jst['_id']
    id = val_one[val_one.keys()[0]]
    jst.pop('_id')
    attribute_names = []
    attribute_type = []
    attribute_value = []
    elements = jst.keys()
    for k in elements:
        attribute_names.append(k) #attribute names
        attribute_type.append(jst[k].keys()[0]) #add type (s, i , sS)
        attribute_value.append(jst[k][jst[k].keys()[0]]) #add value
    for i in range(len(attribute_names)):
        json_objects.append(json.dumps({'id':id, 'attr_type':attribute_type[i], 'attr_name':attribute_names[i], 'attr_value':attribute_value[i]}))
    return json_objects

我在AWS EC2上运行了18个Slaves。日志输出如下所示:

15/12/09 20:39:46 INFO scheduler.TaskSetManager: Starting task 1711.0 in stage 1.0 (TID 1718, 172.33.33.30, PROCESS_LOCAL, 2482 bytes)
15/12/09 20:39:46 INFO scheduler.TaskSetManager: Finished task 1675.0 in stage 1.0 (TID 1681) in 55111 ms on 172.33.33.30 (1676/45856)
15/12/09 20:39:46 INFO scheduler.TaskSetManager: Starting task 1712.0 in stage 1.0 (TID 1719, 172.33.33.113, PROCESS_LOCAL, 2482 bytes)
15/12/09 20:39:46 INFO scheduler.TaskSetManager: Finished task 1679.0 in stage 1.0 (TID 1685) in 51953 ms on 172.33.33.113 (1677/45856)

1 个答案:

答案 0 :(得分:0)

dataNew.coalesce(225000, false)

合并但禁用shuffle,shuffle非常昂贵并且会占用大量的I / O和网络。