Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 火花加载许多小型csv需要很长时间_Amazon S3_Pyspark_Spark Csv - Fatal编程技术网

Amazon s3 火花加载许多小型csv需要很长时间

Amazon s3 火花加载许多小型csv需要很长时间,amazon-s3,pyspark,spark-csv,Amazon S3,Pyspark,Spark Csv,说明 在我的工作场所,我们有大量需要处理的数据。它涉及到数量迅速增长的实例(目前约3000个),这些实例都有几兆字节的数据存储在S3上的Gzip csv文件中 我已经设置了一个spark群集,并编写了一个spark脚本,该脚本执行以下操作 在每种情况下: 加载数据帧 运行计算 但是还没有保存数据帧(因此没有触发任何操作,我在spark作业UI中确认了这一点) 之后,我将所有数据帧合并成一个数据帧并保存结果(因此触发一个操作) 问题 当我使用少量实例时,上面的方法非常有效。但我发现了以下问题:

说明 在我的工作场所,我们有大量需要处理的数据。它涉及到数量迅速增长的实例(目前约3000个),这些实例都有几兆字节的数据存储在S3上的Gzip csv文件中

我已经设置了一个spark群集,并编写了一个spark脚本,该脚本执行以下操作

  • 在每种情况下:

    • 加载数据帧
    • 运行计算
    • 但是还没有保存数据帧(因此没有触发任何操作,我在spark作业UI中确认了这一点)
  • 之后,我将所有数据帧合并成一个数据帧并保存结果(因此触发一个操作)

  • 问题 当我使用少量实例时,上面的方法非常有效。但我发现了以下问题: -当实例文件加载到数据帧中时,需要4-6秒而不会触发任何操作。 -数据帧的加载发生在驱动程序上 -由于以上两个原因,加载数据帧需要将近2个小时(通过使用python“线程”对此进行了一些优化)

    有人能解释一下是什么导致加载速度慢,并建议我如何处理吗?

    可能相关信息是我使用的是aws s3a hadoop文件系统。此外,我计算的第一部分是每个实例完全独立的,这就是为什么我在将所有输入数据合并到一个gzip csv文件中时有点犹豫的原因

    任何帮助都将不胜感激,我写这篇文章是因为这个问题一直到凌晨5点

    请让我知道我是否应该提供更多的细节

    编辑

    感谢您的评论,我正在kubernetes上运行spark,因此无法使用hadoop命令合并文件。不过,我正在追求合并实例文件的想法

    编辑2
    事实证明,我使用spark的方式完全错误,我认为我可以通过将数据分开来简化spark,但结果适得其反。最好的解决方案似乎是将您的输入文件聚合到更大的文件中。并调整您的脚本以使其分开。

    spark并没有真正优化到处理大量小文件的程度。我不知道如果可能的话,您可以尝试将小文件聚合到更大的文件中,这样做可能会奏效。

    我会尝试以下方法:

  • 如果每个实例在创建后都保持不变,那么只有实例的数量会随着天数的增加而增加,我会:

    (1) 加载所有实例并将它们合并到一个大数据框中,另外生成一列来指示实例ID

    (2) 保存大数据帧

    (3) 今后,每天的任务可能只是加载大数据帧和新实例,组合它们,进行计算,保存输出。 因为每个实例数据都有自己的实例ID,所以您仍然能够在它们上运行并行计算

    (4) 此外,在加载csv时,如果所有实例都具有相同的头,请在加载时尝试指定架构。这可能会节省一些时间

  • 这个我自己从来没有试过,也不确定它是否有效,只是想在这里引起一场头脑风暴:)

  • (1) 您可以创建一个DataFrame,一列是实例ID,另一列是相应实例或文件名的地址

    (2) 然后在实例ID上加载
    groupby
    ,并在
    udf
    中加载
    csv
    文件。因此,csv加载将在工作人员之间分配,而不是在驱动程序上运行

    (3)
    groupby
    应自动返回组合数据帧。然后你从它开始

    希望能有帮助。
    请告诉我们你是如何解决这个问题的

    我建议您将数据复制到hadoop集群(EMR)上,然后合并这些文件,或者您可以使用
    hadoop fs-getmerge
    合并文件,谢谢您的建议。每个实例的数据都在增长,但是在soms点上,对于较旧的记录,数据将不再改变。我意识到我误用了spark,而是重写脚本以大批量加载数据。我确实安排了一个额外的列来指示实例id。而且我已经提供了一个度量模式。