본문 바로가기
Old Posts/Hadoop

[Hadoop] HDFS 아카이브(HAR) 생성 및 사용법 예제

by A6K 2021. 8. 9.

하둡 파일시스템, HDFS의 가장 큰 단점은 파일의 개수가 늘어나면 네임노드의 메모리 부하가 늘어난다는 점이다. 따라서 하둡 파일시스템을 사용할 때, 작은 파일을 여러개 생성하기보다는 큰 파일을 적게 생성해서 사용하는게 좋다.

하지만 일반 사용자들에게 HDFS를 오픈하면 작은 파일들이 여러개 생기는 경우를 피할 수 없다. 하둡은 이런 상황에 대비할 수 있게 HDFS위에 저장되는 파일의 개수를 줄일 수 있는 방안으로 HAR(Hadoop Archive) 기능을 제공한다.

HAR(Hadoop Archive)

하둡의 아카이브는 우리가 일반적으로 사용하는 파일의 압축과 비슷한 개념이다. tar 명령으로 디렉토리에 존재하는 파일들을 하나의 아카이브 파일로 묶어주는 동작과 마찬가지로 하둡은 특정 디렉토리의 서브 디렉토리 항목들을  .har 확장자를 갖는 디렉토리에 큰 파일들로 묶어준다. 

.har 확장자의 디렉토리로 들어가면 여러 _index, _masterindex와 part-* 형태의 파일들을 확인할 수 있다. _index와 _masterindex 파일은 아카이브하기전 원래 디렉토리 구조를 해석할 수 있는 메타 정보들을 저장하고 있는 파일이다. 원래 있었던 서브 디렉토리의 파일 경로와 권한 등의 메타 정보, 그리고 part-* 파일에서 원래 있었던 파일들을 따라가기 위한 offset 정보들이 저장되어 있다. part-* 파일은 여러개의 작은 파일이 가지고 있던 데이터를 하나로 합쳐놓은 큰 파일이다.


HAR 생성

하둡 아카이브는 하둡의 archive 명령으로 생성할 수 있다.

$ hadoop archive -archiveName ${name}.har -p ${parent path} [-r ${replication_factor}] ${src}* ${dest}

하둡 archive 명령의 옵션은 다음과 같다.

옵션 설명
-archiveName 생성할 아카이브 디렉토리의 이름. (.har 확장자를 가져야한다)

예를 들어 foo.har 라고 입력하면된다. 
-p Parent 디렉토리
-r 리플리케이션 팩터, 기본 값은 3

특이한 점은 -p 옵션으로 parent 디렉토리를 따로 입력한다는 점이다. 

예를들어 

$ hadoop archive -archiveName foo.har -p /user/hadoop -r 3 dir1 dir2 /user/dave

이 명령을 실행하면 'foo.har'라는 이름의 아카이브 디렉토리가 생성된다. 이 때, HDFS의 '/user/hadoop' 경로가 parent 경로로 지정되어 있고, 아카이빙 할 디렉토리인 dir1과 dir2를 지정했다. 생성되는 foo.har 아카이브는 새로운 경로인 '/user/zoo/foo.har' 로 생성된다. 아카이브 디렉토리가 정상적으로 생성되면 _SUCCESS 파일이 생성된다.

-p 옵션으로 준 디렉토리 경로의 영향에 대해서 한번 생각해보자. 위에서 만든 har 디렉토리를 열어보면 dir1, dir2가 확인된다.

만약 다음 명령으로 아카이브를 생성했다고 해보자.

$ hadoop archive -archiveName foo.har -p /user -r 3 hadoop/dir1 hadoop/dir2 /user/dave

아카이브되는 디렉토리는 동일하게 dir1과 dir2다. 하지만 생성되는 foo.har 디렉토리에 접근하면 dir1과 dir2가 아닌 hadoop 디렉토리가 화인되고, hadoop 디렉토리 아래에 dir1, dir2가 있다. Parent 디렉토리를 기준으로 소스 디렉토리까지의 경로가 .har 디렉토리를 해석할 때 중간 경로로 생성된다.

아카이브 디렉토리가 생성된 이후에 따로 원본 파일들을 삭제하지는 않는다. 따라서 아카이빙 작업 이후 원본 파일을 별도로 삭제해야 HDFS 파일 시스템에서 파일 개수를 줄일 수 있다.


HAR 읽기

har 디렉토리는 그 자체로 파일시스템처럼 해석할 수 있다. 다만 hdfs:// 대신 har:// 로 시작하는 경로를 통해 접근해야한다.

예를 들어, 위에서 봤던 대로 아카이빙을 하면 다음과 같이 파일이 생성된다.

$ hdfs dfs -ls /user/dave/foo.har
/user/dave/foo.har/_SUCCESS
/user/dave/foo.har/_index
/user/dave/foo.har/_masterindex
/user/dave/foo.har/part-0

원래 있었던 파일 대신 아카이브로 뭉쳐서 파일 하나가 저장되어 있다. 'hdfs://'로 시작하는 경로로 접근하면 위와 같은 파일로 확인이된다. 원래 있던 디렉토리 형태로 조회하려면 'har://'로 시작하는 경로로 접근해야한다.

$ hdfs dfs -ls har:///user/dave/foo.har

이렇게 열어보면 아카이빙하기 전 디렉토리인 dir1과 dir2를 확인할 수 있다.


HAR 해제하기

아카이브되어 있는 har 디렉토리를 다시 원래대로 돌려야하는 경우도 있다. 이 경우 다음 명령처럼 파일을 복사하면 된다.

hdfs dfs -cp har:///user/dave/foo.har/dir1 hdfs:/user/dave/newdir

har 프로토콜로 har 디렉토리를 해석해서 그 안에 있는 파일 하나를 har 밖으로 복사하는 명령으로 생각하면 편하다.

병렬로 실행하려면

hadoop distcp har:///user/dave/foo.har/dir1 hdfs:/user/dave/newdir

이러면 MR 작업으로 병렬 실행된다.

댓글