Hive/Impala/Hbase/Spark Kerberos

2024-04-16 18:48
文章标签 hive spark hbase kerberos impala

本文主要是介绍Hive/Impala/Hbase/Spark Kerberos,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用hadoop Kerberos有几个地方需要注意,避免真实环境老是有问题:

1. 我以前使用IP地址构建集群(虽然也用了DNS解析),但是有时候你直接通过主机名+DNS解析来做集群,这2者从我实际测试来看是有区别的,使用IP没有任何问题,但是使用DNS解析,开启kerberos总是会有些许问题,因此如果使用DNS解析,建议客户端连接kerberos的主机把集群的IP和主机名写入/etc/hosts,至于为什么很难解释。

2. 如果你的kerberos使用的是强加密,256就是强加密,一定要记得把JAVA下的JCE的JAR包替换,包括你使用的客户端,否者老会出现拿不到认证,因为最起码的加密级别都不一样,肯定会有问题。

3.如果是使用spark standalone,程序要使用hdfs kerberos,这个地方最好spark要支持你的HADOOP,YARN版本,我没有细测,但是版本不同,多少有点问题。

4.如果没有使用LDAP配合Kerberos, 你所建立的keytab用户在操作系统上也建立一个同名用户,当然,这个地方你要看具体的程序报错,如果提示用户找不到,就建立,否者也应该不需要。

开启Hadoop Kerberos之后,要连接组件需要比不开启Kerberos多2个动作,一个是告诉程序KDC主机是谁,另外一个告诉程序使用者是谁。 简单说就是多几行代码:

        System.setProperty("java.security.krb5.conf", "c:\\krb5.conf");Configuration conf = new Configuration();conf.set("hadoop.security.authentication", "Kerberos");UserGroupInformation.setConfiguration(conf);UserGroupInformation.loginUserFromKeytab("hive@XXXX.COM", "c:\\hive.keytab");

上面是我在WINDOW测试,所以krb5.conf指定在C盘,如果是LINUX应用服务器,当然不需要指定,直接放到/etc目录下即可,默认就会去/etc找krb5.conf, 至于keytab,这个必须指定,你可以放到程序的类路径下classpath:keytab即可。

下面简单的贴一下相应的HIVE,HBASE,SPARK,IMPALA连接kerberos的JAVA代码:

HIVE:

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;/*** Hello world!**/
public class App 
{public static void main( String[] args ) throws ClassNotFoundException, SQLException, IOException{//String driver = "com.cloudera.impala.jdbc41.Driver";//String driver = "com.cloudera.hive.jdbc41.HS2Driver";String driver = "org.apache.hive.jdbc.HiveDriver";//String url = "jdbc:impala://10.40.2.103:21050/default;UseSasl=0;AuthMech=3;UID=impala;PWD=";String url = "jdbc:hive2://xxxx.xxxx.com:10000/default;principal=hive/xxxxx.xxxx.com@xxxx.COM";String username = "hive";String password = "hive";Connection connection = null;	Class.forName(driver);System.setProperty("java.security.krb5.conf", "c:\\krb5.conf");Configuration conf = new Configuration();conf.set("hadoop.security.authentication", "Kerberos");UserGroupInformation.setConfiguration(conf);UserGroupInformation.loginUserFromKeytab("hive@xxxx.COM", "c:\\hive.keytab");connection = DriverManager.getConnection(url);String sql = "select count(*) from test.test";Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery(sql);while(resultSet.next()) {System.out.println(resultSet.getInt(1));}resultSet.close();statement.close();connection.close();}
}

impala:

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;/*** Hello world!**/
public class App 
{public static void main( String[] args ) throws ClassNotFoundException, SQLException, IOException{String driver = "com.cloudera.impala.jdbc41.Driver";//String driver = "com.cloudera.hive.jdbc41.HS2Driver";//String driver = "org.apache.hive.jdbc.HiveDriver";//String url = "jdbc:impala://10.40.2.103:21050/default;UseSasl=0;AuthMech=3;UID=impala;PWD=";String url = "jdbc:impala://10.40.2.103:21050/test;UseSasl=0;AuthMech=3;UID=impala;PWD=;principal=hive/xxx.xxxx.com@xxxx.COM";String username = "hive";String password = "hive";Connection connection = null;System.setProperty("java.security.krb5.conf", "c:\\krb5.conf");Class.forName(driver);Configuration conf = new Configuration();conf.set("hadoop.security.authentication", "Kerberos");UserGroupInformation.setConfiguration(conf);UserGroupInformation.loginUserFromKeytab("hive@xxxx.COM", "c:\\hive.keytab");connection = DriverManager.getConnection(url);String sql = "select count(*) from hbase_test";Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery(sql);while(resultSet.next()) {System.out.println(resultSet.getInt(1));}resultSet.close();statement.close();connection.close();}
}

HBASE:

import java.io.IOException;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.security.UserGroupInformation;public class App {public static void main(String[] args) throws IOException {String table = "mes:test";Configuration conf = HBaseConfiguration.create();System.setProperty("HADOOP_USER_NAME", "hbase");conf.set("hbase.zookeeper.quorum","tsczbddndev1.trinasolar.com");conf.set("hbase.zookeeper.property.clientPort", "2181");//conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");//	conf.setInt("hbase.client.operation.timeout",10000);//	conf.setInt("hbase.rpc.timeout",6000);conf.setInt("hbase.client.retries.number", 3);System.setProperty("java.security.krb5.conf", "resource/krb5.conf");UserGroupInformation.setConfiguration(conf);UserGroupInformation.loginUserFromKeytab("hive@xxxxx.COM", "resource/hive.keytab");	HTable myTable = new HTable(conf, TableName.valueOf(table));Put put = new Put(Bytes.toBytes("CDH5.10.21"));put.add(Bytes.toBytes("cf"), Bytes.toBytes("name"), Bytes.toBytes("this is a test"));myTable.put(put);myTable.flushCommits();System.out.println("put successful");myTable.close();}}

Spark on Yarn:

import java.io.IOException;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;/*** Hello world!**/
public class App {public static void main(String[] args) throws IOException {System.setProperty("HADOOP_USER_NAME", "hdfs");SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount");sparkConf.setMaster("yarn-client");// sparkConf.set("spark.submit.deployMode", "client");//sparkConf.set("spark.yarn.jar", "hdfs:///tmp/spark-assembly_2.10-1.6.0-cdh5.10.2.jar");sparkConf.set("spark.yarn.appMasterEnv.CLASSPATH","$CLASSPATH:/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/*");// System.setProperty("sun.security.krb5.debug", "true");System.setProperty("java.security.krb5.conf", "c:\\krb5.conf");Configuration conf = new Configuration();// conf.set("hadoop.security.authentication", "Kerberos");// sparkConf.set("spark.security.credentials.hdfs.enabled", "true");UserGroupInformation.setConfiguration(conf);UserGroupInformation.loginUserFromKeytab("hive@xxxxx.COM", "c:\\hive.keytab");JavaSparkContext ctx = new JavaSparkContext(sparkConf);JavaRDD<String> lines = ctx.textFile("/tmp/a.sql");System.out.println(lines.count());ctx.close();}
}

POM.XML 

		<dependency><groupId>org.apache.hive</groupId><artifactId>hive-jdbc</artifactId><version>1.1.0-cdh5.10.2</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.6.0-cdh5.10.2</version></dependency>

 

这篇关于Hive/Impala/Hbase/Spark Kerberos的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/909609

相关文章

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

Hive和Hbase的区别

Hive 和 HBase 都是 Hadoop 生态系统中的重要组件,它们都能处理大规模数据,但各自有不同的适用场景和设计理念。以下是两者的主要区别: 1. 数据模型 Hive:Hive 类似于传统的关系型数据库 (RDBMS),以表格形式存储数据。它使用 SQL-like 语言 HiveQL 来查询和处理数据,数据通常是结构化或半结构化的。HBase:HBase 是一个 NoSQL 数据库,基

简单Hbase 分页方案

简单Hbase分页方案 网上大多数分页方案分为从服务端分页或者从客户端分页 服务端分页方式主要利用PageFilter过滤器,首先太复杂,其次针对集群的兼容性不是很好,作者利用服务端分页+客户端分页结合方式给出一种简单易行的中间方案。 1.利用PageFilter过滤器从服务端分页,过滤出所需要的最大条数, 注:作者认为大多数用户不会进行太深的翻页,假设pageSize=5,客户饭100页一共

Hbase Filter+Scan 查询效率优化

Hbase Filter+Scan 查询效率问题 众所周知,Hbase利用filter过滤器查询时候会进行全表扫描,查询效率低下,如果没有二级索引,在项目中很多情况需要利用filter,下面针对这种情况尝试了几种优化的方案,仅供参考,欢迎交流。 根据业务要求,作者需要根据时间范围搜索所需要的数据,所以作者设计的rowKey是以时间戳为起始字符串的。 正确尝试: 1.scan 设置 开始行和结

Hbase 查询相关用法

Hbase 查询相关用法 public static void main(String[] args) throws IOException {//Scan类常用方法说明//指定需要的family或column ,如果没有调用任何addFamily或Column,会返回所有的columns; // scan.addFamily(); // scan.addColumn();// scan.se

掌握Hive函数[2]:从基础到高级应用

目录 高级聚合函数 多进一出 1. 普通聚合 count/sum... 2. collect_list 收集并形成list集合,结果不去重 3. collect_set 收集并形成set集合,结果去重  案例演示 1. 每个月的入职人数以及姓名  炸裂函数  概述  案例演示 1. 数据准备 1)表结构 2)建表语句 3)装载语句 2. 需求 1)需求说明 2)答

【Hbase 数据操作】HBase基础和数据导入

创建表hbase_test有两个列族CF1和CF2 向表中添加数据,在向HBase的表中添加数据的时候,只能一列一列的添加,不能同时添加多列。 create 'hbase_test',{NAME=>'cf1'},{NAME=>'cf2'}put 'hbase_test', '001','cf1:name','liz';put 'hbase_test', '001','cf1:age','1

【Hive Hbase】Hbase与Hive的区别与联系

问题导读: Hive与Hbase的底层存储是什么? hive是产生的原因是什么? habase是为了弥补hadoop的什么缺陷? 共同点: 1.hbase与hive都是架构在hadoop之上的。都是用hadoop作为底层存储 区别: 2.Hive是建立在Hadoop之上为了减少MapReduce jobs编写工作的批处理系统,HBase是为了支持弥补Hadoop对实时操作的缺陷的项目

【spark 读写数据】数据源的读写操作

通用的 Load/Save 函数 在最简单的方式下,默认的数据源(parquet 除非另外配置通过spark.sql.sources.default)将会用于所有的操作。 Parquet 是一个列式存储格式的文件,被许多其他数据处理系统所支持。Spark SQL 支持对 Parquet 文件的读写还可以自动的保存源数据的模式 val usersDF = spark.read.load("e

【hive 日期转换】Hive中yyyymmdd和yyyy-mm-dd日期之间的切换

方法1: from_unixtime+ unix_timestamp--20171205转成2017-12-05 select from_unixtime(unix_timestamp('20171205','yyyymmdd'),'yyyy-mm-dd') from dual;--2017-12-05转成20171205select from_unixtime(unix_timestamp