복붙노트

[HADOOP] Hadoop 2.4.1 및 Hadoop 용 Google Cloud Storage 커넥터

HADOOP

Hadoop 2.4.1 및 Hadoop 용 Google Cloud Storage 커넥터

Google의 Cloud Storage Connector for Hadoop을 사용하여 Hadoop에서 Oryx를 실행하려고합니다. https://cloud.google.com/hadoop/google-cloud-storage-connector

Oryx와 함께 Hadoop 2.4.1을 사용하는 것을 선호하므로 Google 컴퓨팅 엔진에서 생성하는 hadoop 클러스터에 대해 hadoop2_env.sh 설정을 사용합니다.

.bdutil -b <BUCKET_NAME> -n 2 --env_var_files hadoop2_env.sh \
--default_fs gs --prefix <PREFIX_NAME> deploy

hadoop을 사용하여 오릭스를 실행하려고 할 때 두 가지 주요 문제에 직면합니다.

1) 내 hadoop conf 디렉토리가 컴퓨팅 엔진에 Google 설치에 필요한 것과 일치하는지 확인했지만 다음과 같습니다.

$ echo $HADOOP_CONF_DIR
/home/hadoop/hadoop-install/etc/hadoop

여전히 무언가가 / conf 디렉토리를 찾고 있음을 발견합니다.

Caused by: java.lang.IllegalStateException: Not a directory: /etc/hadoop/conf

내 이해는 ../etc/hadoop이 / conf 디렉토리 여야한다는 것입니다. hadoop : 구성 파일

그리고 변경할 필요는 없지만이 문제는 구성 파일을 새로 만든 디렉토리 (예 :

sudo mkdir /etc/hadoop/conf
sudo cp /home/hadoop/hadoop-install/etc/hadoop/* /etc/hadoop/conf

왜 이럴까요? 이것은 구글 hadoop 커넥터를 사용한 결과입니까?

2) 위의 문제를 "해결"한 후 hadoop 클러스터와 Google 파일 시스템 간의 통신과 관련이있는 추가 오류가 있습니다.

2014 년 10 월 1 일 20:18:30 UTC 경고 해당하는 경우 내장 Java 클래스를 사용하여 플랫폼에 대한 네이티브 하둡 라이브러리를로드 할 수 없습니다

수 10 월 01 일 20:18:30 UTC 2014 정보 네임 스페이스 접두사 : hdfs : // BUCKET_NAME

수 10 월 01 일 20:18:30 UTC 2014 심각 실행 중 예기치 않은 오류 java.lang.ExceptionInInitializerError     com.cloudera.oryx.common.servcomp.StoreUtils.listGenerationsForInstance (StoreUtils.java:50)에서     com.cloudera.oryx.computation.PeriodicRunner.run (PeriodicRunner.java:173)에서     java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:471)에서     java.util.concurrent.FutureTask.runAndReset (FutureTask.java:304)에서     java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301 (ScheduledThreadPoolExecutor.java:178)에서     java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run (ScheduledThreadPoolExecutor.java:293)에서     java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145)에서     java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:615)에서     java.lang.Thread.run (Thread.java:745)에서 원인 : java.lang.IllegalArgumentException : java.net.UnknownHostException : 저항 예측     org.apache.hadoop.security.SecurityUtil.buildTokenService (SecurityUtil.java:373)에서     org.apache.hadoop.hdfs.NameNodeProxies.createNonHAProxy (NameNodeProxies.java:258)에서     org.apache.hadoop.hdfs.NameNodeProxies.createProxy (NameNodeProxies.java:153)에서     org.apache.hadoop.hdfs.DFSClient에서. (DFSClient.java:602)     org.apache.hadoop.hdfs.DFSClient에서. (DFSClient.java:547)     org.apache.hadoop.hdfs.DistributedFileSystem.initialize (DistributedFileSystem.java:139)에서     org.apache.hadoop.fs.FileSystem.createFileSystem (FileSystem.java:2591)에서     org.apache.hadoop.fs.FileSystem.access $ 200 (FileSystem.java:89)에서     org.apache.hadoop.fs.FileSystem $ Cache.getInternal (FileSystem.java:2625)에서     org.apache.hadoop.fs.FileSystem $ Cache.get (FileSystem.java:2607)에서     org.apache.hadoop.fs.FileSystem.get (FileSystem.java:368)에서     com.cloudera.oryx.common.servcomp.Store. (Store.java:76)에서     com.cloudera.oryx.common.servcomp.Store. (Store.java:57)에서     ... 9 개 더

원인 : java.net.UnknownHostException : BUCKET_NAME     ... 22 더보기

나에게 관련이있는 것은 기본 파일 시스템을 gs : //로 설정하면 네임 스페이스 접두사가 hdfs : //라는 것입니다.

아마도 이것이 UnknownHostException으로 이어지고 있습니까?

hadoop 클러스터가 Google 파일 시스템에 연결되어 있는지 확인했습니다 (예 :     하둡 fs -ls 내 Google 클라우드 버킷의 내용과 gs : // BUCKET_NAME 디렉토리의 모든 예상 내용을 산출합니다. 그러나 나는 hadoop 커넥터를 통한 hadoop의 Google 표시와 익숙하지 않은 일반적인 방법으로 hadoop 클러스터가 실행 중인지 확인합니다.     jps 수율 만     6440 Jps 모든 노드를 나열하는 대신 그러나 hadoop 클러스터의 마스터 노드 (예 : PREFIX_NAME-m) 에서이 명령을 실행 중이며 hadoop에 Google 클라우드 저장소 커넥터를 사용할 때 예상되는 출력을 확신하지 못합니다.

그렇다면 어떻게 이러한 오류를 해결하고 내 oryx 작업 (hadoop을 통해)이 내 gs : // BUCKET_NAME 디렉토리의 데이터에 성공적으로 액세스하도록 할 수 있습니까?

통찰력이나 제안에 미리 감사드립니다.

최신 정보: 매우 상세한 답변에 감사드립니다. 해결 방법으로 다음을 변경하여 gs : //를 oryx로 "하드 코딩"했습니다.

  prefix = "hdfs://" + host + ':' + port;
} else {
  prefix = "hdfs://" + host;

에:

  prefix = "gs://" + host + ':' + port;
} else {
  prefix = "gs://" + host;

이제 다음과 같은 오류가 발생합니다.

화요일 10 월 14 일 20:24:50 UTC 2014 심각 실행에 예기치 않은 오류가 발생했습니다. java.lang.ExceptionInInitializerError com.cloudera.oryx.common.servcomp.StoreUtils.listGenerationsForInstance (StoreUtils.java:50)에서         com.cloudera.oryx.computation.PeriodicRunner.run (PeriodicRunner.java:173)에서         java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:471)에서         java.util.concurrent.FutureTask.runAndReset (FutureTask.java:304)에서         java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301 (ScheduledThreadPoolExecutor.java:178)에서         java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run (ScheduledThreadPoolExecutor.java:293)에서         java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145)에서         java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:615)에서         java.lang.Thread.run (Thread.java:745)에서

원인 : java.lang.RuntimeException : java.lang.ClassNotFoundException : 클래스 com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem을 찾을 수 없음         org.apache.hadoop.conf.Configuration.getClass (Configuration.java:1905)에서         org.apache.hadoop.fs.FileSystem.getFileSystemClass (FileSystem.java:2573)에서         org.apache.hadoop.fs.FileSystem.createFileSystem (FileSystem.java:2586)에서         org.apache.hadoop.fs.FileSystem.access $ 200 (FileSystem.java:89)에서         org.apache.hadoop.fs.FileSystem $ Cache.getInternal (FileSystem.java:2625)에서         org.apache.hadoop.fs.FileSystem $ Cache.get (FileSystem.java:2607)에서         org.apache.hadoop.fs.FileSystem.get (FileSystem.java:368)에서         com.cloudera.oryx.common.servcomp.Store. (Store.java:76)에서         com.cloudera.oryx.common.servcomp.Store. (Store.java:57)에서

여기 지침에 따라 https://cloud.google.com/hadoop/google-cloud-storage-connector#classpath 커넥터 항아리를 Hadoop의 클래스 경로에 추가했다고 생각합니다. 나는 덧붙였다 :

HADOOP_CLASSPATH=$HADOOP_CLASSPATH:'https://storage.googleapis.com/hadoop-lib/gcs/gcs-connector-1.2.9-hadoop2.jar 

/home/rich/hadoop-env-setup.sh로 이동하십시오. 그리고 (echo $ HADOOP_CLASSPATH) 수율 :

/contrib/capacity-scheduler/.jar:/home/hadoop/hadoop-install/share/hadoop/common/lib/gcs-connector-1.2.9-hadoop2.jar:/contrib/capacity-scheduler/.jar:/home/hadoop/hadoop-install/share/hadoop/common/lib/gcs-connector-1.2.9-hadoop2.jar

수업 경로에 더 추가해야합니까?

또한 export 명령을 사용해도 / etc / hadoop / conf에 대한 오류가 여전히 발생합니다. 임시 해결 방법으로 sudo mkdir / etc / hadoop / conf를 사용했습니다. 추가 문제가 발생할 수 있으므로 여기에 언급합니다.

해결법

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

    1.몇 가지 문제가있는 것 같습니다. 첫 번째는 일반적으로 hadoop jar로 작업을 실행할 때 hadoop이 다양한 시스템 환경 변수 및 클래스 경로 등을 실행중인 프로그램에 삽입한다는 것입니다. 귀하의 경우, Oryx는 hadoop jar을 사용하지 않고 다음과 같은 것을 사용하기 때문에 실행됩니다.

    몇 가지 문제가있는 것 같습니다. 첫 번째는 일반적으로 hadoop jar로 작업을 실행할 때 hadoop이 다양한 시스템 환경 변수 및 클래스 경로 등을 실행중인 프로그램에 삽입한다는 것입니다. 귀하의 경우, Oryx는 hadoop jar을 사용하지 않고 다음과 같은 것을 사용하기 때문에 실행됩니다.

    java -Dconfig.file=oryx.conf -jar computation/target/oryx-computation-x.y.z.jar
    

    그러면 $ HADOOP_CONF_DIR은 실제로 환경으로 만들지 않으므로 OryxConfiguration.java의 System.getenv가 선택하지 못하고 기본 / etc / hadoop / conf 값을 사용합니다. 이것은 export 명령으로 간단히 해결되며, 하위 명령으로 만들어 졌는지 확인하여 테스트 할 수 있습니다.

    echo $HADOOP_CONF_DIR
    bash -c 'echo $HADOOP_CONF_DIR'
    export HADOOP_CONF_DIR
    bash -c 'echo $HADOOP_CONF_DIR'
    java -Dconfig.file=oryx.conf -jar computation/target/oryx-computation-x.y.z.jar
    

    두 번째로 더 불행한 문제는 Oryx가 사용자가 설정 한 파일 시스템 체계를 허용하는 대신 'hdfs'를 하드 코딩하는 것 같습니다.

    private Namespaces() {
      Config config = ConfigUtils.getDefaultConfig();
      boolean localData;
      if (config.hasPath("model.local")) {
        log.warn("model.local is deprecated; use model.local-data");
        localData = config.getBoolean("model.local");
      } else {
        localData = config.getBoolean("model.local-data");
      }
      if (localData) {
        prefix = "file:";
      } else {
        URI defaultURI = FileSystem.getDefaultUri(OryxConfiguration.get());
        String host = defaultURI.getHost();
        Preconditions.checkNotNull(host,
            "Hadoop FS has no host? Did you intent to set model.local-data=true?");
        int port = defaultURI.getPort();
        if (port > 0) {
          prefix = "hdfs://" + host + ':' + port;
        } else {
          prefix = "hdfs://" + host;
        }
      }
      log.info("Namespace prefix: {}", prefix);
    }
    

    그것은 모두 Oryx가 미래에 다른 파일 시스템 체계에 대한 지원을 추가 할 것인지에 달려 있지만 그 동안 Oryx 코드를 직접 변경하고 다시 컴파일해야하거나 해킹을 시도 할 수 있습니다 (그러나 조각의 가능성이 있음) HDFS에 의존하지 않는 Oryx의 실패).

    Oryx 로의 변경은 이론적으로 다음과 같아야합니다.

        String scheme = defaultURI.getScheme();
        if (port > 0) {
          prefix = scheme + "://" + host + ':' + port;
        } else {
          prefix = scheme + "://" + host;
        }
    

    그러나이 경로를 사용하는 경우 다단계 워크 플로우가 이전 단계의 모든 출력을 즉시 찾기 위해 "목록"조작에 의존해서는 안되는 GCS의 최종 목록 일관성 의미론을 명심하십시오. 오릭스는 그러한 의존성을 가질 수도 있고 그렇지 않을 수도 있습니다.

    귀하의 경우 가장 안정적인 솔루션은 --default_fs hdfs를 사용하여 배포하는 것입니다. 여기서 bdutil은 gcs-connector를 설치하여 hadoop distcp를 실행하여 데이터를 GCS에서 HDFS로 일시적으로 이동하고 Oryx를 실행 한 다음 완료되면 을 다시 GCS로 복사하십시오.

  2. from https://stackoverflow.com/questions/26150155/hadoop-2-4-1-and-google-cloud-storage-connector-for-hadoop by cc-by-sa and MIT license