복붙노트

[HADOOP] 로컬 Hadoop 2.6 설치에서 S3 / S3n에 어떻게 액세스합니까?

HADOOP

로컬 Hadoop 2.6 설치에서 S3 / S3n에 어떻게 액세스합니까?

내 로컬 컴퓨터에서 Amazon EMR 클러스터를 재현하려고합니다. 이를 위해 2.6.0 버전의 최신 Hadoop 안정 버전을 설치했습니다. 이제 EMR 클러스터 내부에서 수행하는 것처럼 S3 버킷에 액세스하려고합니다.

core-site.xml에 aws 자격 증명을 추가했습니다.

<property>
  <name>fs.s3.awsAccessKeyId</name>
  <value>some id</value>
</property>

<property>
  <name>fs.s3n.awsAccessKeyId</name>
  <value>some id</value>
</property>

<property>
  <name>fs.s3.awsSecretAccessKey</name>
  <value>some key</value>
</property>

<property>
  <name>fs.s3n.awsSecretAccessKey</name>
  <value>some key</value>
</property>

참고 : 키에 슬래시가 있기 때문에 % 2F를 사용하여 이스케이프 처리했습니다.

버킷의 내용을 나열하려고하면 다음과 같이하십시오.

hadoop fs -ls s3://some-url/bucket/

이 오류가 발생합니다.

ls : 계획에 대한 FileSystem 없음 : s3

core-site.xml을 다시 편집하고 fs :

<property>
  <name>fs.s3.impl</name>
  <value>org.apache.hadoop.fs.s3.S3FileSystem</value>
</property>

<property>
  <name>fs.s3n.impl</name>
  <value>org.apache.hadoop.fs.s3native.NativeS3FileSystem</value>
</property>

이번에는 다른 오류가 발생합니다.

-ls: Fatal internal error
java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3.S3FileSystem not found
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2074)
        at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2578)
        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2591)

어떻게 든 원사 배포에는 S3을 읽을 수있는 필요한 항아리가 없다고 생각되지만 어디에서 가져올 수 있는지 잘 모릅니다. 이 방향의 모든 포인터는 크게 감사 할 것입니다.

해결법

  1. ==============================

    1.어떤 이유로, NativeS3FileSystem에 대한 구현을 포함하는 jar hadoop-aws- [version] .jar은 버전 2.6 및 2.7에서 기본적으로 hadoop 클래스 경로에 존재하지 않습니다. 따라서 $ HADOOP_HOME / etc / hadoop / hadoop-env.sh에있는 hadoop-env.sh에 다음 행을 추가하여 classpath에 추가하십시오.

    어떤 이유로, NativeS3FileSystem에 대한 구현을 포함하는 jar hadoop-aws- [version] .jar은 버전 2.6 및 2.7에서 기본적으로 hadoop 클래스 경로에 존재하지 않습니다. 따라서 $ HADOOP_HOME / etc / hadoop / hadoop-env.sh에있는 hadoop-env.sh에 다음 행을 추가하여 classpath에 추가하십시오.

    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/tools/lib/*
    

    그런데 다음을 사용하여 Hadoop의 클래스 경로를 확인할 수 있습니다.

    bin/hadoop classpath
    
  2. ==============================

    2.

    import os
    os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.amazonaws:aws-java-sdk:1.10.34,org.apache.hadoop:hadoop-aws:2.6.0 pyspark-shell'
    
    import pyspark
    sc = pyspark.SparkContext("local[*]")
    
    from pyspark.sql import SQLContext
    sqlContext = SQLContext(sc)
    
    hadoopConf = sc._jsc.hadoopConfiguration()
    myAccessKey = input() 
    mySecretKey = input()
    hadoopConf.set("fs.s3.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
    hadoopConf.set("fs.s3.awsAccessKeyId", myAccessKey)
    hadoopConf.set("fs.s3.awsSecretAccessKey", mySecretKey)
    
    df = sqlContext.read.parquet("s3://myBucket/myKey")
    
  3. ==============================

    3.@ Ashrith의 답변은 한 가지 수정으로 저에게 효과적이었습니다. 우분투에서 v2.6을 실행할 때 $ HADOOP_HOME 대신 $ HADOOP_PREFIX를 사용해야했습니다. 아마도 이것은 $ HADOOP_HOME이 사용되지 않는 것처럼 들리기 때문입니다.

    @ Ashrith의 답변은 한 가지 수정으로 저에게 효과적이었습니다. 우분투에서 v2.6을 실행할 때 $ HADOOP_HOME 대신 $ HADOOP_PREFIX를 사용해야했습니다. 아마도 이것은 $ HADOOP_HOME이 사용되지 않는 것처럼 들리기 때문입니다.

    HADOOP_CLASSPATH = $ HADOOP_CLASSPATH를 내 보냅니다. $ {HADOOP_PREFIX} / share / hadoop / tools / lib / *

    그런 말로하면, 내 컴퓨터에서 Homebrew를 통해 v2.6을 설치 한 적이 없다. 이 경우, 나는이 매우 냉담한 수출을 사용하고 있습니다 :

    HADOOP_CLASSPATH = $ HADOOP_CLASSPATH를 출력합니다. $ (brew --prefix hadoop) / libexec / share / hadoop / tools / lib / *

  4. ==============================

    4.이 문제를 해결하기 위해 위의 모든 것을 시도했는데 실패했습니다 (어쨌든 내 환경 용).

    이 문제를 해결하기 위해 위의 모든 것을 시도했는데 실패했습니다 (어쨌든 내 환경 용).

    그러나 나는 위에서 언급 한 두 개의 jar 파일을 도구 디렉토리에서 common / lib로 복사함으로써 작동시킬 수있었습니다.

    그 후 잘 했어.

  5. ==============================

    5.HDP 2.x 이상을 사용하는 경우 Ambari의 MapReduce2 구성 설정에서 다음 속성을 수정 해 볼 수 있습니다.

    HDP 2.x 이상을 사용하는 경우 Ambari의 MapReduce2 구성 설정에서 다음 속성을 수정 해 볼 수 있습니다.

    mapreduce.application.classpath

    기존 문자열의 끝에 다음 값을 추가하십시오.

    /usr/hdp/${hdp.version}/hadoop-mapreduce/*

  6. from https://stackoverflow.com/questions/28029134/how-can-i-access-s3-s3n-from-a-local-hadoop-2-6-installation by cc-by-sa and MIT license