Flume SimpleHbaseEventSerializer 类解析
SimpleHbaseEventSerializer类中包括的函数有
- SimpleHbaseEventSerialzer函数:这是构造函数
- configure(ComponentConfiguration conf)函数:这个函数空白。
- close()函数:这是个关闭函数,我估计是是否资源用的。
- configure(Context context)函数:这个函数的主要作用是从flume的配置文件中读取信息。
- initalize(Event event, byte[] cf):从event中读取内容,并配置HBase的column family
- getActions():创建put变量,每个put对应着hbase的一行数据。
- getIncrements():将hbase的自增列加1
Configure(Context context)函数
// 读取flume配置文件中的rowPrefix,rowPrefix的默认值是default rowPrefix = context.getString("rowPrefix", "default"); // 读取flume配置文件中的incrementRow,默认值是inRow incrementRow = context.getString("incrementRow", "incRow").getBytes(Charsets.UTF_8); // 读取flume配置文件中的suffix,默认值是uuid String suffix = context.getString("suffix", "uuid"); // 读取flume配置文件中的payloadColumn,默认之是pCol。payloadColumn对应这hbase的列名 String payloadColumn = context.getString("payloadColumn","pCol"); // 读取flume配置文件中的incrementColumn,默认值是iCol String incColumn = context.getString("incrementColumn","iCol"); if(payloadColumn != null && !payloadColumn.isEmpty()) { // 这几行代码是配置hbase中的rowkey前缀 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; } plCol = payloadColumn.getBytes(Charsets.UTF_8); } if(incColumn != null && !incColumn.isEmpty()) { incCol = incColumn.getBytes(Charsets.UTF_8); }
对于Configure函数,主要需要说明的flume配置文件和代码之间的对应关系。
比如,如果你在flume的配置文件中有一行如: a1.sinks.k1.serializer.payloadColumn=colName。
那么Configure函数中的context.getString("payloadColumn", "pCol")的返回值就是colName.
那么Configure函数中的context.getString("payloadColumn", "pCol")的返回值就是colName.
同样如果你设置 a1.sinks.k1.serializer.rowPrefix=123456, 那么context.getString("rowPrefix", "default")的返回值就是123456.
initalize(Event event, byte[] cf)函数
public void initialize(Event event, byte[] cf) { this.payload = event.getBody(); this.cf = cf; }
这个函数代码简单,cf表示hbase中的column family; event是flume的一个事件,是flume数据流中的一个data object。如果flume的source是文本文件的话,文件中的每一行就会产生一个flume event。
getActions()函数
public List<Row> getActions() throws FlumeException { List<Row> actions = new LinkedList<Row>(); if(plCol != null){ byte[] rowKey; try { // 配置rowkey,具体靠参考SimpleRowKeyGenerator类 if (keyType == KeyType.TS) { rowKey = SimpleRowKeyGenerator.getTimestampKey(rowPrefix); } else if(keyType == KeyType.RANDOM) { rowKey = SimpleRowKeyGenerator.getRandomKey(rowPrefix); } else if(keyType == KeyType.TSNANO) { rowKey = SimpleRowKeyGenerator.getNanoTimestampKey(rowPrefix); } else { rowKey = SimpleRowKeyGenerator.getUUIDKey(rowPrefix); } // 创建rowkey的一个put Put put = new Put(rowKey); // 在put中添加一列数据。columnfamily是cf,colunname是plCol,value是payload。 // plCol是payloadColumn的byte形式。而payloadColumn初始化于Configure函数,来自于flume的配置文件 // payload初始化于initalize函数,来自于event put.add(cf, plCol, payload); actions.add(put); } catch (Exception e){ throw new FlumeException("Could not get row key!", e); } } return actions; }
getActions函数,它生成一个put实例,put最后插入到hbase中。需要注意的是put实例中所有的数据来源。
plCol来自于payloadColumn, payloadColumn来自于flume的配置文件;cf也是来自于flume配置文件;payload来自于event。
plCol来自于payloadColumn, payloadColumn来自于flume的配置文件;cf也是来自于flume配置文件;payload来自于event。
plCol对应hbase中的colum, cf对应hbase中的columnfamily,payload对应hbase中的value。
getIncrement()函数
public List<Increment> getIncrements(){ List<Increment> incs = new LinkedList<Increment>(); if(incCol != null) { Increment inc = new Increment(incrementRow); inc.addColumn(cf, incCol, 1); incs.add(inc); } return incs; }
该函数作用是在hbase增添一个自增序列。

浙公网安备 33010602011771号