
# Storm-HBase开发指引
#### 操作场景
本章节只适用于MRS产品中Storm和HBase交互的场景。本章中描述的jar包的具体版本信息请以实际情况为准。
安全模式下登录方式分为两种，票据登录和keytab文件登录，两种方式操作步骤基本一致。票据登录方式为开源提供的能力，存在票据过期问题，后期需要人工上传票据，并且可靠性和易用性较差，因此推荐使用keytab方式。
#### 应用开发操作步骤
1. 确认Storm和HBase组件已经安装，并正常运行。
2. 将storm-examples导入到Eclipse开发环境，请参见[导入并配置Storm样例工程](https://support.huaweicloud.com/devg-mrs/mrs_06_0269.html)。
3. 如果集群启用了安全服务，按登录方式分为以下两种。
   
   - keytab方式：需要从管理员处获取一个"人机"用户，用于认证，并且获取到该用户的keytab文件。
   
   - 票据方式：从管理员处获取一个"人机"用户，用于后续的安全登录，开启Kerberos服务的renewable和forwardable开关并且设置票据刷新周期，开启成功后重启kerberos及相关组件。
   
   
   ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
   - 获取的用户需要属于storm组。
   
   - Kerberos服务的renewable、forwardable开关和票据刷新周期的设置在Kerberos服务的配置页面的"系统"标签下，票据刷新周期的修改可以根据实际情况修改"kdc_renew_lifetime"和"kdc_max_renewable_life"的值。
    
   
   
4. 下载并安装HBase客户端程序。
5. 获取相关配置文件。获取方法如下。 
   在安装好的hbase客户端目录下找到目录"/opt/client/HBase/hbase/conf"，在该目录下获取到core-site.xml、hdfs-site.xml、hbase-site.xml配置文件。将这些文件拷贝到示例工程的 src/main/resources目录。
   如果使用keytab登录方式，按[3]获取keytab文件；如果使用票据方式，则无需获取额外的配置文件。
   ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
   获取到的keytab文件默认文件名为user.keytab，若用户需要修改，可直接修改文件名，但在提交任务时需要额外上传修改后的文件名作为参数。
   
   
 
#### Eclipse代码样例
创建Topology。
```
public static void main(String[] args) throws Exception   
      {  
          Config conf = new Config(); 
          //增加kerberos认证所需的plugin到列表中，安全模式需要设置  
          setSecurityConf(conf,AuthenticationType.KEYTAB); 
          if(args.length >= 2)  
          {  
          //用户更改了默认的keytab文件名，这里需要将新的keytab文件名通过参数传入  
          conf.put(Config.STORM_CLIENT_KEYTAB_FILE, args[1]);  
          }  
          //hbase的客户端配置，这里只提供了“hbase.rootdir”配置项，参数可选  
          Map<String, Object> hbConf = new HashMap<String, Object>();  
          if(args.length >= 3)  
          {  
              hbConf.put("hbase.rootdir", args[2]);  
          }  
          //必配参数，若用户不输入，则该项为空  
          conf.put("hbase.conf", hbConf);  
          //spout为随机单词spout  
          WordSpout spout = new WordSpout();  
          WordCounter bolt = new WordCounter();  
          //HbaseMapper，用于解析tuple内容  
          SimpleHBaseMapper mapper = new SimpleHBaseMapper()  
                  .withRowKeyField("word")  
                  .withColumnFields(new Fields("word"))  
                  .withCounterFields(new Fields("count"))  
                  .withColumnFamily("cf");  
          //HBaseBolt，第一个参数为表名  
          //withConfigKey("hbase.conf")将hbase的客户端配置传入HBaseBolt  
          HBaseBolt hbase = new HBaseBolt("WordCount", mapper).withConfigKey("hbase.conf");  
          // wordSpout ==> countBolt ==> HBaseBolt  
          TopologyBuilder builder = new TopologyBuilder();  
          builder.setSpout(WORD_SPOUT, spout, 1);  
          builder.setBolt(COUNT_BOLT, bolt, 1).shuffleGrouping(WORD_SPOUT);  
          builder.setBolt(HBASE_BOLT, hbase, 1).fieldsGrouping(COUNT_BOLT, new Fields("word"));  
          //命令行提交拓扑  
          StormSubmitter.submitTopology(args[0], conf, builder.createTopology());  
  }
```
#### 部署运行及结果查看
1. 在Storm示例代码根目录执行如下命令打包："mvn package"。执行成功后，将会在target目录生成storm-examples-1.0.jar。
2. 执行命令提交拓扑。 
   keytab方式下，若用户修改了keytab文件名，如修改为"huawei.keytab"，则需要在命令中增加第二个参数进行说明，提交命令示例（拓扑名为hbase-test）：
   **storm jar /opt/jartarget/** storm-examples-1.0.jar**com.huawei.storm.example.hbase.SimpleHBaseTopology hbase-test huawei.keytab**
   ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
   安全模式下在提交source.jar之前，请确保已经进行kerberos安全登录，并且keytab方式下，登录用户和所上传keytab所属用户必须是同一个用户。
   因为示例中的HBaseBolt并没有建表功能，在提交之前确保hbase中存在相应的表，若不存在需要手动建表，hbase shell建表语句如下create 'WordCount', 'cf'。
   安全模式下hbase需要用户有相应表甚至列族和列的访问权限，因此首先需要在hbase所在集群上使用hbase管理员用户登录，之后在hbase shell中使用grant命令给提交用户申请相应表的权限，如示例中的WordCount，成功之后再使用提交用户登录并提交拓扑。
   
   
3. 拓扑提交成功后请自行登录HBase集群查看WordCount表是否有数据生成。
4. 如果使用票据登录，则需要使用命令行定期上传票据，具体周期由票据刷新截止时间而定，步骤如下。 
   1. 在安装好的storm客户端目录的Storm/storm-0.10.0/conf/storm.yaml文件尾部新起一行添加如下内容。 topology.auto-credentials:
      - backtype.storm.security.auth.kerberos.AutoTGT
      
   
   2. 执行命令：**./storm upload-credentials hbase-test**
   
   
   
   
 
