【问题标题】:Trying to read and write parquet files from s3 with local spark尝试使用本地火花从 s3 读取和写入镶木地板文件
【发布时间】:2018-05-19 00:50:41
【问题描述】:

我正在尝试使用 spark 将 parquet 文件从本地计算机读取和写入 S3。但我似乎无法正确配置我的 spark 会话来这样做。显然有一些配置要做,但我找不到关于如何做的明确参考。

目前我的 spark 会话读取本地镶木地板模拟,并定义如下:

val sparkSession = SparkSession.builder.master("local").appName("spark session example").getOrCreate()

【问题讨论】:

    标签: scala apache-spark amazon-s3 spark-dataframe


    【解决方案1】:

    我将不得不稍微更正一下himanshuIIITian的帖子,(对不起)。

    1. 使用 s3a 连接器,而不是旧的、过时的、未维护的 s3n。 S3A 是:速度更快,与较新的 S3 集群(首尔、法兰克福、伦敦……)一起使用,可扩展性更好。 S3N 存在基本性能问题,只有在最新版本的 Hadoop 中通过完全删除该连接器来修复这些问题。继续前进。

    2. 您不能安全地将 s3 用作 Spark 查询的直接目标,而不是使用当今可用的经典“文件系统”提交程序。写入您的本地文件://,然后使用 AWS CLI 界面复制数据。您将获得更好的性能以及您通常期望从 IO 获得的可靠写入保证

    【讨论】:

    • 你能更具体地谈谈你的第二个笔记吗?我不能安全地写入s3是​​什么意思?那么读取镶木地板文件呢?
    • 我的意思是,你不能将 S3 用作工作的直接目标,因为提交工作的代码假定它是一个带有 rename() 之类的文件系统,实际上它是一个需要自己提交的对象存储协议。读取文件:很好,但直接写入 S3。危险。见youtube.com/watch?v=BgHrff5yAQo
    【解决方案2】:

    要使用本地 Spark 从 S3 读取和写入 parquet 文件,您需要在 sbt 项目中添加以下 2 个依赖项-

    "com.amazonaws" % "aws-java-sdk" % "1.7.4"
    "org.apache.hadoop" % "hadoop-aws" % "2.7.3"
    

    我假设它是一个sbt 项目。如果是mvn,则添加以下依赖项-

    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk</artifactId>
        <version>1.7.4</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-aws</artifactId>
        <version>2.7.3</version>
    </dependency>
    

    然后你需要在sparkSession中设置S3凭证,像这样-

    val sparkSession = SparkSession.builder.master("local").appName("spark session example").getOrCreate()
    sparkSession.sparkContext.hadoopConfiguration.set("fs.s3n.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
    sparkSession.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "s3AccessKey")
    sparkSession.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "s3SecretKey")
    

    它完成了。现在,您可以将 Parquet 文件读/写到 S3。例如:

    sparkSession.read.parquet("s3n://bucket/abc.parquet")    //Read
    df.write.parquet("s3n://bucket/xyz.parquet")    //Write
    

    希望对你有帮助!

    【讨论】:

    • 我得到:AttributeError: 'SparkContext' object has no attribute 'hadoopConfiguration' 版本 2.3.1
    猜你喜欢
    • 2016-01-18
    • 2018-12-20
    • 2018-06-02
    • 2017-03-09
    • 2016-08-31
    • 1970-01-01
    • 2020-01-10
    • 2017-07-26
    • 2017-03-17
    相关资源
    最近更新 更多