我的问题有点similar to this one,但建议的解决方案并没有解决我的问题。
我有一个非常简单的火花作业,我想在本地运行,基本上,它只是从S3读取一个文件并从中创建一个数据帧。
当我在Amazon EC2
群集上运行我的代码时,一切正常,但是当我想在本地运行它时,我会收到此错误
Caught exception while loading path, returning empty data frame: No FileSystem for scheme: s3a
以下是我在EC2群集和本地运行代码时的差异:
当我在本地运行它时,我评论了所有提供的spark依赖性标记。
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.1.0</version>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.1.0</version>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.1.0</version>
<!--<scope>provided</scope>-->
</dependency>
另外,我将此添加到依赖项
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-aws</artifactId>
<version>3.0.0</version>
</dependency>
这就是我在本地和集群上创建spark会话的方式:
在群集上:
def getSparkSession(config: BaseConfig): SparkSession = {
val conf = new SparkConf()
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.set("spark.kryoserializer.buffer.mb","24")
config.getSparkConfig.foreach(x => conf.set(x._1, x._2))
val ss = SparkSession
.builder()
.config(conf)
.getOrCreate()
ss.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", config.awsAccessKeyId)
ss.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", config.awsSecretAccessKey)
ss
}
当我在本地运行时:
def getLocalSparkSession(config: BaseConfig): SparkSession = {
val warehouseLocation = new File("spark-warehouse").getAbsolutePath
val ss = SparkSession.builder()
.appName(this.getClass.getName)
.master("local")
.config("spark.sql.warehouse.dir", warehouseLocation)
.config("spark.sql.shuffle.partitions", "4")
.getOrCreate()
ss.sparkContext.setLogLevel("WARN")
ss.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", config.awsAccessKeyId)
ss.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", config.awsSecretAccessKey)
ss
}
P.S。我的spark-shell --version
显示它使用了火花版本2.2.1,但我认为我在EC2群集上的火花是旧版本(应该是2.0版本)
答案 0 :(得分:0)
不要混合hadoop-aws版本与Spark一起构建,它不起作用。您可能只是看到了这种情况的一个症状(在hadoop 2.7中,文件系统是自我注册的,但在hadoop-2.8 +中它显式地在hadoop-common的core-default.xml文件中注册。
理想情况下,您应该能够要求spark-hadoop-cloud
模块继续发布,但我不会在公开回购中看到它。
在此之前,计算出hadoop版本,将该版本的hadoop-aws模块添加到您的版本中,并使用fs.s3a设置(包括密钥)。