인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

jungsikyeo's profile image
jungsikyeo

asked

15-day big data pilot project

6. Real-time loading pilot execution Step 4 - Real-time loading function test

Storm 토폴로지 배포 후 Spout, bolt 에러

Written on

·

450

0

kafka-console-consumer 까지는 데이터가 들어오는것을 확인했지만

HBASE에 데이터가 들어오지 않아서

Storm UI를 확인해봤더니 DriverCarInfo 토폴로지에 아래 캡처와 같이 에러가 나고 있습니다.

어떤 이유로 나는지 알수가 없네요...

아래는 해당 Spout, Bolt에 나오는 상세 에러로그입니다.

[kafkaSpout 에러]

[HBASE Bolts 에러]

ava.lang.RuntimeException: java.io.IOException: Unable to establish connection to HBase table DriverCarInfo at com.wikibook.bigdata.smartcar.storm.HBaseBolt.prepare(HBaseBolt.java:40) at org.apache.storm.daemon.executor$fn__10180$fn__10193.invoke(executor.clj:803) at org.apache.storm.util$async_loop$fn__624.invoke(util.clj:482) at clojure.lang.AFn.run(AFn.java:22) at java.lang.Thread.run(Thread.java:748) Caused by: java.io.IOException: Unable to establish connection to HBase table DriverCarInfo at com.wikibook.bigdata.smartcar.storm.HTableConnector.<init>(HTableConnector.java:37) at com.wikibook.bigdata.smartcar.storm.HBaseBolt.prepare(HBaseBolt.java:38) ... 4 more Caused by: java.io.IOException: java.lang.reflect.InvocationTargetException at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:240) at org.apache.hadoop.hbase.client.ConnectionManager.createConnection(ConnectionManager.java:441) at org.apache.hadoop.hbase.client.ConnectionManager.createConnection(ConnectionManager.java:434) at org.apache.hadoop.hbase.client.ConnectionManager.getConnectionInternal(ConnectionManager.java:312) at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:185) at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:151) at com.wikibook.bigdata.smartcar.storm.HTableConnector.<init>(HTableConnector.java:35) ... 5 more Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:238) ... 11 more Caused by: java.lang.ExceptionInInitializerError at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2639) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2612) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:370) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:169) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:354) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296) at org.apache.hadoop.hbase.util.DynamicClassLoader.initTempDir(DynamicClassLoader.java:133) at org.apache.hadoop.hbase.util.DynamicClassLoader.<init>(DynamicClassLoader.java:103) at org.apache.hadoop.hbase.protobuf.ProtobufUtil.<clinit>(ProtobufUtil.java:256) at org.apache.hadoop.hbase.ClusterId.parseFrom(ClusterId.java:64) at org.apache.hadoop.hbase.zookeeper.ZKClusterId.readClusterIdZNode(ZKClusterId.java:75) at org.apache.hadoop.hbase.client.ZooKeeperRegistry.getClusterId(ZooKeeperRegistry.java:105) at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.retrieveClusterId(ConnectionManager.java:944) at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.<init>(ConnectionManager.java:720) at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.<init>(ConnectionManager.java:649) ... 16 more Caused by: java.lang.IllegalStateException: Shutdown in progress at java.lang.ApplicationShutdownHooks.add(ApplicationShutdownHooks.java:66) at java.lang.Runtime.addShutdownHook(Runtime.java:211) at org.apache.hadoop.util.ShutdownHookManager.<clinit>(ShutdownHookManager.java:47) ... 31 more

bigdataHadoopKafkaZooKeeper데이터 엔지니어링redisFlumeImpala

Answer 1

0

빅디님의 프로필 이미지
빅디
Instructor

안녕하세요! 여정식님!

파일럿 프로젝트 진행하며, 실시간 데이터 적재 단계에서 많은 문제들을 만나게 되는 데요..TT

실시간 데이터 처리에는 많은 서버들과 리소스들이 사용되는, 복잡한 아키텍처로 구성 되어 있기 때문입니다.

해당 문제의 경우 정상적으로 진행해 왔는데 발생 했다면...
복잡한 실시간 서버들간엔 서로 의존성이 있는데, HA(가용성/이중화)로 구성 되지 않은 파일럿 환경의 한계로 자주 발생 하는 문제입니다.

-------------------Zookeeper--------------------
Flume > Kafka > Storm > HBase | Redis 
----------------------HDFS-----------------------

문제는 Kafka의 토픽정보(/brokers/topics/SmartCar-Topic/partitions/)가 Zookeeper에서 관리 되는데 이 토픽 정보를 특별한 이유없이 스톰 토폴로지가 찾질 못하는 경우 입니다.

주키퍼 클라이언트로 접속해서 토픽 정보가 잘 생성 되어 있는지 Server02에 접속해 아래 명령대로 확인해 보시고요..

$ zookeeper-client 

[zk: ...]  ls /brokers/topics/SmartCar-Topic/partitions/

위 SmartCar-Topic Z노드가 확인이 되었으면 큰 문제는 없습니다. 그냥 아래 순서대로 스톰 토폴로지를 재배포 후 테스트 해보시기 바랍니다.

1. 스톰 토폴로지 삭제 : $ storm kill "DriverCarInfo

2. CM에서 카프카 중지

3. Service 명령으로 Storm 중지

4. CM에서 주키퍼 중지

5. CM에서 주키퍼 시작

6. Service 명령으로 Storm 시작

7. CM에서 카프카 시작

8. 스톰 토폴로지 배포

9. 실시간 테스트

아마도 이번 실시간 적재 단계만 넘으면, 나머지 파일럿 단계는 여유롭게 진행하실수 있을 겁니다.  ㅎㅎ

- 빅디 드림

CM 버전 어떻게 됩니까? 7.X 버전에서 znode는 /kafka/brokers/topics/... 이런식이던데요...때문에 storm에서 이경로를 못 찾는거 아닌가요?

저도 진행이 이단계에서 막혔습니다.

빅디님의 프로필 이미지
빅디
Instructor

안녕하세요! "skchun69님!"

파일럿 프로벡트에서 CM 버젼은 6.3.1 입니다.

카프카 Znode는 임의로 변경은 가능 한데요...

해당 경로는 고정으로 사용 하고 있기 때문에, 임의로 변경하지 않았다면 문제 되지는 않습니다.

위 단계에서 문제가 되는건 앞서 올려드린 내용처럼...카프카/주키퍼/스톰 등이 완전 이중화로 되어 있지 않아, 파일럿 실행중 잣은 테스트와 리스타트 등으로 설정 정보들이 꼬이는 경우가 종종 발생합니다.

앞서 가이드 드린 절차를 진행해봐 주시고요..안되시면 문의 주세요~

-빅디 드림

Big.D님

1년도 더 지난 글에 기대 않고 댓글 달았는데...이렇게 빨리 답변 주실 줄 몰랐습니다. 감동입니다.

1990년대 초반부터 2010년도 까지 SCADA(Supervisory Control & Data Aquisition System)라는 시스템의 SW를 Windows 기반에서 C++로 개발해 왔던 경험이 있어서... 순수한 욕구로 공부하는 사람입니다. 이쪽 분야 종사자도 아니고 unix 환경, java 모르지만 책 사서 무조건 따라하고 있습니다.

책 출간 시점하고 달라진 점이 많아서 Cloudera도 7.1.7(CDP Trial version) 사용하고 flume도 없어서 별도로 설치해 가면서 겨우겨우 가는데...딱 storm topology 배포하고서 막혔습니다.(VM 올려 주신 건 실행이 안됩니다.)

위 지적대로 cloudera kafka 구성에서 znode 경로만 /brokers/topics/... 식으로 바꾸면 먼저 문의 하신분이 언급하신 다른 Error도 없어질까요?(저 또한 Hbase 오류 똑같이 발생합니다.)

시간되실 때 의견 한번 주시기 바랍니다.

감사합니다.

 

빅디님의 프로필 이미지
빅디
Instructor

네~ "skchun69"님!

힘들지만 멋진 도전을 하고 계셔서...skchun69님께 저도 감동입니다. TT

말씀해 주신 내용을 보면요..

현재 상황에선 주키퍼에 저장된 카프카의 토픽정보 불일치로 문제가 발생 할 수도 있습니다.

CM 7.x에서 제공하는 카프카의 버젼에 따라 Znode 정보가 상이할 수 있기때문입니다.
(참고로 최신 카프카의 경우 주키퍼를 사용하고 있지 않는다고 합니다.)

그리고 해당 카프카의 토픽정보는 스톰 토폴로지의 자바소스에 작성 되어 있습니다.

관련 소스는 "섹션9. 자료실 > 파일럿 예제소스"의 Storm 폴더에서 확인 하실 수 있고, 사용 하시는 카프카 버젼에 따라서 이 자바소스를 수정해 다시 빌드해야 하는 작업이 필요 할 수 있습니다.

그전에 스톰에서 어떤 에러가 발생 하는지 로그도 확인해 보실 필요가 있습니다.

파일럿 강의대로 스톰을 설치 하셨다면 아래 경로에서 관련 로그를 확인해 보실 수 있습니다.

/home/pilot-pjt/storm/logs/

잘 아시겠지만...SW환경이 조금만 바뀌더라도 복잡한 시스템들간의 의존성이 높아서 많은 오류가 발생 하게 됩니다. 하지만 이 의존성을 해결해 가다보면, 아키텍처의 좀더 깊은 이해를 갖게 됩니다~

-빅디 드림

ps. 제공드린 VM 실행이 어떻게 안되는지요?!

안녕하세요? Big.D 님

위 storm 예제 소스(저는 깃에서 받았습니다.)를 이클립스에 열어 봤는데요. 몇 가지 클래스와 메소드들이 deprecated 라고 나옵니다.(KafkaSpout, HTable 등)

작성하셨을 때 version dependency 다 고려하셔서 pom 만드셨을 텐데요...

초보라 저수준 질문만 계속 드려서 죄송합니다. 간단한 설명 부탁 드리겠습니다.

감사합니다.

 

빅디님의 프로필 이미지
빅디
Instructor

네~ "skchun69"님!!

Deprecated는 해당 클래스 또는 함수등을 새로운 버젼에선 더이상 지원 하지 않는다는 표기 입니다.

이게 무슨 말이냐면요..

상용 또는 오픈소스(Hadoop, Storm, Zookeeper.. 등)들은 계속 발전해 나가기 위한 기업 또는 커뮤니티가 있습니다. 대표적인게 오픈소스진영의 아파치 그룹들이죠..

각각의 커뮤니티에선 새로운 기능들을 계속 추가하고 버젼도 올리는데요, 이때 필요시 기존의 발견된 버그나 개션이 필요한 기능들은 수정 또는 삭제해서 다음 버젼을 릴리즈 합니다.

하지만 이때 새로운 버젼에서 곧바로 특정 기능을 삭제하면 문제가 될 수 있습니다. 개발자가 버젼업을 했는데 해당 기능이 아예 없다면 곧바로 오류가 발생할 꺼니깐요..(치명적인 버그는 곧바로 삭제하기도 합니다. ㅎㅎ)

보통은 메이져 버젼이 올라가기 전까지는 남겨두고, 대신 Deprecated 될꺼니 관련 기능을 사용하거나 의존성을 갖는 코드들을 빨리 조치하라고 시간을 주는 것이라고 보면 됩니다.

Deprecated된 기능은 최대한 사용하지 않는게 좋습니다. 하지만 의존성을 같는 다른 SW들이 해당 기능에 맞춰 같이 업그레이드 되지 않았을 경우 불가피하게 사용할 수 밖에 없습니다~

-빅디 드림

자세한 설명 감사합니다.

build시 사용한 java 버전을 알려 주시기 바랍니다.

감사합니다.

 

아...제가 잘못 이해한 것 같습니다.

java관련 호환성이 아니라 apache 호환 문제로 이해해야 맞는 것 같습니다.

그런데 그렇다면 pom.xml에 버전 명시하여 프로젝트를 빌드하셨을 텐데...왜 deprecated 경고가 발생하는지요?

빅디님의 프로필 이미지
빅디
Instructor

네~ skchun69님!

사실 본인은 Deprecated 경고를.. 특별한 경우가 아니면 민감하게 생각하지 않습니다. ^^;;;

다양한 오픈소스 라이브러리를 적용해 개발 프레임웍을 구성할때 이 의존성 문제가 매우 빈번히 발생하게 되는데, 요걸 하나하나 잡아가면서 진행 하는게 여간 귀찮고 힘든 작업이기 때문입니다.

대신 환경의 변화가 발생 하면, 빌드 > 테스트 등을 꼼꼼히 진행하면서 발생한 문제를 해결하는 편입니다.

Deprecated된 기능을 사용할지, 아니면 대체된 기능을 사용할지는 개발 편의성과 생산성, 중요도, 향후 확장성등을 고려하셔서 판단 하시면 됩니다.

-빅디 드림

빅디님

그런데 Topology는 export 할때 jar로 합니까? runnable jar로 합니까?

 

빅디님의 프로필 이미지
빅디
Instructor

안녕하세요! 빅디 입니다.

제공드린 스톰 프로젝트 소스는 Maven 프로젝트로 구성 되어 있습니다.

그리고 메이븐의 pom.xml에 정의된 build 옵션은 아래와 같은데요..

<executions>

<execution>

<phase>package</phase>

<goals>

<goal>shade</goal>

</goals>

</execution>

</executions>

<goals>이 shade로 구성 되어 있습니다. shade 플러그인은 꼭 필요한 클래스들만 포함을 시키면서 스톰의 Main 클래스인, SmartCarDriverTopology.java 도 함께 포함 되고요...
pom.xml의 Maven의 Maven Install 명령을 하면 sade 구조의 jar파일인 bigdata.smartcar.storm-1.0.jar이 자동으로 생성 됩니다.

그리고 해당 jar를 강의에서 사용한 아래 명령으로 실행 시키는 방식 입니다.

storm jar bigdata.smartcar.storm-1.0.jar com.wikibook.bigdata.smartcar.storm.

SmartCarDriverTopology DriverCarInfo

위에서 처럼 storm 명령에서 앞서 빌드에서 만들어진 jar(bigdata.smartcar.storm-1.0.jar)를 가지고, Main 클래스인 SmartCarDriverTopology를 명시적으로 지정해 실행하기 때문에, Export jar or Runnable jar 인지 고민하실 필요는 없습니다.

어떤 방식인지 꼭 찍어 말해야 한다면 Export jar 방식에 가깝다고 볼 수 있습니다~

-빅디 드림

답변 황송합니다...

기초 지식없이 무작정 따라하다가... 많은 폐를 끼칩니다.

기존 POM 파일로 컴파일하면 계속 error가 발생하여 검색하다 보니까 maven-compiler-plugin compiler 버전 명시안해서 그런다고 합니다. 일단 해결했습니다.

storm에 배포해서 정상 동작여부 확인해 보겠습니다.

감사합니다.

빅디님의 프로필 이미지
빅디
Instructor

네~ skchun69님!

앞으로 더 많은 질문 해주셔도 괜찮습니다. ^^

파일럿 프로젝트 끝까지 화이팅 입니다!!

-빅디 드림

안녕하세요? 빅디님

배포했는데...에러 발생합니다.

Windows10에서 Eclipse 사용하는데 이런 storm topology application은 어떻게 debugging을 할 수 있습니까?

Windows용 JAVA app debugging하는 것처럼 step by step으로 실행해 가면서 할 수 있습니까?

감사합니다.

빅디님의 프로필 이미지
빅디
Instructor

안녕하세요! skchun69님!

스톰 토폴로지는 일반 애플리케이션 처럼 IDE(이클립스) 상에서 디거깅 모드가 어렵습니다.

방법은 ...

  1. Storm 서버에 배포중 문제가 없는지,

  2. 토폴로지가 정상적으로 올라 오는지,

  3. 실시간 데이터를 정상적으로 처리하는지,

     

위 3단계를 점검 해야 합니다.

점검 방법은 Storm의 UI에서 1,2번을 확인하고

Storm 로그를 통해 1,2,3 번을 확인해 보셔야 합니다~

-빅디 드림

빅디님

안녕하세요?

많은 도움으로 드디어 5장 완료하였습니다.

Cloudera(7.4.4), Kafka(2.5)와 Strom(2.4.0) 등의 버전이 책과 차이 나서 문제였던 것으로 판단 됩니다. 최근 버전으로 모두 bulid하여 배포에 성공 했지만 계속 Error가 발생 했습니다.

원인은 SplitBolt와 EsperBolt 의 execute method의 Tuple parameter 객첵 구조가 책과 많이 다른 것을 확인하였습니다.

String tValue = tuple.getString(0); Logger로 확인보니 "SmartCarTopic"올 나옵니다.

=>

String tValue = tuple.getStringByField("value"); 로 변경하였습니다.

최종적으로 HBase, redis 적재 내용이 책과 동일함을 확인하였습니다.

이후 진행시에도 자주 질문 드릴 것 같은데... 많은 도움 부탁드립니다.

감사합니다.

빅디님의 프로필 이미지
빅디
Instructor

네~ skchun69님!

파일럿 환경을 바꿔가며.. 아주 중요한 경험을 하셨네요!!! ^^

파일럿 프로젝트 끝까지 좋은경험 쌓아보세요~

-빅디 드림

안녕하세요? 빅디님

Host PC에서 server 3개 운영하는게 너무 무거워서(메모리를 너무 많이 사용) 최근 Host PC를 1대 더 구축했습니다.

기존 Host PC에 server02,

새로 구축한 Host PC에 server01 과 server03

을 실행하려고 하는데...실행 후 서로 통신이 안되더군요.

버추얼박스 관련 검색 해 봤는데 뭐 특별히 설정해야 할 것은 못 찾겠더군요.

혹시 점검해야 할 사항 있을까요?

감사합니다.

 

빅디님의 프로필 이미지
빅디
Instructor

안녕하세요! skchun69님!

2대의 호스트 PC를 이용 하시려면, 호스트 PC들의 네트워크 환경이 중요 합니다.

호스트 PC가 동일 네트워크 대역에서 부여된 IP가 있다면, 버츄얼얼박스의 호스트전용 어댑터와 포트포워딩 등의 설정으로 가능합니다.

그렇지 않다면 호스트 PC의 IP가 유동적이여서 호스트 PC간의 통신이 문제가 되고, VM Server 01,02,03 간에도 통신이 되질 않습니다.

먼저 점검 하셔야 헐 것은..

호스트 PC1 <--> PC2 간의 네트워크 통신에 문제가 없어야 합니다.

간단한 테스트로 호스트 PC1 <--> PC2 양쪽에서 ping 명령을 날렸을때 문제가 없어야 하고, 호스트 PC에 부여된 네트워크 정보가 고정된 상태여야 합니다~

-빅디 드림

안녕하세요? 빅디님

이전 문의 드렸던 네트워크 문제는 잘 해결했습니다. 조언대로 공유기의 네트워크를 조정해서 해결했습니다.

이후 진행중 P.278 그림 6.97의 HQL 16번째 줄 location '/pilot-pjt/collect/drive-log/' 경로를 이해 못해서 문의 드립니다.

이 HQL은 HBase 의 DriverCarInfo 테이블을 Hive 테이블로 재구성하기 위한 것으로 아는데 왜 파일 경로를 지정하는지 이해가 안되며 실제 HDFS 상에 위 경로는 만들어진적이 없는 것 같습니다.

매번 빠른 답변 감사드리며 이번에도 부탁 드립니다.

 

빅디님의 프로필 이미지
빅디
Instructor

네~ 요 부분 설명이 좀 부족 했나 봅니다. ^^;;

"Hive 테이블로 재구성 한다..."는 부분에서 헷갈릴 수 있을 것 같은데요,

이 말을 다시 풀어 설명 드리자면, HBase에 연결된 하이브의 SmartCar_Drive_info 테이블의 데이터를, 일부 가공해서 SmartCar_Drive_Info_2 테이블에 집어 넣겠다는 의미 입니다. 다음 그림 6.98에서 보면 Select/Insert 쿼리가 관련된 작업을 하게 됩니다.

즉 SmartCar_Driver_Info_2 테이블은 일반 하이브 테이블이고, 하이브 테이블의 데이터가 저장 될 위치를 다른 하이브 테이블 처럼 명시적으로 지정한 것입니다~

해당 위치에 파일이 만들어 지지 않은건 어떤 문제가 있었을 확률이 높습니다.

-빅디 드림

빅디님

빠른 답변 감사합니다.

저장 경로란 말씀이시죠?

저는 이 경로에 HBase 파일이 있어야 파일 구조를 보고 Hive table 이 만들어 지는 것으로 이해 했었습니다.

create table 단계에서 error가 발행해서 insert table을 아직 못한 상황입니다.

감사합니다.

jungsikyeo's profile image
jungsikyeo

asked

Ask a question