AWS S3与EC2 HDFS上的Apache Spark性能

Niz*_*een 6 apache-spark

从S3和EC2 HDFS读取火花文件时,性能有何不同?还请说明这两种情况下如何工作?

Ste*_*ran 5

读取S3是执行HTTPS请求的身份验证,其内容范围标头设置为指向读取的开头(0或您刚刚尝试查找的位置),以及结尾(历史上文件的结尾) ;这现在是可选的,对于繁重的ORC和Parquet输入,应避免使用)。

关键性能点:

  • 阅读:您没有访问权限的地方;网络带宽受您租用的VM的限制。
  • S3的搜索速度较慢,即将在即将发布的Hadoop 2.8中部分解决
  • S3在元数据操作(清单,getFileStatus())上很慢。这会伤害工作设置。
  • 写:还不错,除了Hadoop 2.8之前的版本,客户端会等到close()Call进行上传,这可能会增加延迟。
  • rename():真的是COPY;因为named()用于提交任务和作业,所以在将s3用作工作目标时会损害性能。由于S3最终是一致的,因此您仍然可能丢失数据。写入hdfs://然后复制到s3a://

如何实施?在Apache Hadoop源代码树中查找抽象org.apache.fs.FileSystem类的实现。HDFS和S3A都是示例。这是S3A。输入流(具有Hadoop 2.8惰性搜索和fadvise = random选项以实现更快的Random IO)是S3AInputStream


查看其他答案涵盖的文章,这是一篇关于S3的三年历史文章,当时它限于5GB。遗漏了争论双方的一些要点。

我认为作者首先对S3有一些偏见,“ S3支持压缩!” :,以及对这两个方面的某些无知。(提示,尽管镶木地板和ORC都需要seek(),但我们通过Content-Range HTTP标头在s3n和s3a S3客户端中执行此操作)

在非EMR系统上,S3是存储中间数据的危险场所,而从性能角度而言,S3是低效的工作目标。这是由于其最终的一致性,这意味着工作流中的下一阶段可能无法拾取新创建的数据,并且由于提交工作rename()不适用于大型数据集。一切似乎在开发中都运作良好,但生产是规模问题的重灾区

查看示例代码,

  1. 您将需要amazon-s3 SDK JAR的版本来匹配您的Hadoop版本。对于Hadoop 2.7,则为1.7.4。事实证明这很脆弱。
  2. 最好将s3a机密信息放入spark-defaults.conf; 或将其保留为AWS_环境变量,并让spark-submit自动传播它们。将它们放在命令行中会使它们在ps命令中可见,而您则不希望如此。
  3. S3a实际上将使用IAM身份验证:如果您要提交给EC2 VM,则无需提供任何机密信息,因为它会在启动时获取提供给VM的凭据。


Vik*_*ame 5

如果您打算使用 Spark SQL,那么您可能需要考虑以下

  • 当您的外部表指向 S3 时,SPARK SQL 会显着退化。您甚至可能会遇到内存问题,例如org.apache.spark.shuffle.FetchFailedException: Too large framejava.lang.OutOfMemoryError

  • 另一个观察结果,如果 shuffle 块超过 2GB,则 shuffle 失败。当外部表指向 S3 时会出现此问题。

  • 与 S3 相比,SPARK SQL 在 HDFS 上的性能在 50MM/10G 数据集上快 50%


小智 4

这是关于这个主题的精彩文章,您必须阅读。

存储-apache-hadoop-数据-云-hdfs-vs-s3

结论:凭借更好的可扩展性、内置持久性和更低的价格,S3 是赢家!尽管如此,为了获得更好的性能并且没有文件大小或存储格式限制,HDFS 是最佳选择。

从 S3 访问文件时,使用 URI 方案 s3a 可以提供比 s3n 更高的性能,并且 s3a 没有 5GB 文件大小限制。

val data = sc.textFile("s3a://bucket-name/key")
Run Code Online (Sandbox Code Playgroud)

例如,您可以像这样提交 Spark 的 scala jar 文件

   spark-submit \
  --master local[2] \
  --packages datastax:spark-cassandra-connector:2.0.0-M2-s_2.11,org.apache.hadoop:hadoop-aws:2.7.3 \
  --conf spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem \
  --conf spark.hadoop.fs.s3a.access.key=xxxx \
  --conf spark.hadoop.fs.s3a.secret.key=xxxxxxx \
  --class org.etl.jobs.sprint.SprintBatchEtl \
  target/scala-2.11/test-ingestion-assembly-0.0.1-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)