오늘 multipleoutputs를 사용해서 reducer를 개발하면서 한 삽질 두가지...
1. 로그파일이 euc-kr이라서, 이걸 간단하게 utf-8로 변환해주는 java 프로그램을 만들어서 컨버팅하고 이걸
hdfs에 올렸다. 그리고 분석을 했는데.. 600메가밖에 안되는데 java heap memory 오류가 발생한다.
별짓을 다하면서 옵션도 수정해보았는데 원인을 찾을 수가 없다.... 혹시나해서 로그파일을 열어보니..
600메가가 1줄이다. 1 row.... 1 line.... 컨버팅하면서 라인별로 개행문자를 안 붙여줬음 -_-
-> 이걸로 오전 2시간 날려먹음 (점심시간 포함)
2. Map Reduce 프로그램을 개발할때.. Mapper의 Output 타입과 Reducer의 Input타입이 맞지 않으면..
예를 들면...
public class ScnCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>
public class ScnCountReducer extends Reducer<Text, DoubleWritable, Text, IntWritable>
위 두개...
최종 결과 파일이 Map된 상태로만 part-r-nnnnn에 떨어집니다..
오늘 multipleoutputs를 사용해서 reducer를 개발하고, 설계가 바뀌어서 기존에 DoubleWritable로 되어있던 것을 IntWritable로 변경하였다. 그리고 돌려보았는데.. multipleoutputs로 설정한 파일들은 생성되지 않고 part-r-nnnnn에 mapper로부터 출력된 결과만 보인다. reduce 자체가 실행이 안된것..
데이터노드 들어가서 reduce 로그를 봐도.. 에러 한줄없다..
"와 이건 또 왜이래.." 하면서 설계전으로 원복해서 돌려보면 또 잘된다.
어쩌다가 발결한 저거.. "어???" 하면서 뒷골이 싸함을 느끼며..
DoubleWritable -> IntWritable로 바꿔보니.. 잘 돈다.. ㅠㅠ
-> 이걸로 점심시간 이후 오후 3시간 날려먹음
그러면서 느낀거...
1. 로컬PC가 윈도우다보니.. map-reduce 프로그램 개발하고 실행하기가 좀 번잡스럽다.
2. 로그 좀.. 어떻게 한곳에 딱 모아서 보는 방법없나.. 데이터노드마다 찾아다니기도 어렵고..
log4j 사용하면 그나마 어디 찍히는지 보이지도 않는다 --; 분명 어딘가에 찍힐텐데...