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.
同样如果你设置 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对应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增添一个自增序列。

posted @ 2017-01-18 10:49  蚂蚁总督  阅读(554)  评论(0)    收藏  举报