/** 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
}
}