尝试使用本地 spark 从 s3 读取和写入 parquet 文件
Trying to read and write parquet files from s3 with local spark
我正在尝试使用 spark 从本地计算机读取镶木地板文件并将其写入 S3。但我似乎无法正确配置我的 spark 会话来这样做。显然需要进行一些配置,但我找不到关于如何进行配置的明确参考。
目前我的 spark 会话读取本地镶木地板模拟并定义如下:
val sparkSession = SparkSession.builder.master("local").appName("spark session example").getOrCreate()
要使用本地 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")
完成了。现在,您可以 Read/Write 一个 Parquet 文件到 S3。例如:
sparkSession.read.parquet("s3n://bucket/abc.parquet") //Read
df.write.parquet("s3n://bucket/xyz.parquet") //Write
希望对您有所帮助!
我将不得不稍微更正 himanshuIIITian 的 post,(抱歉)。
使用 s3a 连接器,而不是旧的、过时的、无人维护的 s3n。 S3A 是:更快,与较新的 S3 集群(首尔、法兰克福、伦敦……)一起工作,扩展性更好。 S3N 具有基本的性能问题,这些问题仅在最新版本的 Hadoop 中通过完全删除该连接器得到修复。继续前进。
您不能安全地将 s3 用作 Spark 查询的直接目标。,不能使用今天可用的经典 "FileSystem" 提交程序。写入您的本地文件://,然后使用 AWS CLI 界面复制数据。您将获得更好的性能以及您通常期望从 IO
获得的可靠写入保证
我正在尝试使用 spark 从本地计算机读取镶木地板文件并将其写入 S3。但我似乎无法正确配置我的 spark 会话来这样做。显然需要进行一些配置,但我找不到关于如何进行配置的明确参考。
目前我的 spark 会话读取本地镶木地板模拟并定义如下:
val sparkSession = SparkSession.builder.master("local").appName("spark session example").getOrCreate()
要使用本地 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")
完成了。现在,您可以 Read/Write 一个 Parquet 文件到 S3。例如:
sparkSession.read.parquet("s3n://bucket/abc.parquet") //Read
df.write.parquet("s3n://bucket/xyz.parquet") //Write
希望对您有所帮助!
我将不得不稍微更正 himanshuIIITian 的 post,(抱歉)。
使用 s3a 连接器,而不是旧的、过时的、无人维护的 s3n。 S3A 是:更快,与较新的 S3 集群(首尔、法兰克福、伦敦……)一起工作,扩展性更好。 S3N 具有基本的性能问题,这些问题仅在最新版本的 Hadoop 中通过完全删除该连接器得到修复。继续前进。
您不能安全地将 s3 用作 Spark 查询的直接目标。,不能使用今天可用的经典 "FileSystem" 提交程序。写入您的本地文件://,然后使用 AWS CLI 界面复制数据。您将获得更好的性能以及您通常期望从 IO
获得的可靠写入保证