복붙노트

[HADOOP] 하이브는 distcp로 디렉토리 이동 프로세스를 덮어 씁니까?

HADOOP

하이브는 distcp로 디렉토리 이동 프로세스를 덮어 씁니까?

하이브에서 INSERT OVERWRITE DIRECTORY 쿼리를 실행하면 .hivexxxx 준비 폴더에 결과를 저장 한 다음 그 파일을 디렉터리로 이동하는 것처럼 보입니다.

지도 축소 프로세스가 끝나면 다음과 같이 표시됩니다.

Moving data to: hdfs://nameservice1/user/events/Click2/.hive-staging_hive_2015-11-21_08-32-49_909_6034680686432863037-1/-ext-10000
Moving data to: /user/events/Click2

이 이동 프로세스가 실제로 느리게 실행되고 distcp를 사용하지 않는 것 같습니다.

해당 프로세스 중에 distcp를 사용하도록 하이브를 설정하는 방법이 있습니까? 아니면 해당 스테이징 서버에 데이터를 넣지 않도록 설정하는 방법이 있습니까? 그 스테이징 폴더에 요점이 보이지 않습니다 ...

해결법

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

    1.HDFS 연합을 사용하고 있고 작업의 .staging * dir을 대상 디렉토리와 다른 FS / 네임 스페이스에 배치하도록 하이브를 구성하지 않은 경우 (기본 설정으로는 거의 발생하지 않을 것입니다) 하이브가 distcp를하기를 원하지 않습니다. 문제는 하이브가 현재 수행하고있는 작업은 .staging dir의 모든 출력 파일을 최종 대상 디렉토리에 복사하고 distcp를 사용하여 동일한 작업을 수행한다는 것입니다 - 복사 - 전체 mapreduce 작업을 생성하는 오버 헤드 모든 파일 (하이브 1.1에서 보았던 동작) 때문에 성능이 훨씬 나빠질 수 있습니다. 가능한 예외는 출력 파일이 대단히 크다면 ...

    HDFS 연합을 사용하고 있고 작업의 .staging * dir을 대상 디렉토리와 다른 FS / 네임 스페이스에 배치하도록 하이브를 구성하지 않은 경우 (기본 설정으로는 거의 발생하지 않을 것입니다) 하이브가 distcp를하기를 원하지 않습니다. 문제는 하이브가 현재 수행하고있는 작업은 .staging dir의 모든 출력 파일을 최종 대상 디렉토리에 복사하고 distcp를 사용하여 동일한 작업을 수행한다는 것입니다 - 복사 - 전체 mapreduce 작업을 생성하는 오버 헤드 모든 파일 (하이브 1.1에서 보았던 동작) 때문에 성능이 훨씬 나빠질 수 있습니다. 가능한 예외는 출력 파일이 대단히 크다면 ...

    하지만 왜 그렇게 할 필요가 없다면 복사하십시오? 이는 모든 파일을 읽고 다시 쓰는 것을 의미합니다. HDFS 이동 / 이름 바꾸기는 파일의 메타 데이터를 간단히 변경하며 거의 순간적입니다.

    이 동작을 얻으려면 다음과 같은 (불행히도 문서화되지 않은) 속성을 hive-site.xml에 추가하는 것이 좋습니다.

    <property>
        <name>hive.exec.stagingdir</name>
        <value>${hive.exec.scratchdir}/${user.name}/.staging</value>
        <description>
          In Hive >= 0.14, set to ${hive.exec.scratchdir}/${user.name}/.staging
          In Hive < 0.14, set to ${hive.exec.scratchdir}/.staging
    
          You may need to manually create and/or set appropriate permissions on
          the parent dirs ahead of time.
        </description>
    </property>
    

    $ {hive.exec.scratchdir}이 Hive 버전에서 자동으로 대체되지 않으면 값을 찾아 위의 값으로 수동으로 대체하십시오. 예를 들어 Hive> 0.14의 기본값 인 hive.exec.scratchdir을 사용하면이 값을 /tmp/hive/${user.name}/.staging으로 설정하고 하이브 <0.14에서는 / tmp / hive로 설정합니다 - $ {user.name} /. staging ($ {user.name}을 사용하여이 작업을 수행해서는 안되며,이 답변의 주제와 관련이없는 이유로 그렇게하는 것은 좋지 않습니다)

  2. from https://stackoverflow.com/questions/33844381/hive-overwrite-directory-move-process-as-distcp by cc-by-sa and MIT license