能否火花并行读取大型s3 csv文件?

时间:2019-07-07 11:56:30

标签: apache-spark amazon-s3 amazon-emr

通常,火花文件保存在多个部分中,从而使每个工作人员都可以读取不同的文件。 处理单个文件时有类似的解决方案吗? s3提供了应该允许这种行为的select API。

spark似乎支持此API(https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-s3select.html),但这似乎仅与优化查询有关,与并行读取无关。

2 个答案:

答案 0 :(得分:0)

S3 Select与您的用例无关。

  1. S3选择:在S3存储中完成SQL选择和项目,以便客户端获取预过滤的数据。结果以CSV格式返回,其中标头被剥离,即JSON。这样您就无法将> 1个工作人员作为目标。 (您可以尝试,但是每个工作人员都必须读入并丢弃启动过程中的所有数据直到其偏移量,并且预测每个工作人员可以处理的范围基本上是不可能的)

  2. 您:有1个工作进程处理文件的不同部分,该文件已被分区

对于任何有意义的格式,Spark(以及mapreduce,hive等)所做的正是将大文件分成较小的部分进行并行处理。

如果

CSV文件使用 splittable 压缩格式(无,快照-但不是gzip)压缩,则可以轻松分区。

所需要做的只是告诉spark什么是分割阈值。对于S3a,将值fs.s3a.block.size设置为可以拆分的值,然后您对CSV,Avro,ORC,Parquet等类似对象的查询将全部拆分为工作人员。

除非您的工作人员每行要进行大量计算,否则在达到最小大小之前,甚至不值得这样做。实验。

答案 1 :(得分:0)

FYI csv本质上是单线程的。 CSV文件中没有多余的信息,可以告诉读者任何行从何处开始,而无需从头开始读取整个文件。

如果要在同一文件上使用多个阅读器,请使用Parquet之类的格式,该格式的行组具有在页脚中定义的明确定义的起始位置,可以由独立的阅读器读取。当spark读取镶木地板文件时,它将把行组拆分为单独的任务。最终,拥有适当大小的文件对于火花性能非常重要。