[Hadoop] DBInputFormat – LIMIT & OFFSET Keyword

By | Y2014Y2014-10M-D

시스템의 학습 로그를 DB 에서 긁어와 하둡에 저장하기 위해서는

  • Job 을 DB 관련 형식으로 초기화하기 위한 설정 클래스인 DBConfiguration
  • DB의  쿼리 실행을 제공하는 DBInputFormat 으로  job 의 in/out 에 대한 Format 설정
  • 가져올 데이터 형식을 제공하는 DBWritable 인터페이스, Writable 클래스를 implementation, override 하는 클래스 선언

를 이용하여

  • DBConfiguration.configureDB>Job 생성>DBInputFormat.setInput(job,Class<? extends DBWritable> inputClass, Query, Record Count Query)> 데이터 호출 및 Writing

을 수행하게 된다.

문제는 jdbc driver for MS SQL Server 을 이용해서 DBInputFormat 에서 쿼리를 수행하려고 하니  ‘ LIMIT’ 근처의 구문이 잘못되었습니다. 라고 뜬다.

쿼리를 몇번을 고쳐봐도, 심지어는 제일 간단한 쿼리도 문제를 일으킨다.

‘도대체 이것의 정체는 무엇인가?’ 라는 질문으로 며칠을 보내던 차에 Google 의 도움을 받아서 찾아낸 결과는,

  1. 하둡은 Sharding 이 고려되지 않아 DB에서 가져올 때 부하 문제를 일으킬 수 있다.(이 부분은 책에서..)
  2. 따라서 DB에서 데이터를 가져올 때, Limit / Offset 키워드로 Pagination 을 구현하여 데이터를 잘라 가지고 온다.
  3. 최소한 ORACLE / MSSQL 에서 두 키워드를 지원하지 않는(!)다.

즉, 쓰고싶으면 DBInputFormat 을 Override 해서 써라…..
(아래 참고의 두번째 링크에 자세히 설명되어 있다)

* DBOutputFormat 도 마찬가지여서 Oracle 에서 Insert 문 뒤에 세미콜론(;) 을 붙이는 바람에 오류가 있다고 한다.

* 참고자료

  • Hadoop in practice

http://techannotation.wordpress.com/2012/09/10/hadoop-in-practice/

  • [Hadoop]Oracle을 사용해 입출력하는 Map-Reduce

http://blog.benelog.net/viewer/2271302

1,754 total views, 1 views today

댓글 남기기