我有一个小型的Spark作业,可以从s3收集文件,按密钥对其进行分组,然后将其保存到tar中。
我正在大型EMR群集上运行此作业,但性能却越来越差。
Input DataFrame的大小约为10M-20M记录。
每个ID都有1000个文件。
当我使用partitions = unique_ids / 20时,它工作稳定,每个任务大约需要1个小时。稳定但缓慢!
我尝试用distinct_ids进行分区,但是无法正常工作,请先启动然后冻结。
有什么想法可以提高这项工作或其他技术的性能以将文件分组为tar吗?
def archive_files(f_list, str_date, source_bucket, destination_bucket):
f_cat = list()
for f in f_list:
# download file from s3
# add file to tar
f_cat.append = {list with file metadata}
# upload tar file to s3
return f_cat # list of dictionaries
if __name__ == '__main__':
with pyspark.SparkContext(appName="x") as sc:
sqlContext = SQLContext(sparkContext=sc)
df_cat = sqlContext.read.parquet(cat_path)
distinct_ids = df_cat.select("id").distinct().count()
res_cat_rdd = df_cat.rdd.groupBy(lambda x: x.id)\
.repartition(distinct_ids) \
.map(lambda r: archive_files(r, batch_name, SOURCE_BUCKET, DESTINATION_BUCKET)) \
.flatMap(lambda x: x)
res_cat_df = res_cat_rdd.toDF()
res_cat_df.write.mode('overwrite').parquet(cat_path_output)