读取S3是执行HTTPS请求的身份验证,其内容范围标头设置为指向读取的开头(0或您刚刚尝试查找的位置),以及结尾(历史上文件的结尾) ;这现在是可选的,对于繁重的ORC和Parquet输入,应避免使用)。
关键性能点:
getFileStatus())上很慢。这会伤害工作设置。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()不适用于大型数据集。一切似乎在开发中都运作良好,但生产是规模问题的重灾区
查看示例代码,
ps命令中可见,而您则不希望如此。如果您打算使用 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)