在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)
答案 0 :(得分:0)
dataNew.coalesce(225000, false)
合并但禁用shuffle,shuffle非常昂贵并且会占用大量的I / O和网络。