hbase等代码中kinit

在hadoop/hbase等代码中kinit

@(博客文章)[hadoop, hbase, storm, kafka]

(一)在java代码中kinit的方法

使用hadoop的UserGroupInformation
1、Set Kerberos login with the UserGroupInformation API:

import org.apache.hadoop.security.UserGroupInformation;
org.apache.hadoop.conf.Configuration conf = HBaseConfiguration.create();  
//注意,不能用set()等指定zk的方式。
conf.addResource("/path","hbase-site.xml");
conf.set("hadoop.security.authentication", "Kerberos");
UserGroupInformation.setConfiguration(conf);

2、Login with a keytab by calling the UserGroupInformation API:

UserGroupInformation.loginUserFromKeytab("[email protected]", "/path/to/example_user.keytab");

完整代码:

public class HBaseKerberosDemo {

    public static void main(String[] args) throws Exception {

        Configuration conf = HBaseConfiguration.create();
        //注意,不能用set()等指定zk的方式。
        conf.addResource("/path","hbase-site.xml");
        conf.set("hadoop.security.authentication", "Kerberos");
        UserGroupInformation.setConfiguration(conf);
        UserGroupInformation.loginUserFromKeytab(args[0], args[1]);

        Connection connection = ConnectionFactory.createConnection(conf);

        Table tbl = connection.getTable(TableName.valueOf(args[2]));
        Put put = new Put(Bytes.toBytes("r1"));
        put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("c1"), Bytes.toBytes("v1"));
        tbl.put(put);
        tbl.close();
        connection.close();

    }   
}

(二)定时刷新

kinit会有超时时间,如果程序需要长时间运行,则需要定时去刷新一下,可以通过一个线程来实现。

这种应用场景常见于storm,在storm中提供了TickTuple来实现这种定时功能。
事实证明不需要定时refresh的,在storm需要操作hbase的bolt的prepare()方法中添加以下代码。

    Configuration config = HBaseConfiguration.create();
    //根据实际路径设置,也可以使用逐个参数添加的方式,但建议使用系统的hbase-site.xml。
    config.addResource(new Path("/home/hadoop/conf/hbase", "hbase-site.xml"));
    config.set("hadoop.security.authentication", "Kerberos");
    UserGroupInformation.setConfiguration(config);
    try {
    UserGroupInformation.loginUserFromKeytab("[email protected]", "/path/to/example_user.keytab");
    } catch (IOException e) {
        e.printStackTrace();
    }

你可能感兴趣的:(hadoop,hbase)