복붙노트

[HADOOP] hadoop이 큰 텍스트 파일을 나눈 다음 gzip을 사용하여 분할을 압축 할 수없는 이유는 무엇입니까?

HADOOP

hadoop이 큰 텍스트 파일을 나눈 다음 gzip을 사용하여 분할을 압축 할 수없는 이유는 무엇입니까?

나는 최근에 hadoop과 HDFS를 조사 해왔다. 파일을 HDFS로로드하면 일반적으로 파일이 64MB의 청크로 분할되어 클러스터 주위에 이러한 청크가 배포됩니다. GZIP 된 파일을 분할 할 수 없기 때문에 gzip 된 파일로는이 작업을 수행 할 수 없습니다. 나는 이것이 왜 그런지 완벽하게 이해한다 (gzip 파일을 왜 분할 할 수 없는지 설명하는 사람은 필요 없다). 하지만 HDFS가 평범한 텍스트 파일을 입력으로 받아서 정상적으로 분할하지 못하면 왜 gzip을 사용하여 각 분할을 개별적으로 압축 할 수 없습니까? 어떤 스플릿에도 액세스하면 즉시 압축이 해제됩니다.

내 시나리오에서는 각 분할이 완전히 독립적으로 압축됩니다. 분할 간에는 종속성이 없으므로 원본 파일 전체가 분할 중 하나를 압축 해제 할 필요가 없습니다. 이것이이 패치가 취하는 접근법입니다 : https://issues.apache.org/jira/browse/HADOOP-7076, 이것이 제가 원했던 것이 아님을 주목하십시오.

이것은 꽤 기본적인 것 같습니다 ... 나는 무엇을 놓치고 있습니까? 왜 이것을 할 수 없습니까? 아니면 할 수 있다면, 왜 hadoop 개발자는이 경로를 보지 않았습니까? HDFS에서 gzip으로 분할 된 파일을 원하는 사람들에 대해 얼마나 많은 토론을했는지 이상하게 보입니다.

해결법

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

    1.단순한 이유는 "우려 사항 분리"라는 디자인 원칙입니다.

    단순한 이유는 "우려 사항 분리"라는 디자인 원칙입니다.

    당신이 제안한 것을한다면 HDFS는 파일의 실제 비트와 바이트가 무엇인지를 알아야합니다. 또한 HDFS는 그것에 대해 추론 할 수 있어야합니다 (즉 추출, 압축 해제 등). 일반적으로 이런 종류의 책임을 소프트웨어에 포함시키지 않으려합니다.

    따라서 비트가 의미하는 바를 이해하는 '유일한'부분은이를 읽을 수 있어야하는 응용 프로그램입니다. 일반적으로 Hadoop의 MapReduce 부분을 사용하여 작성됩니다.

    HADOOP-7076의 Javadoc에서 언급했듯이 (나는 그 것을 썼다.)) :

  2. ==============================

    2.HDFS는 분산 파일 시스템 서비스의 범위가 제한되어 있으며 데이터 압축과 같은 무거운 작업을 수행하지 않습니다. 실제 데이터 압축 프로세스는 Map-Reduce, Spark, Tez 등과 같은 분산 실행 프레임 워크에 위임됩니다. 따라서 데이터 / 파일 압축은 파일 시스템이 아닌 실행 프레임 워크의 관심사입니다.

    HDFS는 분산 파일 시스템 서비스의 범위가 제한되어 있으며 데이터 압축과 같은 무거운 작업을 수행하지 않습니다. 실제 데이터 압축 프로세스는 Map-Reduce, Spark, Tez 등과 같은 분산 실행 프레임 워크에 위임됩니다. 따라서 데이터 / 파일 압축은 파일 시스템이 아닌 실행 프레임 워크의 관심사입니다.

    또한 Sequence-file, Parquet 등과 같은 컨테이너 파일 형식이 있으면 HDFS가 데이터 블록을 자동으로 압축 할 필요가 없으므로 질문에 의해 제안됩니다.

    따라서 디자인 철학의 이유로 인해 데이터 압축은 파일 시스템 서비스가 아닌 실행 엔진에서 수행해야합니다.

  3. from https://stackoverflow.com/questions/6511255/why-cant-hadoop-split-up-a-large-text-file-and-then-compress-the-splits-using-g by cc-by-sa and MIT license