2014-01-07 6 views
1

동일한 클러스터의 한 hdfs 디렉토리에서 다른 hdfs 디렉토리로 많은 파일을 이동 (복사하지 않음)해야합니다.많은 파일을 hdfs에서 hdfs로 옮깁니다.

나는 distcp를 사용할 수 있지만 파일 복사 (복제) 이후에 과도한 것처럼 보입니다. 그냥 으로 이동하고으로 이동하십시오. 두 가지 질문 : 나는) 이동 (또는 새 경로로 변경해야 할 파일의 수백만이 있기 때문에이 작업을 수행하는 맵리 듀스를 사용하고자하는

:

A) 거기 있나요. 나는 또한 그것을 oozie와 통합하고 싶다. 나는 mapreduce 일을 나 자신으로 쓸 수 있었다. 그러나 나는 그 일을할만한 것이 있는지 궁금해하고 있었다.

B)지도로 표시해야하나요?

불행히도, 나는 hdfs rename의 성능 특성에 대해 충분히 알지 못합니다; 내가 파일 이름 바꾸기에 대한 단일 스레드 방식으로 접근 할 수 있다고 생각합니까?

답변

1

데이터 레벨이 아닌 메타 데이터 (즉, inode) 레벨에만 있기 때문에 이동 자체가 효율적입니다. 다시 말해, 이 아닌 move이 아닌 Hadoop 코드 내부에있는 이동을 실행하면 데이터를 복사하는 것보다 훨씬 빠릅니다. 세부 사항에 관심이있는 경우에 대비하여 source code을 살펴볼 수 있습니다.

이러한 이유로 인해 은 distcp을 사용하지 않아야합니다. 이는 실제 데이터 사본이기 때문입니다. (SRC + 대상) 이름을 바꿀 파일의 목록이 포함 된

  1. 쓰기 여러 파일을 하나 : 당신이 (당신이 파일의 수백만의 이야기 때문에)을 병렬화 할 경우, 하둡 스트리밍을 사용하여 너무 열심히하지 않아야 한 줄에
  2. stdin에서 읽는 각 행에 대해 이름 바꾸기 (hdfs 명령 mv)를 실행하는 쉘 스크립트를 작성하십시오.
  3. 스트리밍 사용 : 파일이있는 파일이 입력이고 쉘 스크립트가 매퍼입니다.

밖에 무엇입니까?

모르겠다.

지도로 표시해야합니까?

수백만 개의 파일이있는 경우 HDFS 이름 변경 자체가 효율적이라하더라도 namenode에 대한 대기 시간이 늘어납니다. BUT 일회성이라면 쓰기와 디버깅 (간단한 코드조차도)이 오래 걸리기 때문에 단일 스레드 방식을 사용하고 대기하게됩니다. 이 작업을 자주 수행하려는 경우 (왜?), 위에서 설명한 방법을 구현할 것을 고려할 것입니다.

관련 문제