本地火花抱怨s3a架构

时间:2018-03-05 22:30:50

标签: apache-spark amazon-s3

我的问题有点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版本)

1 个答案:

答案 0 :(得分:0)

不要混合hadoop-aws版本与Spark一起构建,它不起作用。您可能只是看到了这种情况的一个症状(在hadoop 2.7中,文件系统是自我注册的,但在hadoop-2.8 +中它显式地在hadoop-common的core-default.xml文件中注册。

理想情况下,您应该能够要求spark-hadoop-cloud模块继续发布,但我不会在公开回购中看到它。

在此之前,计算出hadoop版本,将该版本的hadoop-aws模块添加到您的版本中,并使用fs.s3a设置(包括密钥)。