배포 된 (로컬이 아닌) 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.
더하기 하나는 생성자에서 바이트 배열을 비 직렬화하지 않는 것입니다. –