Hadoop 2.6不支持开箱即用的s3a,所以我尝试了一系列解决方案和修复,包括:
使用hadoop-aws和aws-java-sdk =>进行部署无法读取凭据的环境变量 将hadoop-aws添加到maven =>各种传递性依赖冲突
有没有人成功同时工作?
答案 0 :(得分:40)
亲身经历了s3a和s3n之间的差异 - 在s3a上传输的7.9GB数据大约是7分钟,而s3n上的7.9GB数据需要73分钟[不幸的是,我们 - 东 - 1到us-west-1两种情况; Redshift和Lambda在这个时候是us-east-1]这是一个非常重要的堆栈,以便得到正确的,并且值得沮丧。
截至2015年12月,以下是关键部分:
您的Spark群集需要Hadoop 2.x或更高版本。如果你使用Spark EC2设置脚本并且可能错过了它,那么使用1.0以外的东西的开关是指定--hadoop-major-version 2
(在撰写本文时使用CDH 4.2)。
您需要在最初的2.7.1版本的Hadoop版本中包含最初可能是过时的AWS SDK库(2014年版本为1.7.4)。 ):aws-java-sdk 1.7.4。据我所知,使用它以及1.10.8的特定AWS SDK JAR没有破坏任何东西。
您还需要类路径上的hadoop-aws 2.7.1 JAR。此JAR包含类org.apache.hadoop.fs.s3a.S3AFileSystem
。
在spark.properties
中,您可能需要一些如下所示的设置:
spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.access.key=ACCESSKEY
spark.hadoop.fs.s3a.secret.key=SECRETKEY
我在post I wrote上详细详细列出了这个列表,因为我正在通过这个过程。此外,我已经介绍了我遇到的所有异常情况,以及我认为是每种情况的原因以及如何解决它们。
答案 1 :(得分:13)
我使用带有hadoop 2.6的Spark 1.4.1预构建二进制文件
确保将spark.driver.extraClassPath
和spark.executor.extraClassPath
都指向两个罐子(hadoop-aws和aws-java-sdk)
如果在群集上运行,请确保执行程序可以访问群集上的jar文件。
答案 2 :(得分:13)
我正在编写此答案,以便在 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
进入 spark classpath ,其中包含所有火花罐
提示:我们无法直接指向位置(它必须位于属性文件中),因为我希望对发行版和Linux版本进行通用回答。 spark classpath 可以通过下面的find命令识别
find / -name spark-core*.jar
提示:(通常会将其放在spark-defaults.conf
)
/etc/spark/conf/spark-defaults.conf
如果需要, in spark submit会在#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.
中包含jars(aws-java-sdk
和hadoop-aws
)。
--driver-class-path
注意:强>
在运行之前确保具有读取权限的Linux用户
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
命令用于防止错误权限被拒绝
答案 3 :(得分:9)
我们正在使用带有Mesos的spark 1.6.1,并且我们从spark写入S3时遇到了很多问题。我赞同cfeduke的答案。我做的微小改动是将maven坐标添加到spark-defaults.conf文件中的spark.jar配置中。我尝试使用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.impl org.apache.hadoop.fs.s3a.S3AFileSystem
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
感谢cfeduke花时间写你的帖子。这非常有帮助。
答案 4 :(得分:7)
以下是截至2016年10月的细节,如Spark Summit EU所示:Apache Spark and Object Stores。
关键点
产品展示:HADOOP-11694的读取性能方面包含在HDP2.5中; Spark and S3 documentation可能会引起人们的兴趣 - 特别是调整选项。
答案 5 :(得分:4)
使用预先构建的Hadoop 2.6的Spark 1.4.1,通过从Hadoop添加hadoop-aws和aws-java-sdk jar文件,我可以在部署到Spark Standalone集群时使s3a://工作2.7.1发行版(在Hadoop 2.7.1的$ HADOOP_HOME / share / hadoop / tools / lib下找到)到我的$ SPARK_HOME / conf / spark-env.sh文件中的SPARK_CLASSPATH环境变量。
答案 6 :(得分:4)
正如你所说,hadoop 2.6并不支持s3a,而最新的spark 1.6.1并不支持hadoop 2.7,但是对于hadoop 2.7和s3a来说,spark 2.0绝对没问题。
对于spark 1.6.x,我们用EMR的s3驱动程序做了一些肮脏的黑客攻击......你可以看一下这个文档:https://github.com/zalando/spark-appliance#emrfs-support
如果您仍想尝试在spark 1.6.x中使用s3a,请参阅此处的答案:https://stackoverflow.com/a/37487407/5630352
答案 7 :(得分:2)
您还可以使用spark-defaults.conf
将S3A依赖项添加到类路径中。
示例:
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
确保将您的AWS开发工具包版本与Hadoop版本相匹配。有关此问题的更多信息,请查看以下答案:Unable to access S3 data using Spark 2.2
答案 8 :(得分:2)
这是pyspark(可能带代理)的解决方案:
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.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
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
答案 9 :(得分:-1)
我正在使用spark版本2.3,当我使用spark保存数据集时:
dataset.write().format("hive").option("fileFormat", "orc").mode(SaveMode.Overwrite)
.option("path", "s3://reporting/default/temp/job_application")
.saveAsTable("job_application");
它完美运行并将我的数据保存到s3中。