带有boto3的emr上的pyspark,带有Futures的s3对象结果副本在[100000毫秒]后超时

带有boto3的emr上的pyspark,带有Futures的s3对象结果副本在[100000毫秒]后超时,pyspark,boto3,amazon-emr,Pyspark,Boto3,Amazon Emr,我有一个pyspark应用程序,可以将csv转换为拼花地板,在此之前,我正在将一些S3对象从一个木桶复制到另一个木桶 pyspark,spark 2.4,emr 5.27,MaximizerSourceAllocation设置为true 我有各种大小的csv文件,从80kb到500mb 尽管如此,我的EMR集群(spark submit不会在本地失败)在一个166mb的文件上以70%的完成率失败(之前的480mb成功) 工作很简单: def organise_adwords_csv():

我有一个pyspark应用程序,可以将csv转换为拼花地板,在此之前,我正在将一些S3对象从一个木桶复制到另一个木桶

pyspark,spark 2.4,emr 5.27,MaximizerSourceAllocation设置为true

我有各种大小的csv文件,从80kb到500mb

尽管如此,我的EMR集群(spark submit不会在本地失败)在一个166mb的文件上以70%的完成率失败(之前的480mb成功)

工作很简单:

def organise_adwords_csv():
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(S3_ORIGIN_RAW_BUCKET)
    for obj in bucket.objects.filter(Prefix=S3_ORIGIN_ADWORDS_RAW + "/"):
        key = obj.key

        copy_source = {
            'Bucket': S3_ORIGIN_RAW_BUCKET,
            'Key': key
        }

        key_tab = obj.key.split("/")
        if len(key_tab) < 5:
            print("continuing from length", obj)
            continue
        file_name = ''.join(key_tab[len(key_tab)-1:len(key_tab)])
        if file_name == '':
            print("continuing", obj)
            continue

        table = file_name.split("_")[1].replace("-", "_")
        new_path = "{0}/{1}/{2}".format(S3_DESTINATION_ORDERED_ADWORDS_RAW_PATH, table, file_name)
        print("new_path", new_path) <- the last print will end here
        try:
            s3.meta.client.copy(copy_source, S3_DESTINATION_RAW_BUCKET, new_path)
            print("copy done")
        except Exception as e:
            print(e)
            print("an exception occured while copying")

if __name__=='__main__':
    organise_adwords_csv()

    print("copy Final done") <- never printed

    spark = SparkSession.builder.appName("adwords_transform") \
    ...
我完全失明了,我不明白失败的原因。 我怎么知道呢?在本地,它就像一种魅力(当然是超慢的)

编辑: 经过多次尝试,我可以确认功能:

s3.meta.client.copy(copy_source, S3_DESTINATION_RAW_BUCKET, new_path)
使EMR群集超时,即使它已经处理了80%的文件。 有人对此有什么建议吗

s3.meta.client.copy(copy_source, S3_DESTINATION_RAW_BUCKET, new_path)

对于任何大于5 GB的源对象,此操作都将失败。请在AWS中使用多部分上载。请参见

您是否可以尝试在您的EMR上启动spark shell或pyspark,并查看它是否正确启动,然后尝试在shell上运行脚本。对我来说,您的spark配置似乎有一些问题。我注意到这个命令:
s3.meta.client.copy(复制源、s3\u目标、新路径)
是超时的命令。我假设如果要复制的文件太大,spark将超时..?我没有任何大于3GB的对象我必须“解决”它的唯一方法是添加时间。每60个文件睡眠(3)。
s3.meta.client.copy(copy_source, S3_DESTINATION_RAW_BUCKET, new_path)