티스토리 뷰

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 클래스를 하나 만들었다.
/**
* HDFS 내 파일에 데이터 작성
* @param hdfsUri HDFS 주소
* @param filePath HDFS 내 파일 경로
* @param message 파일에 저장할 내용
* @param overwrite overwrite 여부
* @return 파일 쓰기 결과
*/
public static boolean writeFile(String hdfsUri, String filePath, String message, boolean overwrite) {
boolean flag = false;
FSDataOutputStream fout = null;

try {
FileSystem fs = FileSystem.get(new Configuration());
Path path = new Path(hdfsUri + filePath);

if (!fs.exists(path)) {
fout = fs.create(path);
} else {
if (overwrite) {
fs.delete(path, true);
fout = fs.create(path);
} else {
fout = fs.append(path);
}
}

fout.writeUTF(message);
flag = true;
} catch (Exception e) {
LOGGER.error("HDFS 파일 쓰기 오류", e);
} finally {
IOUtils.closeQuietly(fout);
}

return flag;
}

이를 원격지에서 수행할 수는 있으나, 권한 문제로 인해 파일 작성이 정상적으로 이뤄지지 않았다.
권한 문제만 해결된다면 아래와 같이 코드를 변경해서 원격지에서 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로 설정하고 사용하는 것이 현명한 방법일 것 같다.


참고 사이트
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함