PySpark从s3对象创建tar文件

时间:2018-11-19 21:35:48

标签: pyspark amazon-emr

我有一个小型的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)

0 个答案:

没有答案