hadoop reducer iterator를 재사용할 수 없을까?

요즘 업무 때문에 hadoop을 많이 사용하고 있다. 오늘의 삽질 항목은 hadoop에서 iterator를 재사용할 수 없을까? 하는 것이다. hadoop의 reducer는 동일한 key로 묶인 value들을 가져올 수 있도록, Iterable<?> type을 반환해 준다. 그런데 쓰다 보면, 이 reducer의 값들을 두 번 이상 읽고 싶을 때가 있다. 예를 들면, 전체 value들의 개수를 세어서 값들을 출력할 때 함께 찍어주고 싶다거나.. 기타 max, min 값을 구해서 같이 출력 하고 싶다거나 등 은근 필요한 경우가 많다.

처음에는 단순하게 Iterable<text> values 변수를 복사해 뒀다가, 다시 iterator를 호출해서 쓰는 것을 시도했다. 대충 돌려보니 컴파일 오류 안 나고 실행도 잘 되는 듯 했다! 올레를 외치며 대용량 데이터에 적용을 했는데.. 몇 시간 동안 열심히 작업을 하 더니 내 놓은 결과는,,  reducer output records : 0개  -_- 결과 값이 아무 것도 없는.. T_T

구글링을 해 보니, 구현상의 이유로, reducer의 iterator는 두 번 읽을 수 없다고 한다. (요기 참고) 생각해보면, key에 딸린 value들이 어마어마하게 많으면, 파일 블록 하나로 처리가 안될 테니, 여러 파일에서 나눠서 읽어야 할 테고, 여기서 iterator를 다시 호출 할 수 있게 하려면 시스템이 복잡해 질 수도 있겠다 싶었다. (그래도 좀 해주면 안 되려나)

하여간, 이를 극복하기 위해서는,

  1. value들을 모두 list에 따로 저장
  2. value들을 local file에 저장했다 다시 읽기

요 두 가지 방법 정도가 떠올랐다. 처음에 list에 저장하도록 해서 돌렸더니, 여기저기서 out of memory 오류를 뿌리며 죽었다. –_-; 은근 메모리에 다 못 올릴 cluster들이 많은가 보다.

그래서 local file에 저장해서 다시 읽을까 했는데, 작은 cluster에 대해서도 일일이 local file에 저장하고 읽으면 이것도 은근 속도에 bottleneck이 될 듯 하여.. n개 이하는 메모리의 list로 처리하고, n개가 넘어가면, 파일에 저장해서 다시 읽도록 구현해서 돌렸다. 그런데 이게 어디서 오류가 생긴건지 24시간이 지나도록 몇몇 reducer 작업들이 끝나지를 않는다. –_-; 아놔

일단 시간이 없어서, 결국 이번에는 iterator를 한 번 사용해서 결과를 찍고, 결과를 별도로 후처리를 하여 원하는 값을 얻었다. 뭔가 더 깔끔한 방법이 있을 듯 한데,, 방법이 없을까?

댓글

Designed by JB FACTORY