2014-07-07 3 views
2

배포 된 (로컬이 아닌) Storm 토폴로지에서 HBase에 새로운 항목을 쓸 수 있기를 원합니다. 튜플을 HBase에 쓰려면 HBase Mappers 또는 pre-made Storm bolts을 제공하는 몇 가지 GitHub 프로젝트가 있습니다. 이 프로젝트는 LocalCluster에서 샘플을 실행하기위한 지침을 제공합니다.Storm bolt에서 HBase로 행 삽입

이 두 프로젝트에서 실행 중이며 볼트에서 HBase API에 직접 액세스하는 문제는 클래스 패스에 HBase-site.xml 파일을 포함시켜야한다는 것입니다. 직접 API 접근법과 GitHub API를 사용하면 HBaseConfiguration.create();을 실행할 때 클래스 패스의 항목에서 필요한 정보를 찾으려고 시도합니다.

Hbase 구성 파일을 포함하도록 스톰 볼트의 클래스 경로를 수정하려면 어떻게해야합니까?

업데이트 : danehammer의 답변을 사용하여,이 내가 당신의 ~/.storm 디렉토리에

복사 다음 파일을 작업 그것을 가지고하는 방법입니다

  • HBase를-공통 0.98.0.2.1.2 0.0-402-hadoop2.jar
  • HBase를-site.xml의
  • storm.yaml : 참고 :이 디렉토리에 storm.yaml 복사하지 않는 경우, 폭풍 항아리 명령은 클래스 경로에 디렉토리를 사용하지 않습니다 (storm.py python script 자신을 위해 그 논리를 볼 수 - 좋을 텐데이 기록 된 경우)

다음, 토폴로지 클래스의 주요 방법으로 HBase를 구성을 얻을 직렬화 :

final Configuration hbaseConfig = HBaseConfiguration.create(); 
final DataOutputBuffer databufHbaseConfig = new DataOutputBuffer(); 
hbaseConfig.write(databufHbaseConfig); 
final byte[] baHbaseConfigSerialized = databufHbaseConfig.getData(); 

에 바이트 배열을 전달 생성자를 통해 스파우트 클래스. spout 클래스는이 바이트 배열을 필드에 저장합니다 (Spout에 Configuration 필드가있는 경우 토폴로지를 실행할 때 예외를 serialize 할 수 없음).

spout의 열기 방법에서, 는 config를 역 직렬화 및 액세스 HBase와 테이블 :

Configuration hBaseConfiguration = new Configuration(); 
ByteArrayInputStream bas = new ByteArrayInputStream(baHbaseConfigSerialized); 
hBaseConfiguration.readFields(new DataInputStream(bas)); 
HTable tbl = new HTable(hBaseConfiguration, HBASE_TABLE_NAME); 

Scan scan = new Scan(); 
scan.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("YOUR_COLUMN")); 

scnrTbl = tbl.getScanner(scan); 

을 지금, 당신의 nextTuple 방법은 다음 행 얻을 수있는 스캐너를 사용할 수 있습니다

Result rsltWaveform = scnrWaveformTbl.next(); 

추출이 결과에서 원하는 무엇을하고 통과 일부 직렬화 가능 객체의 값 볼트에 ct.

+0

더하기 하나는 생성자에서 바이트 배열을 비 직렬화하지 않는 것입니다. –

답변

2

"storm jar"명령을 사용하여 토폴로지를 배포하면 ~/.storm 폴더가 클래스 경로에 있습니다 (jar 명령의 this link 참조). 해당 폴더에 hbase-site.xml 파일 (또는 관련 * -site.xml 파일)을 배치하면 "storm jar"중에 HBaseConfiguration.create()이 해당 파일을 찾고 올바르게 org.apache.hadoop.configuration.Configuration을 반환합니다. 이 설정을 클러스터에 배포하려면 토폴로지 내에 저장하고 직렬화해야합니다.

+0

당신은 토폴로지 클래스 내부에 HBaseConfiguration을 생성 한 다음 직렬화하여 어떻게 든 볼트 (setBolt (...). addConfiguration 메소드)에 전달하겠습니까? –