用Java访问带有Kerberos认证的HBase

程序代码实例如下:

  
package com.hbasedemo;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.security.UserGroupInformation;

public class Test {
       private static Configuration conf = null;

       static {

             // 这个配置文件主要是记录 kerberos的相关配置信息,例如KDC是哪个IP?默认的realm是哪个?
             // 如果没有这个配置文件这边认证的时候肯定不知道KDC的路径喽
             // 这个文件也是从远程服务器上copy下来的
            System. setProperty("java.security.krb5.conf""C:/Users/dongzeguang/Downloads/krb5.conf" );
            
             conf = HBaseConfiguration.create();
             conf.set("hadoop.security.authentication" , "Kerberos" );
             // 这个hbase.keytab也是从远程服务器上copy下来的, 里面存储的是密码相关信息
             // 这样我们就不需要交互式输入密码了
             conf.set("keytab.file" , "C:/Users/Downloads/hbase.keytab" );
             // 这个可以理解成用户名信息,也就是Principal
             conf.set("kerberos.principal" , "hbase/1722.myip.domain@HADOOP.COM" );           
            UserGroupInformation. setConfiguration(conf);
             try {
                  UserGroupInformation. loginUserFromKeytab("hbase/1722.myip.domain@HADOOP.COM""C:/Users/Downloads/hbase.keytab" );
            } catch (IOException e) {
                   // TODO Auto-generated catch block
                  e.printStackTrace();
            }
      }

       public static void scanSpan(final String tableName) throws Exception {
            HTable table =  new HTable(conf, tableName);
            System. out.println("tablename:" +new String(table.getTableName()));
            Scan s new Scan();
            ResultScanner rs = table.getScanner(s);
            
             for (Result r : rs) {
                  System. out.println(r.toString());
                  KeyValue[] kv = r. raw();
                   for (int i = 0; i < kv.length; i++) {
                        System. out.print(new String(kv[i].getRow()) + "");
                        System. out.print(new String(kv[i].getFamily()) + ":");
                        System. out.print(new String(kv[i].getQualifier() ) + "" );
                        System. out.print(kv[i].getTimestamp() + "" );
                        System. out.println(new String(kv[i].getValue() ));
                  }
            }

      }

       /**
       * @param args
       */
       public static void main(String[] args) {
             // TODO Auto-generated method stub
             try {
                  Test. scanSpan("h_span");
            } catch (Exception e) {
                   // TODO Auto-generated catch block
                  e.printStackTrace();
            }
      }

}

 

转载于:https://www.cnblogs.com/felixzh/p/11586865.html

### 如何在 Flink SQL 中与启用了 Kerberos 认证HBase 进行交互 为了使 Apache Flink 能够连接到启用了 KerberosHBase 实例,在配置过程中需要特别注意几个方面。由于直接通过 Flink SQL 配置 Kerberos 参数存在局限性,通常推荐采用 DataStream API 结合自定义 Sink 函数的方式实现这一目标。 #### 使用 DataStream 和自定义 Sink 函数 当仅修改 `HbaseUpsertSinkFunction` 时,确实无法直接利用 SQL 来设置必要的 Kerberos 相关属性[^3]。因此,建议先执行标准的 SQL 查询操作获取数据流,随后转换成 retract 流并应用定制化的 sink 处理逻辑: ```java // 假设已经有一个 TableEnvironment env; Table result = env.sqlQuery("SELECT * FROM source_table"); // 将表转为可撤回的数据流 DataStream<Row> retractedStream = result.execute().toRetractStream(); retractedStream.addSink(new HbaseUpsertSinkFunction()); ``` 这里的关键在于构建合适的 `HbaseUpsertSinkFunction` 类实例,并在其内部正确初始化带有 Kerberos 安全性的 HBase 连接上下文。具体来说就是将所需的 Kerberos 设置加入 Configuration 对象中[^2]: ```java Configuration conf = HBaseConfiguration.create(); conf.set("keytab.file", "path/to/keytab/file"); conf.set("hbase.master.kerberos.principal", "principal_name"); conf.set("hbase.regionserver.kerberos.principal", "principal_name"); conf.set("kerberos.principal", "service_principal@REALM"); try { Connection connection = ConnectionFactory.createConnection(conf); } catch (IOException e) { throw new RuntimeException(e); } ``` 需要注意的是,上述代码片段中的路径和主体名称应当替换为实际环境下的对应值。 对于希望完全依赖于纯 SQL 接口的情况,则可能不得不等待社区进一步发展或是探索其他变通方案,比如借助外部作业管理工具预先加载认证信息至 JVM 上下文中等方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值