如何使用Java代码访问Kerberos环境下的Kudu
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Java代码访问Kerberos环境下的Kudu相关的知识,希望对你有一定的参考价值。
温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
Fayson的github:
提示:代码块部分可以左右滑动查看噢
1
文档编写目的
前面Fayson介绍了《如何使用Java API访问CDH的Kudu》,文章是在非安全环境下实现,随着对集群安全要求的提高,在Kerberos环境下的使用API访问Kudu也会有一些变化,本篇文章Fayson主要介绍如何使用Java代码访问Kerberos环境下的Kudu。
- 内容概述
1.环境准备
2.Kerberos环境示例代码及运行
3.总结
- 测试环境
1.CDH版本为5.15.0
2.OS为Redhat7.2
3.Kudu版本为1.7.0
- 前置条件
1.CDH集群运行正常
2.集群已启用Kerberos
2
环境准备
使用IDE工具通过Maven创建一个Java工程,具体创建过程就不详细描述了。
1.在工程的pom.xml文件中增加如下依赖
<dependency>
<groupId>org.apache.kudu</groupId>
<artifactId>kudu-client</artifactId>
<version>1.7.0-cdh5.15.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0-cdh5.15.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.0-cdh5.15.0</version>
</dependency>
2.集群为Kerberos,需要导出一个keytab文件用于访问HDFS,导出步骤如下
在CMD命令行执行如下命令导出AD中用户的keytab文件
ktpass -princ hdfs/admin@FAYSON.COM -mapuser hdfs/admin -pass 123!QAZ -out hdfsadmin.keytab -crypto RC4-HMAC-NT
(可左右滑动)
导出的keytab文件会在当前命令执行目录。
3.获取集群krb5.conf文件,内容如下
[root@cdh4 ~]# more /etc/krb5.conf
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
includedir /var/lib/sss/pubconf/krb5.include.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = true
default_realm = FAYSON.COM
#default_ccache_name = KEYRING:persistent:%uid
[realms]
FAYSON.COM =
kdc = adserver.fayson.com
admin_server = adserver.fayson.com
[domain_realm]
.fayson.com = FAYSON.COM
fayson.com = FAYSON.COM
(可左右滑动)
4.配置hosts文件,确保本地开发环境与集群所有节点通且端口均放通
5.通过Cloudera Manager下载HDFS客户端配置
6.将上述准备的配置文件及keytab等信息拷贝至本地目录或工程中,Fayson的工程目录结构如下:
3
第一标题
1.ClientUtils类主要提供客户端初始化方法,内容如下:
package com.cloudera.utils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;
import java.util.Properties;
/**
* package: com.cloudera.utils
* describe: 客户端工具类
* creat_user: Fayson
* email: htechinfo@163.com
* creat_date: 2018/11/14
* creat_time: 下午10:17
* 公众号:Hadoop实操
*/
public class ClientUtils
/**
* 初始化访问Kerberos访问
* @param debug 是否启用Kerberos的Debug模式
*/
public static void initKerberosENV(Boolean debug)
try
Properties properties = new Properties();
properties.load(ClientUtils.class.getClass().getResourceAsStream("/client.properties
"));
System.setProperty("java.security.krb5.conf", properties.getProperty("krb5.conf.path"));
System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
if (debug) System.setProperty("sun.security.krb5.debug", "true");
Configuration configuration = new Configuration();
configuration.addResource(ClientUtils.class.getClass().getResourceAsStream("/hdfs-client-kb/core-site.xml"));
configuration.addResource(ClientUtils.class.getClass().getResourceAsStream("/hdfs-client-kb/hdfs-site.xml"));
UserGroupInformation.setConfiguration(configuration);
UserGroupInformation.loginUserFromKeytab(properties.getProperty("kerberos.user"), properties.getProperty("kerberos.keytab.path"));
System.out.println(UserGroupInformation.getCurrentUser());
catch(Exception e)
e.printStackTrace();
(可左右滑动)
2.KuduUtils用于操作Kudu的工具类,建表、查询数据、删除表等操作
package com.cloudera.utils;
import com.cloudera.RandomUserInfo;
import org.apache.kudu.ColumnSchema;
import org.apache.kudu.Schema;
import org.apache.kudu.Type;
import org.apache.kudu.client.*;
import java.util.ArrayList;
import java.util.List;
/**
* package: com.cloudera.utils
* describe: TODO
* creat_user: Fayson
* email: htechinfo@163.com
* creat_date: 2018/11/15
* creat_time: 上午12:31
* 公众号:Hadoop实操
*/
public class KuduUtils
/**
* 使用Kudu API创建一个Kudu表
* @param client
* @param tableName
*/
public static void createTable(KuduClient client, String tableName)
List<ColumnSchema> columns = new ArrayList<>();
//在添加列时可以指定每一列的压缩格式
columns.add(new ColumnSchema.ColumnSchemaBuilder("id", Type.STRING).key(true). compressionAlgorithm(ColumnSchema.CompressionAlgorithm.SNAPPY).build());
…
Schema schema = new Schema(columns);
CreateTableOptions createTableOptions = new CreateTableOptions();
List<String> hashKeys = new ArrayList<>();
hashKeys.add("id");
int numBuckets = 8;
createTableOptions.addHashPartitions(hashKeys, numBuckets);
try
if(!client.tableExists(tableName))
client.createTable(tableName, schema, createTableOptions);
System.out.println("成功创建Kudu表:" + tableName);
catch (KuduException e)
e.printStackTrace();
/**
* 向指定的Kudu表中upsert数据,数据存在则更新,不存在则新增
* @param client KuduClient对象
* @param tableName 表名
* @param numRows 向表中插入的数据量
*/
public static void upsert(KuduClient client, String tableName, int numRows )
try
KuduTable kuduTable = client.openTable(tableName);
KuduSession kuduSession = client.newSession();
//设置Kudu提交数据方式,这里设置的为手动刷新,默认为自动提交
…
kuduSession.flush();
kuduSession.close();
catch (KuduException e)
e.printStackTrace();
/**
* 查看Kudu表中数据
* @param client
* @param tableName
*/
public static void scanerTable(KuduClient client, String tableName)
try
KuduTable kuduTable = client.openTable(tableName);
KuduScanner kuduScanner = client.newScannerBuilder(kuduTable).build();
while(kuduScanner.hasMoreRows())
RowResultIterator rowResultIterator =kuduScanner.nextRows();
while (rowResultIterator.hasNext())
RowResult rowResult = rowResultIterator.next();
System.out.println(rowResult.getString("id"));
kuduScanner.close();
catch (KuduException e)
e.printStackTrace();
/**
* 删除表
* @param client
* @param tableName
*/
public static void dropTable(KuduClient client, String tableName)
try
client.deleteTable(tableName);
catch (KuduException e)
e.printStackTrace();
/**
* 列出Kudu下所有的表
* @param client
*/
public static void tableList(KuduClient client)
try
ListTablesResponse listTablesResponse = client.getTablesList();
List<String> tblist = listTablesResponse.getTablesList();
for(String tableName : tblist)
System.out.println(tableName);
catch (KuduException e)
e.printStackTrace();
(可左右滑动)
4
示例代码及运行
1.KuduKerberosExample为测试类包含API的调用
package com.cloudera;
import com.cloudera.utils.ClientUtils;
import com.cloudera.utils.KuduUtils;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.kudu.client.KuduClient;
import org.apache.kudu.client.KuduException;
import java.io.IOException;
import java.security.PrivilegedExceptionAction;
/**
* package: com.cloudera
* describe: 访问Kerberos环境下的Kudu
* creat_user: Fayson
* email: htechinfo@163.com
* creat_date: 2018/11/15
* creat_time: 上午12:32
* 公众号:Hadoop实操
*/
public class KuduKerberosExample
public static void main(String[] args)
ClientUtils.initKerberosENV(false);
String kudu_master = System.getProperty("kuduMasters", "cdh1.fayson.com:7051,cdh2.fayson.com:7051,cdh3.fayson.com:7051");
try
KuduClient kuduClient = UserGroupInformation.getLoginUser().doAs(
new PrivilegedExceptionAction<KuduClient>()
@Override
public KuduClient run() throws Exception
return new KuduClient.KuduClientBuilder(kudu_master).build();
);
String tableName = "user_info_kudu";
//删除Kudu的表
KuduUtils.dropTable(kuduClient, tableName);
//创建一个Kudu的表
KuduUtils.createTable(kuduClient, tableName);
//列出Kudu下所有的表
KuduUtils.tableList(kuduClient);
//向Kudu指定的表中插入数据
KuduUtils.upsert(kuduClient, tableName, 100);
//扫描Kudu表中数据
KuduUtils.scanerTable(kuduClient, tableName);
try
kuduClient.close();
catch (KuduException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
catch (InterruptedException e)
e.printStackTrace();
(可左右滑动)
2.示例运行
3.访问Kudu Master的UI界面
点击“Table Id”进入user_info_kudu表详细页面
使用Kudu表提供的Impala建表语句,在Impala上创建外部表
CREATE EXTERNAL TABLE `user_info_kudu` STORED AS KUDU
TBLPROPERTIES(
kudu.table_name = user_info_kudu,
kudu.master_addresses = cdh1.fayson.com:7051,cdh2.fayson.com:7051,cdh3.fayson.com:7051)
(可左右滑动)
查询user_info_kudu表数据
5
总结
1.在进行本地开发时,必须将集群的hostname及IP配置在本地的hosts文件中(如果使用DNS服务则可以不配置hosts文件),否则无法与集群互通,确保本地客户端与集群的端口是放通的。
2.访问Kerberos环境下的Kudu时,需要使用HDFS API提供的UserGroupInformation类实现Kerberos账号登录认证,该API在登录Kerberos认证后,会启动一个线程定时的刷新认证。
GitHub源码地址:
提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。
温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操
以上是关于如何使用Java代码访问Kerberos环境下的Kudu的主要内容,如果未能解决你的问题,请参考以下文章
如何使用java代码通过JDBC连接Impala(附Github源码)
0110-如何给Kerberos环境下的CDH集群添加Gateway节点
关于hadoop登陆kerberos时设置环境变量问题的思考