hadoop - 재설치 - 하둡 프로그래밍




hadoop의 새로운 디렉토리에서.gz 파일의 압축을 해제 하시겠습니까? (4)

나는 hdfs에있는 폴더에 .gz 파일들을 가지고있다. 이 모든 .gz 파일을 hdfs의 새 폴더에 압축을 풀고 싶습니다. 어떻게해야합니까?


Bash 솔루션

필자의 경우에는 파일 내용을 잘 모르기 때문에 파이프를 압축 해제하고 싶지 않았습니다. 대신 zip 파일의 모든 파일을 HDFS에 압축을 넣었 으면합니다.

나는 간단한 bash 스크립트를 만들었다. 댓글은 당신에게 무슨 일이 일어나는지에 대한 단서를 제공해야합니다. 아래에는 간단한 설명이 나와 있습니다.

#!/bin/bash

workdir=/tmp/unziphdfs/
cd $workdir

# get all zip files in a folder
zips=$(hadoop fs -ls /yourpath/*.zip | awk '{print $8}')
for hdfsfile in $zips
do
    echo $hdfsfile

    # copy to temp folder to unpack
    hdfs dfs -copyToLocal $hdfsfile $workdir

    hdfsdir=$(dirname "$hdfsfile")
    zipname=$(basename "$hdfsfile")

    # unpack locally and remove
    unzip $zipname
    rm -rf $zipname

    # copy files back to hdfs
    files=$(ls $workdir)
    for file in $files; do
       hdfs dfs -copyFromLocal $file $hdfsdir
       rm -rf $file
    done

    # optionally remove the zip file from hdfs?
    # hadoop fs -rm -skipTrash $hdfsfile
done

기술

  1. hdfs 디렉토리에서 모든 *.zip 파일 hdfs
  2. 하나씩 : 임시 디렉토리로 복사 (파일 시스템에서)
  3. 압축을 풀다
  4. 압축을 푼 모든 파일을 zip 파일의 dir에 복사하십시오.
  5. 대청소

필자는 /mypath/*/*.zip 사용하여 각 zip 파일의 하위 디렉토리 구조로 작업하도록했습니다.

행운을 빕니다 :)


Hadoop의 FileUtil 클래스에는 unTar()unZip() 메소드가 있습니다. unTar() 메서드는 .tar.gz.tgz 파일에서도 작동합니다. 불행하게도 그들은 로컬 파일 시스템의 파일들에 대해서만 작업을합니다. 같은 클래스의 copy() 메소드 중 하나를 사용하여 사용해야하는 분산 파일 시스템에서 복사해야합니다.


텍스트 파일을 압축했다면, hadoop fs -text는 다른 일반적인 압축 형식 (snappy, lzo)과 함께 gzip을 지원합니다.

hadoop fs -text /tmp/a.gz | hadoop fs -put - /tmp/uncompressed_a

하이브 (텍스트 데이터라고 가정)를 사용하여이를 수행 할 수 있습니다.

create external table source (t str) location '<directory_with_gz_files>';
create external table target (t str) location '<target_dir>';
insert into table target select * from source;

데이터는 새로운 파일 세트로 압축 해제됩니다.

이름을 변경하지 않으려 고하고 실행중인 노드에 저장 영역이 충분한 경우이 작업을 수행 할 수 있습니다.

hadoop fs -get <your_source_directory> <directory_name>
It will create a directory where you run hadoop command. cd to it and gunzip all the files
cd ..
hadoop fs -moveFromLocal <directory_name> <target_hdfs_path>




gz