Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何从spark2.3(使用hadoop aws 2.7)访问us-east-2区域的拼花地板文件_Apache Spark_Hadoop_Amazon S3 - Fatal编程技术网

Apache spark 如何从spark2.3(使用hadoop aws 2.7)访问us-east-2区域的拼花地板文件

Apache spark 如何从spark2.3(使用hadoop aws 2.7)访问us-east-2区域的拼花地板文件,apache-spark,hadoop,amazon-s3,Apache Spark,Hadoop,Amazon S3,我们可以从当前代码访问us-east-1,但无法访问us-east-2上的拼花地板文件。 请注意“us-east-2”连接,创建datafream在intellij上运行良好,但当我们尝试使用spark shell时会出现400错误 我想在spark shell上做些工作 /Users/test/Downloads/spark-2.3.3-bin-hadoop2.7/bin/spark-shell--jars/Users/test/Downloads/hadoop-aws-2.7.3.jar、/

我们可以从当前代码访问us-east-1,但无法访问us-east-2上的拼花地板文件。 请注意“us-east-2”连接,创建datafream在intellij上运行良好,但当我们尝试使用spark shell时会出现400错误

我想在spark shell上做些工作

/Users/test/Downloads/spark-2.3.3-bin-hadoop2.7/bin/spark-shell--jars/Users/test/Downloads/hadoop-aws-2.7.3.jar、/Users/test/Downloads/aws-java-sdk-1.7.4.jar

val配置=sc.hadoopConfiguration

set(“fs.s3a.impl.disable.cache”、“true”)

set(“fs.s3a.impl”、“org.apache.hadoop.fs.s3a.S3AFileSystem”)

set(“fs.defaultFS”,“s3a://parquet-dev”)

set(“fs.s3a.endpoint”、“s3.us-east-2.amazonaws.com”)

set(“fs.s3a.access.key”,“xyz”)

set(“fs.s3a.secret.key”、“abc”)

val fileName=“s3a://xyz:abc@parquet-dev/c000.snappy.镶木地板“

val df=spark.sqlContext.read.parquet(文件名)

com.amazonaws.services.s3.model.amazons3异常:状态代码:400,AWS服务:Amazon s3,AWS请求ID:asadfas,AWS错误代码:null,AWS错误消息:错误请求

  • fs.s3a.endpoint是正确的选项;我刚刚验证了它在Hadoop 2.7中
  • 你不应该把秘密放在文件名URL中,因为它们到处都会被记录
  • 您不需要设置
    fs.defaultFS
    fs.s3a.impl
  • “坏请求”是来自amazon的一个相当模糊的错误,它意味着某种身份验证问题,没有任何细节。您可能需要切换到V4签名,这只能通过JVM属性使用hadoop-2.7.x/AWS-1.7.x JAR来完成。其他堆栈溢出帖子也涵盖了这个主题


    如果您试图通过S3A连接器使用S3,那么最好先升级到Hadoop 2.9 JARs和shaded AWS SDK,或者至少升级到2.8.x。hadoop aws代码发生了巨大的变化,更为流行的aws SDK也带来了巨大的变化

    这是一个简单的变化,但在aws文档或任何其他地方都很难找到

    下面是我们所做的更改(可以完成特定于语言的代码)

    很少有新的s3存储桶只支持签名版本v4支持,除非您指定,否则旧的SDK无法使用

    System.getProperty(“com.amazonaws.services.s3.enableV4”) sc.hadoopConfiguration.set(“fs.s3a.endpoint”、“s3.us-east-2.amazonaws.com”)

    --conf'spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true' --conf'spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true'

    System.getProperty(“com.amazonaws.services.s3.enableV4”)非常重要,必须通过指定上述标志为所有excutor JVM设置。
    谢谢

    我已经解决了,几乎和你说的一样。下面是更多的细节作为答案。我很高兴事情进展顺利,但仍然认为你应该升级到hadoop 2.8.x或更高版本来读取拼花地板或ORC数据。为了改进那些文件读取所采用的随机IO读取模式,进行了大量的工作,特别的随机IO模式fs.s3a.experimental.input.fadvise=random明显更快。在Hadoop2.7中,每当您的客户端执行大的向前或向后操作时,都会看到整个HTTP连接被中止,并协商一个新的连接。
    spark-shell \
        --master local[4] \
        --driver-memory 2g \
        --conf 'spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true' \
        --conf 'spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true' \
        --jars aws-java-sdk-1.7.4.jar,hadoop-aws-2.7.7.jar
    
    
    System.getProperty("com.amazonaws.services.s3.enableV4")
    
    sc.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem");
    sc.hadoopConfiguration.set("fs.s3a.access.key", "access")
    sc.hadoopConfiguration.set("fs.s3a.secret.key", "secret")
    sc.hadoopConfiguration.set("fs.s3a.endpoint", "s3.us-east-2.amazonaws.com")
    
    val fileName = "s3a://parquet123/c000.parquet"
    val df = spark.sqlContext.read.parquet(fileName)
    df.count