HDFS 파일을 작성할 때 기존에 존재하는 파일에 내용을 write 하면 이미 존재하는 파일이라고 오류가 발생한다.
이를 어떻게 해결할 수 있을까?
기존에 있는 파일이라면 파일에 내용을 Append 할 순 없을까?
구글링을 해 보니 dfs.support.append 옵션을 활용할 수 있다.
이 옵션이 true 일 경우 좀 더 간편한 반면, false라면 좀 복잡하긴 하나 가능은 하다.
두 가지 경우에 대해서 테스트를 진행해보자.
1. dfs.support.append 속성이 true 인 경우
먼저 hdfs-site.xml에 아래와 같이 설정하자.
<property> <name>dfs.support.append</name> <value>true</value> </property> |
그리고 아래와 같이 Util 클래스를 하나 만들었다.
/** |
이를 원격지에서 수행할 수는 있으나, 권한 문제로 인해 파일 작성이 정상적으로 이뤄지지 않았다.
권한 문제만 해결된다면 아래와 같이 코드를 변경해서 원격지에서 TC를 만들어 수행해 볼 수도 있다.
Configuration conf = new Configuration(); conf.set("fs.defaultFS", hdfsUri); FileSystem fs = FileSystem.get(conf); |
local PC에서는 동작하지 않으므로 장비에 올려서 테스트를 해 보도록 한다.
README.md 파일 내용의 일부를 이용하여 신규 파일을 만들어보자.(Spark App를 이용해서 테스트를 진행하였다.)
README.md.output 파일이 생성된다.
관?: line count is 98 |
파일 내용은 위와 같다.(의도한 내용이 좀 깨져서 저장되는 현상이 있긴 하나, 여기서 중요한 내용은 아니니 넘어가기로 한다.)
재수행해보자.
파일크기가 2배로 늘어난 것을 확인 할 수 있다. 정상적으로 append 가 잘 이뤄지는 것 같다.
관?: line count is 98관?: line count is 98 |
파일 내용도 동일한 내용이 2개 append 된 것을 확인할 수 있다.
2. dfs.support.append 속성이 false 인 경우
이 방법은 기존 파일 내용을 임시파일에 담아두고, 대상 파일을 rewrite 하는 방법이다.
만약 파일 내용이 크다면, 임시파일 생성과 대상파일 rewrite의 overhead가 상당할 것으로 생각된다.
따라서 만약 append가 필요하다면 dfs.support.append 속성을 true로 설정하고 사용하는 것이 현명한 방법일 것 같다.
참고 사이트
'BigData > Hadoop' 카테고리의 다른 글
HDFS 네임노드에서 metadata size 한계는 어떻게 될까? (0) | 2017.04.24 |
---|---|
[하둡완벽가이드] 3장 HDFS (0) | 2017.04.19 |
Hadoop shell 사용법 (0) | 2016.02.10 |
Hadoop 에서 작은 크기의 파일을 처리하는 방법 (0) | 2016.02.10 |
HDFS 내에 여러 파일을 하나의 파일로 합쳐보기 (0) | 2015.05.21 |