[HADOOP] hadoop에서 작은 파일 병합
HADOOPhadoop에서 작은 파일 병합
나는 HDFS에 몇 분 (예 : 10MB)의 파일이로드되는 디렉토리 (Final Dir)를 가지고 있습니다. 시간이 지나면 모든 작은 파일을 큰 파일 (예 : 100MB)에 결합하려고합니다. 그러나 사용자는 파일을 Final Dir로 계속 푸시합니다. 그것은 연속적인 과정입니다.
그래서 처음에는 큰 파일 (예 : large.txt)에 처음 10 개의 파일을 결합하고 Finaldir에 파일을 저장해야합니다.
이제 내 질문은 어떻게 내가 처음 10 파일을 제외하고 다음 10 파일을 얻을 것입니다?
나 좀 도와 줄래?
해결법
-
==============================
1.여기에 또 하나의 대안이 있습니다. 이것은 여전히 @Andrew가 그의 의견에 지적한 유산 접근법이지만 입력 파일을 작은 파일을 적시에 tmp 디렉토리로 밀어 넣고 병합하는 버퍼로 만드는 추가 단계가 있습니다. 결과를 다시 입력으로 푸시합니다.
여기에 또 하나의 대안이 있습니다. 이것은 여전히 @Andrew가 그의 의견에 지적한 유산 접근법이지만 입력 파일을 작은 파일을 적시에 tmp 디렉토리로 밀어 넣고 병합하는 버퍼로 만드는 추가 단계가 있습니다. 결과를 다시 입력으로 푸시합니다.
1 단계 : tmp 디렉토리 만들기
hadoop fs -mkdir tmp
2 단계 : 시점에 모든 작은 파일을 tmp 디렉토리로 이동
hadoop fs -mv input/*.txt tmp
3 단계 - hadoop-streaming jar의 도움으로 작은 파일들을 합치십시오
hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.6.0.jar \ -Dmapred.reduce.tasks=1 \ -input "/user/abc/input" \ -output "/user/abc/output" \ -mapper cat \ -reducer cat
4 단계 - 출력을 입력 폴더로 이동
hadoop fs -mv output/part-00000 input/large_file.txt
5 단계 - 출력 제거
hadoop fs -rm -R output/
6 단계 - tmp에서 모든 파일을 제거합니다.
hadoop fs -rm tmp/*.txt
2 단계에서 6 단계까지 셸 스크립트를 작성하고 규칙적인 간격으로 실행되도록 일정을 잡아 일정한 간격으로 작은 파일을 병합하십시오 (필요에 따라 매분마다 가능)
작은 파일 병합을위한 cron 작업을 예약하는 단계
1 단계 : 위의 단계 (2 ~ 6)를 사용하여 쉘 스크립트 /home/abc/mergejob.sh를 작성하십시오.
중요 : cron이 이해할 수 있도록 스크립트에서 hadoop의 절대 경로를 지정해야합니다.
#!/bin/bash /home/abc/hadoop-2.6.0/bin/hadoop fs -mv input/*.txt tmp wait /home/abc/hadoop-2.6.0/bin/hadoop jar /home/abc/hadoop-2.6.0/share/hadoop/tools/lib/hadoop-streaming-2.6.0.jar \ -Dmapred.reduce.tasks=1 \ -input "/user/abc/input" \ -output "/user/abc/output" \ -mapper cat \ -reducer cat wait /home/abc/hadoop-2.6.0/bin/hadoop fs -mv output/part-00000 input/large_file.txt wait /home/abc/hadoop-2.6.0/bin/hadoop fs -rm -R output/ wait /home/abc/hadoop-2.6.0/bin/hadoop fs -rm tmp/*.txt
2 단계 : cron을 사용하여 매분 실행하는 스크립트를 예약합니다.
a) 편집기를 선택하여 crontab을 편집하십시오.
>crontab -e
b) 끝에 다음 줄을 추가하고 편집기에서 나갑니다.
* * * * * /bin/bash /home/abc/mergejob.sh > /dev/null 2>&1
병합 작업은 1 분마다 실행되도록 예약됩니다.
희망이 도움이되었다.
-
==============================
2.@ 앤드류 (Antrew)는 배치 중심의 세계에서 6 년 전 적절한 해결책을 제시했습니다. 하지만 2016 년, 마이크로 배치 데이터 흐름이 실행되고 비 차단 솔루션이 필요합니다.
@ 앤드류 (Antrew)는 배치 중심의 세계에서 6 년 전 적절한 해결책을 제시했습니다. 하지만 2016 년, 마이크로 배치 데이터 흐름이 실행되고 비 차단 솔루션이 필요합니다.
그것이 내가하는 방법이다.
이제 배치 압축 논리 :
따라서 압축이 안전하게 다른 디렉토리에서 실행되는 동안 기존 데이터 흐름이 new_data로 새 파일을 계속 덤핑 할 수 있다는 것을 제외하면 기본적으로 2010 년 이야기입니다. 압축 작업이 중단되는 경우 데이터 흐름을 손상시키지 않고 압축을 조사 / 정리 / 재개 할 수 있습니다.
그런데 "하둡 스트리밍"작업에 기반을 둔 2010 솔루션의 큰 팬이 아닙니다 - 한편으로는 "스트리밍"은 매우 다른 의미를 가지고 있습니다. 두 번째 손에, "Hadoop streaming"은 예전에는 유용했지만 이제는 레이더에서 벗어났습니다. 손을 잡으면 [*] Hive 쿼리로 매우 간단하게 처리 할 수 있습니다.
INSERT INTO TABLE blahblah PARTITION (stage='history') SELECT a, b, c, d FROM blahblah WHERE stage='reorg' ;
이 쿼리 이전에 몇 가지 SET some.property = somevalue를 사용하여 결과 파일에 적용 할 압축 코덱, 원하는 파일 수 (또는 더 정확하게는 파일의 크기를 정의 할 수 있음)를 정의 할 수 있습니다 to be - 하이브가 그에 따라 병합을 실행합니다.)
hive.merge.mapfiles 및 hive.merge.mapredfiles (또는 TEZ를 사용하는 경우 hive.merge.tezfiles) 및 hive.merge에서 https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties를 확인하십시오. smallfiles.avgsize 그리고 나서 hive.exec.compress.output과 mapreduce.output.fileoutputformat.compress.codec 그리고 hive.hadoop.supports.splittable.combineinputformat을 사용하여 입력 파일이 매우 작기 때문에 Map 컨테이너의 수를 줄이십시오.
[*] 아주 오래된 SF 참고 자료 :-)
from https://stackoverflow.com/questions/39103872/merging-small-files-in-hadoop by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 지도에서 키에 유형이 일치하지 않습니다. 예상 됨.받은 텍스트 ... LongWritable (0) | 2019.07.26 |
---|---|
[HADOOP] 왜 파일이 hadoop에 존재하는지 검사하면 NullPointerException이 발생합니까? (0) | 2019.07.26 |
[HADOOP] hadoop이 여러 디렉토리와 파일에서 입력 받아 들일 수 있습니까? (0) | 2019.07.26 |
[HADOOP] hbase.hregion.max.filesize를 사용하여 HBase 영역 자동 분할 (0) | 2019.07.26 |
[HADOOP] Hadoop지도를 어떻게 디버그 할 수 있습니까? (0) | 2019.07.26 |