Flume SimpleHbaseEventSerializer 类解析

     flume官网上介绍了很多sink/source;

     这篇51cto博客有很多示例介绍;

     HBaseSink/AsyncHBaseSink我是基于这篇apche官网博客做的。

     我首先将详细介绍 SimpleHbaseEventSerializer.java 代码

     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增添一个自增序列。





你可能感兴趣的:(Flume,source,sink)