如何从apachespark访问s3a://文件?

gc0ot86w  于 2021-06-02  发布在  Hadoop
关注(0)|答案(10)|浏览(491)

hadoop 2.6不支持s3a开箱即用,因此我尝试了一系列解决方案和修复,包括:
使用hadoop aws和aws java sdk部署=>无法读取凭据的环境变量add hadoop aws into maven=>各种可传递依赖冲突
有人成功地做到了这两个方面吗?

vojdkbi0

vojdkbi01#

正如你所说,Hadoop2.6不支持s3a,最新的spark版本1.6.1也不支持Hadoop2.7,但是spark 2.0绝对没有Hadoop2.7和s3a的问题。
对于spark1.6.x,我们做了一些肮脏的黑客,使用emr的s3驱动程序。。。你可以看看这个医生:https://github.com/zalando/spark-appliance#emrfs-支持
如果您仍然想尝试在spark 1.6.x中使用s3a,请参考以下答案:https://stackoverflow.com/a/37487407/5630352

ldioqlga

ldioqlga2#

还可以使用将s3a依赖项添加到类路径 spark-defaults.conf .
例子:

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 sdk版本与hadoop版本匹配即可。有关这方面的更多信息,请查看以下答案:无法使用spark 2.2访问s3数据

gpfsuwkq

gpfsuwkq3#

亲身体验了s3a和s3n之间的差异—在s3a上传输7.9gb的数据大约需要7分钟,而在s3n上传输7.9gb的数据需要73分钟[us-east-1到us-west-1不幸的是,在这两种情况下;红移和lambda在这个时候是us-east-1]这是一个非常重要的一块堆栈得到正确的,值得沮丧。
以下是截至2015年12月的关键部分:
您的spark群集将需要hadoop 2.x或更高版本。如果您使用了sparkec2安装脚本,并且可能没有使用它,那么使用1.0以外的东西的开关是指定 --hadoop-major-version 2 (在撰写本文时使用cdh 4.2)。
您将需要为最晚2.7.1(稳定版)的hadoop版本提供一个最新的aws java sdk库(在2014年作为1.7.4版构建):aws java sdk 1.7.4。据我所知,在1.10.8的特定awssdkjar中使用这个并没有破坏任何东西。
类路径上还需要hadoopaws2.7.1jar。这个jar包含类 org.apache.hadoop.fs.s3a.S3AFileSystem .
spark.properties 您可能需要如下设置:
spark.hadoop.fs.s3a.access.key=accesskey
spark.hadoop.fs.s3a.secret.key=秘钥
我已经在我写的一篇文章中更详细地描述了这个列表。此外,我已经涵盖了所有的例外情况,我击中了一路,我认为是什么原因,每一个以及如何解决他们。

dw1jzc5e

dw1jzc5e4#

使用与hadoop 2.6一起预构建的spark 1.4.1,通过将hadoop 2.7.1发行版中的hadoop aws和aws java sdk jar文件(位于hadoop 2.7.1的$hadoop\u home/share/hadoop/tools/lib下)添加到我的$spark\u home/conf/spark-env.sh文件中的spark\u classpath环境变量中,我可以让s3a://在部署到spark独立集群时工作。

zengzsys

zengzsys5#

我使用spark1.4.1和hadoop2.6预先构建的二进制文件来运行它,确保您将两者都设置为 spark.driver.extraClassPath 以及 spark.executor.extraClassPath 如果在集群上运行,请指向两个jar(hadoopaws和awsjavasdk),确保执行者可以访问集群上的jar文件。

yrefmtwq

yrefmtwq6#

以下是截至2016年10月在spark summit eu:apache spark和object stores上的详细信息。
重点
由于数据损坏的风险/经验,直接输出提交器已从spark 2.0中消失。
fileoutputcommitter上有一些设置可以减少重命名,但不能消除它们
我和一些同事一起做了一个o(1)提交者,依靠ApacheDynamo来提供我们需要的一致性。
要使用s3a,请正确设置类路径。
使用hadoop2.7.z;2.6.x有一些问题,hadoop-11571解决了这些问题。
spark-7481下有一个pr,把所有东西都放到你自己打造的spark发行版中。否则,请提供给二进制文件的人来做这项工作。
hadoop2.8将添加hadoop-11694的主要性能改进。
植入式广告:hdp2.5包含hadoop-11694的读性能端;spark和s3文档可能会引起人们的兴趣,尤其是调优选项。

yrdbyhpb

yrdbyhpb7#

我们将spark 1.6.1与mesos一起使用,并且我们从spark那里得到了很多关于s3的问题。我把答案归功于cfeduke。我做的一个小小的改变是在spark-defaults.conf文件中的spark.jar配置中添加maven坐标。我试过hadoop-aws:2.7.2 but 仍然有很多错误,所以我们回到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

谢谢你抽出时间来写你的文章。这很有帮助。

nukf8bse

nukf8bse8#

以下是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.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
fxnxkyjh

fxnxkyjh9#

我使用的是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中。

yduiuuwa

yduiuuwa10#

我写这个答案是为了在hadoop2.7.3上使用spark2.0.1中的s3a访问文件
复制aws jars( hadoop-aws-2.7.3.jar 以及 aws-java-sdk-1.7.4.jar )默认情况下,hadoop附带了
提示:如果jar的位置不确定?以特权用户身份运行find命令会有所帮助;命令可以是

find / -name hadoop-aws*.jar
  find / -name aws-java-sdk*.jar

进入包含所有spark jar的spark类路径
提示:我们不能直接指出位置(它必须在属性文件中),因为我想为发行版和linux风格提供一个通用的答案。spark类路径可以通过下面的find命令识别

find / -name spark-core*.jar

在spark-defaults.conf中

提示:(主要放在 /etc/spark/conf/spark-defaults.conf )


# 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.

包括jar( aws-java-sdk 以及 hadoop-aws )在 --driver-class-path 如果需要的话。

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

注:
在运行 find 阻止错误的命令权限被拒绝

相关问题