Storm-HBase集成--配置和开发

来源:互联网 发布:网络如何赚钱 编辑:程序博客网 时间:2024/06/01 16:46

1 Storm0.9.3中的对HBase的集成

Storm新版本0.9.3中重新整理和加入了对Hbase的集成模块,除了基本的Bolt和Spout之外,加入了用于访问hbase的Trident。利用这个Trident,我们可以更加快速的编写Storm访问HBase的代码逻辑。

关于Storm-HBase模块中,几个主要的功能类如下:

类名介绍
org.apache.storm.hbase.trident.mapper.TridentHBaseMapper
把HBase的Row Key, 列簇和列,对应到Storm Trident中Tuple的Field
org.apache.storm.hbase.trident.mapper.SimpleTridentHBaseMapper
上面的HBaseMapper的一个简单继承实现,指定Rowkey的Field和列簇/列的Field
org.apache.storm.hbase.bolt.mapper.HBaseValueMapper
用户继承这个类来实现把HBase的Cell映射成Storm中的Tuple,这个类通常是被继承后使用
org.apache.storm.hbase.trident.state.HBaseUpdater
更新HBaseState的类
org.apache.storm.hbase.trident.state.HBaseState
Trident中负责HBase数据的状态类
org.apache.storm.hbase.trident.state.HBaseStateFactory
工厂类,负责生产HBaseState对象
org.apache.storm.hbase.bolt.mapper.HBaseProjectionCriteria
负责定义HBase数据到Storm Tuple的投影,需要指定HBase的表名,列族名和列
org.apache.storm.hbase.security.HBaseSecurityUtil
专门用于让Storm通过HBase集群的Kerberos安全验证的类

2 代码示例

下面是一个完整的从Kafka中读取数据,并写入HBase的代码(Trident模式)。

[html] view plain copy print?
  1. // Storm Tuple中的两个Field,分别叫做word 和 count  
  2. Fields fields = new Fields("word", "count");  
  3.    
  4. // 定义HBase配置相关和Kerberos相关  
  5. String hBaseConfigKey = "config_key";  
  6. System.setProperty("java.security.krb5.realm", "HADOOP.QIYI.COM");  
  7. System.setProperty("java.security.krb5.kdc", "kerberos-hadoop-dev001-shjj.qiyi.virtual");  
  8.    
  9. //载入HBase和Kerberos相关配置,Config对象是来自backtype.storm.Config 类  
  10. Config conf = new Config();  
  11. conf.setDebug(true);  
  12. Map<String, String> hBaseConfigMap = new HashMap<String, String>();  
  13. hBaseConfigMap.put(HBaseSecurityUtil.STORM_KEYTAB_FILE_KEY, "/home/yeweichen/yeweichen.keytab");  
  14. hBaseConfigMap.put(HBaseSecurityUtil.STORM_USER_NAME_KEY, "yeweichen@HADOOP.QIYI.COM");  
  15. conf.put("config_key", hBaseConfigMap);  
  16.    
  17. // 定义Trident拓扑,从Kafka中获取数据  
  18. TridentTopology tridentTopology = new TridentTopology();  
  19. BrokerHosts zk = new ZkHosts("10.121.43.14,10.121.43.17");  
  20. TridentKafkaConfig spoutConf = new TridentKafkaConfig(zk, "mytopic");  
  21. spoutConf.forceFromStart = true;  
  22. spoutConf.scheme = new SchemeAsMultiScheme(new StringScheme());  
  23. OpaqueTridentKafkaSpout spout = new OpaqueTridentKafkaSpout(spoutConf);  
  24.    
  25. //定义HBase的Mapper,指定“word”字段的内容作为rowkey,列族名为cf  
  26. TridentHBaseMapper tridentHBaseMapper = new SimpleTridentHBaseMapper()  
  27.         .withColumnFamily("cf")  
  28.         .withColumnFields(new Fields("word"))  
  29.         .withColumnFields(new Fields("count"))  
  30.         .withRowKeyField("word");  
  31.    
  32. // LogCollect就是自定义的Mapper  
  33. HBaseValueMapper rowToStormValueMapper = new LogCollectMapper();  
  34.    
  35. //定义投影类,加入cf列族中的word和count两个列  
  36. HBaseProjectionCriteria projectionCriteria = new HBaseProjectionCriteria();  
  37. projectionCriteria.addColumn(new HBaseProjectionCriteria.ColumnMetaData("cf", "word"));  
  38. projectionCriteria.addColumn(new HBaseProjectionCriteria.ColumnMetaData("cf", "count"));  
  39.    
  40. //定义HBaseState类的属性类Option  
  41. HBaseState.Options options = new HBaseState.Options()  
  42.         .withConfigKey(hBaseConfigKey)  
  43.         .withDurability(Durability.SYNC_WAL)  
  44.         .withMapper(tridentHBaseMapper)  
  45.         .withProjectionCriteria(projectionCriteria)  
  46.         .withRowToStormValueMapper(rowToStormValueMapper)  
  47.         .withTableName("storminput");  
  48.    
  49. //使用工厂方法和Option生成HBaseState对象  
  50. StateFactory factory = new HBaseStateFactory(options);  
  51.    
  52. //定义Stream,从Kafka中读出的数据,使用AddTimeFunction方法把它生成word和field两个字段,然后把他们写入HBase,如上面定义的,word字段作为row key  
  53. tridentTopology.newStream("myspout", spout).each(new Fields("str"), new AddTimeFunction(), new Fields("word", "count"))  
  54.         .partitionPersist(factory, fields, new HBaseUpdater(), new Fields());  
  55.    
  56. // 提交拓扑  
  57. StormSubmitter.submitTopology(args[0], conf,tridentTopology.build());  

原创粉丝点击