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

相关文章

BD错误集锦9——查询hive表格时出错:Wrong FS: hdfs://s233/user/../warehouse expected: hdfs://mycluster

集群环境描述:HDFS集群处于HA模式下,同时启动了YARN\JN\KAFKA\ZK。 现象: FAILED: SemanticException Unable to determine if hdfs://s233/user/hive/warehouse/mydb.db/ext_calllogs_in_hbase is encrypted: java.lang.IllegalArgument

BD错误集锦1——[Hive]ERROR StatusLogger No log4j2 configuration file found. Using default configuration:

错误描述:在使用IDEA进行jdbc方式连接到hive数据仓库时,出现以下错误:                ERROR StatusLogger No log4j2 configuration file found. 问题原因:缺少log4j2.xml文件   <?xml version="1.0" encoding="UTF-8"?><Configuration><Appender

openfire+spark 在linux下安装,配置

文章转自:点击打开链接 相关软件下载 链接: https://pan.baidu.com/s/1boJs61h 密码: 2wd7 Openfire 在linux下安装和配置 + spark 在windows下配置 本机环境 系统:CentOS 6.7 64 位JDK 1.7 64 位MySQL 5.6 Openfir

Hbase特性介绍

1、什么是Hbase。 是一个高可靠性、高性能、列存储、可伸缩、实时读写的分布式数据库系统。 适合于存储非结构化数据,基于列的而不是基于行的模式 如图:Hadoop生态中HBase与其他部分的关系。 2、关系数据库已经流行很多年,并且Hadoop已经有了HDFS和MapReduce,为什么需要HBase? Hadoop可以很好地解决大规模数据的离线批量处理问题,但是,受限于Hadoo

为何HBase速度很快?

为何HBase速度很快? HBase能提供实时计算服务主要原因是由其架构和底层的数据结构决定的, 即由LSM-Tree(Log-Structured Merge-Tree) + HTable(region分区) + Cache决定——客户端可以直接定位到要查数据所在的HRegion server服务器,然后直接在服务器的一个region上查找要匹配的数据,并且这些数据部分是经过cache缓存的。

什么是hbase Coprocessor

HBase客户端查询存在的问题 Scan 用Get/Scan查询数据,Filter 用Filter查询特定数据 以上情况只适合几千行数据以及不是很多的列的“小数据”。 当表扩展为亿万行及百万列时,在通过网络传递移动大量的数据导致网络拥堵,且客户端需要足够多内存来处理这么大量数据的计算操作,另外,客户端代码也会变的大而复杂。 解决方案 移动计算比移动数据更划算 Coprocessor将运

hbase中shell命令

HBase scan命令详解 - 简书https://www.jianshu.com/p/0ccfd59d73f4 Hbase中多版本(version)数据获取办法_牛奋lch-CSDN博客_hbase 多版本前言:本文介绍2种获取列的多版本数据的方式:shell和spring data hadoop一、hbase shell中如何获取    1、在shell端创建一个Hbase表create

hbase架构

本篇文章旨在针对初学者以我本人现阶段所掌握的知识就HBase的架构图中各模块作一个概念科普。不对文章内容的“绝对、完全正确性”负责。  1、开胃小菜   关于HBase的架构图,直接抓取网络上图片来分析就好了。它大概长成下面的样子: 图1 HBase架构图   从上图中可以很直观地看到整个HBase都是基于HDFS之上的。这个HDFS呢,它的全称是Hadoop distribut

hbase scan的java操作

public class HbaseTest {public static void main(String[] args) throws Exception {//构建基本信息String table = "t_userBehavior2";final TableName tableName = TableName.valueOf(table);final HTable hTable = new