java flume hbase_flume 自定义 hbase sink 类

该博客详细介绍了 Apache Flume 中一个名为 BaimiAsyncHbaseEventSerializer 的异步 HBase 事件序列化器的实现。内容涵盖了初始化配置、序列化事件到 HBase 的 Put 请求、原子增量操作以及配置方法。通过这个序列化器,可以高效地将 Flume 事件存储到 HBase 数据库中。
摘要由CSDN通过智能技术生成

/** Licensed to the Apache Software Foundation (ASF) under one

* or more contributor license agreements. See the NOTICE file

* distributed with this work for additional information

* regarding copyright ownership. The ASF licenses this file

* to you under the Apache License, Version 2.0 (the

* "License"); you may not use this file except in compliance

* with the License. You may obtain a copy of the License at

*

*http://www.apache.org/licenses/LICENSE-2.0*

* Unless required by applicable law or agreed to in writing,

* software distributed under the License is distributed on an

* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

* KIND, either express or implied. See the License for the

* specific language governing permissions and limitations

* under the License.*/

packageorg.apache.flume.sink.hbase;importjava.util.ArrayList;importjava.util.List;importorg.apache.flume.Context;importorg.apache.flume.Event;importorg.apache.flume.FlumeException;importorg.hbase.async.AtomicIncrementRequest;importorg.hbase.async.PutRequest;importorg.apache.flume.conf.ComponentConfiguration;importorg.apache.flume.sink.hbase.SimpleHbaseEventSerializer.KeyType;importcom.google.common.base.Charsets;public class BaimiAsyncHbaseEventSerializer implementsAsyncHbaseEventSerializer {private byte[] table;private byte[] cf;private byte[][] payload;private byte[][] payloadColumn;private final String payloadColumnSplit = "\\^A";private byte[] incrementColumn;privateString rowSuffix;privateString rowSuffixCol;private byte[] incrementRow;privateKeyType keyType;

@Overridepublic void initialize(byte[] table, byte[] cf) {this.table =table;this.cf =cf;

}

@Overridepublic ListgetActions() {

List actions = new ArrayList();if(payloadColumn != null){byte[] rowKey;try{switch(keyType) {caseTS:

rowKey=SimpleRowKeyGenerator.getTimestampKey(rowSuffix);break;caseTSNANO:

rowKey=SimpleRowKeyGenerator.getNanoTimestampKey(rowSuffix);break;caseRANDOM:

rowKey=SimpleRowKeyGenerator.getRandomKey(rowSuffix);break;default:

rowKey=SimpleRowKeyGenerator.getUUIDKey(rowSuffix);break;

}//for 循环,提交所有列和对于数据的put请求。

for (int i = 0; i < this.payload.length; i++)

{

PutRequest putRequest= newPutRequest(table, rowKey, cf,payloadColumn[i], payload[i]);

actions.add(putRequest);

}

}catch(Exception e){throw new FlumeException("Could not get row key!", e);

}

}returnactions;

}public ListgetIncrements(){

List actions = newArrayList();if(incrementColumn != null) {

AtomicIncrementRequest inc= newAtomicIncrementRequest(table,

incrementRow, cf, incrementColumn);

actions.add(inc);

}returnactions;

}

@Overridepublic voidcleanUp() {//TODO Auto-generated method stub

}

@Overridepublic voidconfigure(Context context) {

String pCol= context.getString("payloadColumn", "pCol");

String iCol= context.getString("incrementColumn", "iCol");

rowSuffixCol= context.getString("rowPrefixCol", "mac");

String suffix= context.getString("suffix", "uuid");if(pCol != null && !pCol.isEmpty()) {if(suffix.equals("timestamp")){

keyType=KeyType.TS;

}else if (suffix.equals("random")) {

keyType=KeyType.RANDOM;

}else if(suffix.equals("nano")){

keyType=KeyType.TSNANO;

}else{

keyType=KeyType.UUID;

}//从配置文件中读出column。

String[] pCols = pCol.replace(" ", "").split(",");

payloadColumn= new byte[pCols.length][];for (int i = 0; i < pCols.length; i++)

{//列名转为小写

payloadColumn[i] =pCols[i].toLowerCase().getBytes(Charsets.UTF_8);

}

}if(iCol != null && !iCol.isEmpty()) {

incrementColumn=iCol.getBytes(Charsets.UTF_8);

}

incrementRow=context.getString("incrementRow", "incRow").getBytes(Charsets.UTF_8);

}

@Overridepublic voidsetEvent(Event event) {

String strBody= newString(event.getBody());

String[] subBody= strBody.split(this.payloadColumnSplit);if (subBody.length == this.payloadColumn.length)

{this.payload = new byte[subBody.length][];for (int i = 0; i < subBody.length; i++)

{this.payload[i] =subBody[i].getBytes(Charsets.UTF_8);if ((new String(this.payloadColumn[i]).equals(this.rowSuffixCol)))

{//rowkey 前缀是某一列的值, 默认情况是mac地址

this.rowSuffix =subBody[i];

}

}

}

}

@Overridepublic voidconfigure(ComponentConfiguration conf) {//TODO Auto-generated method stub

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值