Amazon EMR S3A支持

时间:2018-07-30 19:16:59

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

根据Amazon(https://aws.amazon.com/premiumsupport/knowledge-center/emr-file-system-s3/)的这份文档,我使用Spark处理Amazon EMR,它说Amazon EMR does not currently support use of the Apache Hadoop S3A file system, The s3a:// URI is not compatible with Amazon EMR
但是,我可以使用“ s3a://”在Spark作业中进行读写,而不会出现问题。 (注意:我正在使用"com.amazonaws" % "aws-java-sdk-s3" % "1.11.286",而EMR版本是emr-5.11.0)。我进行了一些搜索,但仍然发现自己对当前建议与EMR一起使用的文件系统感到困惑。
任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

编辑:忘记声明了这一点,但这是考虑到使用Spark版本2.3.0构建的。

AWS EMR具有可在Spark s3a,s3e和s3中使用的三个策略。 s3a和s3e是用于连接到可在AWS内外使用的环境的相对较旧的策略。而s3是专门为连接到s3的AWS EMR构建的策略。通过测试,我发现使用s3策略可以更快地进行读取和写入,并且与其他策略不同,您不需要通过用户/密码/密钥/库。唯一需要的是,当火花壳处于活动状态时,VPC中的用户可以访问铲斗和火花。以下是使用S3进行读写的方法:

spark-shell
///In this case I am reading a csv from a bucket called myBucket into the environment
val inputDF = spark.read.format("csv").option("header","true").load("s3://myBucket/fooBar.csv")
///I am then writing that file back out using the s3 policy back to the environment
inputDF.write.format("csv").save("s3://myBucket/ODS/")

读取来自Spark的负载时将看到的最大问题是分区,这意味着Spark决定在读取之前对object元素具有的分区是它将写入多少个零件文件。如果您想提高读写速度,则可能需要考虑实施重新分区策略。

导入org.apache.spark.util.SizeEstimator

val inputDF2 : Long = SizeEstimator.estimate(inputDF.rdd)
//find its appropiate number of partitions
val numPartitions : Long = (inputDF2/134217728) + 1
//write it out with that many partitions
val outputDF = inputDF.repartition(numPartitions.toInt)

答案 1 :(得分:1)

“ s3a”是Apache Hadoop的一部分,因此仍在EMR中可用。

EMR中推荐的s3客户端为EMRFS,因此您仍然可以使用s3a(Apache Hadoop)或s3 / s3n(EMRFS)中的任何一个。最后一个有自己的优势,例如一致的视图。