Hadoop 如何从ApacheSpark访问s3a://文件?
Hadoop 2.6不支持即时可用的s3a,因此我尝试了一系列解决方案和修复,包括: 使用hadoop aws和aws java sdk部署=>无法读取环境变量的凭据 将hadoop aws添加到maven=>各种可传递的依赖冲突中Hadoop 如何从ApacheSpark访问s3a://文件?,hadoop,apache-spark,amazon-s3,Hadoop,Apache Spark,Amazon S3,Hadoop 2.6不支持即时可用的s3a,因此我尝试了一系列解决方案和修复,包括: 使用hadoop aws和aws java sdk部署=>无法读取环境变量的凭据 将hadoop aws添加到maven=>各种可传递的依赖冲突中 有人成功地使这两个都工作了吗?使用Hadoop 2.6预构建的Spark 1.4.1,我可以通过添加Hadoop 2.7.1发行版中的Hadoop aws和aws java sdk jar文件(在Hadoop 2.7.1的$Hadoop_HOME/share/Had
有人成功地使这两个都工作了吗?使用Hadoop 2.6预构建的Spark 1.4.1,我可以通过添加Hadoop 2.7.1发行版中的Hadoop aws和aws java sdk jar文件(在Hadoop 2.7.1的$Hadoop_HOME/share/Hadoop/tools/lib下找到)使s3a://在部署到Spark独立集群时工作到$SPARK\u HOME/conf/SPARK-env.sh文件中的SPARK\u CLASSPATH环境变量。我使用了带hadoop 2.6的SPARK 1.4.1预构建二进制文件 确保将
spark.driver.extraClassPath
和spark.executor.extraClassPath
都设置为指向两个JAR(hadoop aws和aws java sdk)
如果您在集群上运行,请确保您的执行者能够访问集群上的jar文件。亲身体验了s3a和s3n之间的差异,s3a上传输的7.9GB数据大约需要7分钟,而s3n上传输的7.9GB数据需要73分钟[us-east-1到us-west-1不幸的是,在这两种情况下;红移和Lambda此时都是us-east-1]这是非常重要的一部分,需要纠正,值得沮丧 以下是截至2015年12月的关键部分:
--Hadoop主要版本2
(在撰写本文时使用CDH 4.2)
org.apache.hadoop.fs.s3a.S3AFileSystem
spark.properties
中,您可能需要如下设置:
spark.hadoop.fs.s3a.access.key=ACCESSKEY spark.hadoop.fs.s3a.secret.key=SECRETKEY
s3..amazonaws.com
)
--conf“spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true
--conf“spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true
我在一个网站上更详细地介绍了这个列表,因为我在这个过程中一直在努力。此外,我还介绍了我在这个过程中遇到的所有异常情况,以及我认为每种情况的原因和解决方法。我们在Mesos上使用了spark 1.6.1,我们从spark那里收到了很多问题。我要感谢cfeduke为了回答这个问题,我做了一个小小的改变,就是在spark-defaults.conf文件中的spark.jar配置中添加了maven坐标。我尝试使用hadoop aws:2.7.2,但仍然出现很多错误,所以我们回到了2.7.1。下面是spark-defaults.conf中对我们有效的更改:
spark.jars.packages net.java.dev.jets3t:jets3t:0.9.0,com.google.guava:guava:16.0.1,com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.1
spark.hadoop.fs.s3a.access.key <MY ACCESS KEY>
spark.hadoop.fs.s3a.secret.key <MY SECRET KEY>
spark.hadoop.fs.s3a.fast.upload true
spark.jars.packages.net.java.dev.jets3t:jets3t:0.9.0,com.google.guava:guava:16.0.1,com.amazonaws:aws java sdk:1.7.4,org.apache.hadoop:hadoop aws:2.7.1
spark.hadoop.fs.s3a.access.key
spark.hadoop.fs.s3a.secret.key
spark.hadoop.fs.s3a.fast.upload true
感谢您抽出时间撰写您的帖子。这非常有帮助。正如您所说,hadoop 2.6不支持s3a,最新的spark 1.6.1版本不支持hadoop 2.7,但spark 2.0与hadoop 2.7和s3a绝对没有问题 对于spark 1.6.x,我们使用来自EMR的s3驱动程序进行了一些肮脏的攻击…您可以查看以下文档:
如果您仍想尝试在spark 1.6.x中使用s3a,请参阅此处的答案:以下是截至2016年10月的详细信息,如spark Summit EU所示: 要点
- 由于存在数据损坏的风险/经验,直接输出提交人不再使用Spark 2.0
- FileOutputCommitter上有一些设置可以减少重命名,但不能消除重命名
- 我正在和一些同事一起做一个O(1)提交者,依靠ApacheDynamo为我们提供我们需要的一致性
- 要使用S3a,请正确设置类路径
- 在Hadoop2.7.z上;2.6.x有一些问题,这些问题在那时已经解决了
- SPARK-7481下有一个PR,可以把所有东西都放到你自己构建的SPARK发行版中。否则,请提供二进制文件的人来完成这项工作
- Hadoop2.8将添加主要的性能改进
产品植入:HDP2.5中包含了HADOOP-11694的读取性能方面;其中可能有令人感兴趣的部分-尤其是调谐选项。我写这个答案是为了从HADOOP 2.7.3上的Spark 2.0.1访问带有S3A的文件 复制默认情况下随hadoop附带的AWS jar(
hadoop-AWS-2.7.3.jar
和AWS-java-sdk-1.7.4.jar
)
- 提示:如果jar位置不确定?以特权用户身份运行find命令会很有帮助;命令可以
find / -name hadoop-aws*.jar find / -name aws-java-sdk*.jar
- 提示:我们不能直接指出位置(它必须在属性文件中),因为我想为发行版和Linux版本提供一个通用的答案。spark类路径可以
find / -name spark-core*.jar
#make sure jars are added to CLASSPATH spark.yarn.jars=file://{spark/home/dir}/jars/*.jar,file://{hadoop/install/dir}/share/hadoop/tools/lib/*.jar spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem spark.hadoop.fs.s3a.access.key={s3a.access.key} spark.hadoop.fs.s3a.secret.key={s3a.secret.key} #you can set above 3 properties in hadoop level `core-site.xml` as well by removing spark prefix.
spark-submit --master yarn \ --driver-class-path {spark/jars/home/dir}/aws-java-sdk-1.7.4.jar \ --driver-class-path {spark/jars/home/dir}/hadoop-aws-2.7.3.jar \ other options
spark.driver.extraClassPath /usr/local/spark/jars/hadoop-aws-2.7.5.jar spark.executor.extraClassPath /usr/local/spark/jars/hadoop-aws-2.7.5.jar spark.driver.extraClassPath /usr/local/spark/jars/aws-java-sdk-1.7.4.jar spark.executor.extraClassPath /usr/local/spark/jars/aws-java-sdk-1.7.4.jar
spark.jars /usr/local/spark/jars/hadoop-aws-2.7.5.jar,/usr/local/spark/jars/aws-java-sdk-1.7.4.jar
def _configure_s3_protocol(spark, proxy=props["proxy"]["host"], port=props["proxy"]["port"], endpoint=props["s3endpoint"]["irland"]): """ Configure access to the protocol s3 https://sparkour.urizone.net/recipes/using-s3/ AWS Regions and Endpoints https://docs.aws.amazon.com/general/latest/gr/rande.html """ sc = spark.sparkContext sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", os.environ.get("AWS_ACCESS_KEY_ID")) sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", os.environ.get("AWS_SECRET_ACCESS_KEY")) sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.host", proxy) sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.port", port) sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", endpoint) return spark
dataset.write().format("hive").option("fileFormat", "orc").mode(SaveMode.Overwrite) .option("path", "s3://reporting/default/temp/job_application") .saveAsTable("job_application");