Monthly Archives: 1월 2015

개인화 추천 적용기 두번째. DB변경! 의도치 않은 sqoop 공부

1. 어쩔 수 없는 계획변경

  • mahout의 CF 로직 사용
  • mahout의 CF 결과를 현재 로직과 비교해 볼 수 있는 운영자 페이지.

원래는 위의 항목을 이번주에 진행하려고 했으나, 스카이T쇼핑의 오라클 DB IP가 변경되는 네트워크 작업이 있었다. 나도 같이 IP만 변경하면 문제 없으리라 생각했으나…sqoop을 이용해서 가져오다 보니, 예상치 못한 문제들이 발생하여 부득이하게 sqoop에 시간을 투자하게 되었다.  나도 sqoop을 대충 써보기만 해서 크게 지식이 없었지만 이번 일을 겪으면서 sqoop이 대충 이렇게 돌아가나보다…알 수 있게 되어, 이번 iteration에서는 sqoop에 대한 글로 대체하여 올리게 되었다.

*) 아래 글의 장비 host name은 작가의 상상에 따라 급조한 host name으로 실제 장비와는 무관함을 알려드립니다. (보안 문제 때문에)

2. 문제 발생!!

스카이T : “DAISY~ 우리 oo날 oo시에 DB IP변경할거니까 작업 시간완료 되면 IP변경하고 테스트 해봐~. 방화벽 작업은 daisy-col-meta 장비와 열어놨어. 그 장비만 하면 되는 거 맞지?”

DAISY : “아마…방화벽 작업 따로 안해도 될 거야. 기존에 연동할 때도 방화벽 요청 안했는데 되더라고. 내부 장비간이라 그른가봐. 뭐…열려면 daisy-col-meta 장비만 열어 놓으면 되기는 함~ 테스트해 볼께~ ”

daisy-col-meta 장비란?  sqoop이 설치되어 있는 daisy의 장비로, 스카이T쇼핑의 RDB에 저장 된 메타정보를 배치로 수집하여 hadoop에 저장해 놓는 기능을 담당하고 있다.

시간이 되었고, 변경 된 DB IP로 sqoop 설정을 변경하고 연동 테스트를 진행해 봤다. 그런데…아래와 같은 Exception이 발생했다.

Error: java.lang.RuntimeException: java.lang.RuntimeException: java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection

at org.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:167)

at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:73)

at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133)

at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:726)

at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)

스카이T쇼핑 담당자가 오라클 DB와 연동하여 메타 데이터를 가지고 오는 sqoop가 설치된 장비와의 방화벽을 모두 열었다고 했는데, connection  fail이 발생하고 있는 것이다. 진짜 방화벽이 오픈 된 것인지 가장 손쉬운 방법인 telnet 으로 확인해 보았다.

[daisy-col-meta ~]$ telnet skyTdb 포트번호
Trying skyTdb
Connected to skyTdb
Escape character is ‘^]’.

결과는 위에 보이는 것과 마찬가지로, telnet으로는 연결이 성공했다. 그렇다면, 이제 디버깅을 진행해 봐야겠다.

3. 문제 해결!!

방화벽도 열렸는데…왜 connection 이 실패일까…고민하면서 테스트를 몇 번 하다보니….꼭….map reduce 시작하다가 위의 exception이 나왔다.

14/12/27 17:17:53 INFO mapreduce.Job:  map 0% reduce 0%

Error: java.lang.RuntimeException: java.lang.RuntimeException: java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection….

혹시…hadoop 장비도 sqoop과 연동되는 DB와 방화벽을 모두 열어야 하는것인지 고민되었다.  내가 생각했던 sqoop의 동작은, JDBC 기반의 sqoop 만 DB와 연동되면, sqoop이 연동한 DB에서 데이터를 가져온 후, 또 sqoop이 연동된 hadoop에 넣는 것이라고 생각했었다. 즉, sqoop이 중간의 전달자 기능을 하고, RDB와 HDFS간에는 아무 관계가 없는 것이라고 생각했다.

하여튼 원인을 모르니 의심되는 부분들을 줄여가기 위해 hadoop와 스카이T DB의 방화벽을 열기 위해, 네트워크 담당자에게 요청하여 모든 hadoop 장비와 스카이T DB의 방화벽을 모두 열었다

결과는…실패~. 물론 hadoop과 스카이T DB간의 telnet은 모든 장비에서 잘 연결 되었다.

다음 단계로 sqoop만의 무슨 특성이 있는 것인지 확인해 보기 위해, 간단한 JDBC 연동 java 프로그램을 만들어서 돌려봤다. 우선 sqoop이 설치된 daisy-col-meta 장비에서 실행해 봤다. 연결이 잘 되었다. 혹시나 싶어서 hadoop 장비들에서도 실행시켰봤다. 앗!!! 그런데…..동일한 connection fail이 발생했다.

즉, 스카이T 담당자가 방화벽 작업을 요청한 daisy-col-meta에서는 jdbc 연동이 잘 되었는데, 내가 방화벽 작업을 요청한 hadoop 장비들에서는 jdbc연동이 되지 않았다. 무언가, 네트워그에 차이가 있다는 감이 왔다. 네트워크 담당자에게 연락을 했다.

DAISY : “네트워크! 동일하게 스카이T DB를 바라보는 DAISY쪽 장비들이 있는데, 스카이T가 방화벽 오픈을 요청한 daisy-col-meta 는 연결이 잘 되는데, 내가 요청했던 DAISY Hadoop 장비들은 연결이 안되네. 무슨 차이가 있는거지?”

네뜨웍 : “아~ daisy-col-meta는 스카이TDB의 real ip와 방화벽 허용이 되었고, 당신이 요청한 hadoop 장비들은 스카이Tdb의 virtual ip와 허용이 되었어. virtual ip로 요청해서 virtual ip로 열었지…”

네뜨웍 담당자와의 대화를 통하여 정리한 내용은 아래와 같다.

  • 기존 스카이TDB는 DAISY와 동일한 네트워크 대역에 있었으므로, 방화벽을 따로 열 필요가 없었다.
  • 변경 된, 스카이TDB는 DAISY와 다른 네트워크에 존재한다. 또한, 실제 DB를 이중화 시켰고 이것을 위해 가상 아이피를 부여했다.
  • 스카이T 담당자는 방화벽 요청 시 real ip로 연동을 요청했으나, DAISY는 virtual ip로 연동을 요청했다. (뭐….나한테도 스카이TDB IP로 알려 준 것은 virtaul ip 였다.)

그리고, 네뜨웍 담당자는 hadoop의 연동 IP를 스카이TDB의 real ip로 변경해 줬고, 드디어, 연동이 성공 되었다

4. 결론

고생은 하기는 했지만 그 동안 아무 생각없이 쓰기 쉬우니까 사용했던 sqoop이었는데, sqoop도 관심이 필요했던 것 같다. 이번 기회에 sqoop에 대해서도 다시 읽어보고, 어떻게 보면 당연한 일이기도 했는데 무심히 놓쳐버렸던 것 같다. 결론은, sqoop을 이용하려면 sqoop가 설치 된 장비는 물론 연관된 HDFS 장비들의 방화벽도 모두 열어야 한다는 것! 그것도 real ip로 열어야 한다는 것이다.

5. TODO

이번 DB연동 건 이후로, 수집부터 쭉 검증을 다시 한번 해봤더니, 스카이T쇼핑의 시청이력파일이 수집은 모두 되었으나 정제하는 단계에서 일부 데이터가 유실이 되고 있었다. 신입 교육 차원에서 DAISY 모듈이 아닌 직접 설계해서 코딩해 보라고 맡긴 후 inspection을 하지 않아서 그런 듯 싶다. 다음 iteration 에서는 수집 및 저장에 DAISY모듈을 적용하는 작업을 진행해야 겠다.

6. kth에서는…

skyLife 17번, ollehTV 20번을 통헤 T-Commerce인 ‘스카이T쇼핑‘을 운영하고 있다. 단방향으로 송출되는 방송을 그대로 시청해야 하는 기존의 홈쇼핑 보다 한 단계 진화되어 아래와 같은 장점이 있다.

  • 고객(시청자)과의 양방향 교류 가능
  • 고객(시청자)별 차별화 된 데이터(화면) 노출 가능

또한, 우리 팀이 진행하는 ‘대용량 데이터의 실시간 분석/추천 솔루션 DAISY‘를 자체 개발하여 ollehtv 채널/VOD 실시간 시청률 분석 플랫폼, KT LTE 실시간로그 감시 시스템 및 기상 정보 기반의 공공 데이터 융합 서비스 분야 등 그룹내외에서 실제 서비스와 기간 시스템으로 활용되고 있으며, 새로운 기술(open source)을 지속적으로 반영하여 고도화 시키고 있다.