关于Java连接Hive,Spark等服务的Kerberos工具类封装

这篇具有很好参考价值的文章主要介绍了关于Java连接Hive,Spark等服务的Kerberos工具类封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于Java连接Hive,Spark等服务的Kerberos工具类封装

idea连接服务器的hive等相关服务的kerberos认证注意事项

  • idea 本地配置,连接服务器;进行kerberos认证,连接hive、HDFS、Spark等服务注意事项:
  1. 本地idea连接Hadoop,需要在本地安装Hadoop的window工具hadoop-3.1.1-winutils-master ,配置环境变量
  2. 配置hosts主机名映射
  3. kerberos认证需要在idea工作目录所在的磁盘的根目录下创建对应的文件夹把keytab放到该目录下,方便认证。
  4. krb5.conf放到对应的目录,如:system.properties中配置了krbConf=/etc/krb5.conf;在项目所在的磁盘根目录下,创建对应的etc目录在下面放配置文件krb5.conf。如:我的idea工作空间在D盘那么就在D盘根目录下创建。
  5. 在resource目录下放置集群的配置文件:hdfs-site.xml、core-site.xml、mapred-site.xml、yarn-site.xml、hive-site.xml配置文件。
  6. 认证注意事项:如果最终是hive用户认证的,那么生成的文件默认为hive的家目录;如果是hdfs用户认证的,生成的文件默认为hdfs的家目录。

properties工具类

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

/**
 * properties工具类
 */

public class PropertiesUtil {
    private static Log log =LogFactory.getLog(PropertiesUtil.class);
    private  static Properties props=new Properties();
    private static String propertyFileName = "/system.properties";
    static {
        try {
            if (props.size() == 0) {
                log.info("Start read the constv.properties file");
                InputStream input = PropertiesUtil.class.getResourceAsStream(propertyFileName);
                props.load(input);
                input.close();
            }
        }catch (IOException ioe) {
               log.error(ioe.getMessage());
               log.debug(ioe);
            }
        }
   public  static Integer getRequiredIntegerProperty(String propertyName){
        String str =getRequiredStringProperty(propertyName);
        return Integer.parseInt(str);
    }

    public  static String getRequiredStringProperty(String propertyName){
       String str =getStringProperty(propertyName, null);
       if (StringUtils.isBlank(str)){
           throw new RuntimeException(propertyName+"not is property file"+ propertyFileName);
       }
        return str;
    }
    public static  String getStringProperty(String propertyName,String defaultValue){
        if (props.containsKey(propertyName) ==true){
            return (String) props.get(propertyName);
        }
        return defaultValue;

    }

    public static String getIntegerProperty(String propertyName,String defaultValue, String encoding){
        if (props.containsKey(propertyName) ==true){
            //编码转换,从ISO8859-1转向指定的编码
            String value= (String) props.get(propertyName);
            try{
                value = new String(value.getBytes("ISO8859-1"), encoding);
            }catch (UnsupportedEncodingException e){
                e.printStackTrace();
            }
            return  value;
        }
        return defaultValue;
    }


    }

线程池调度工具类

import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;

public class ScheduledThreadFactory  implements ThreadFactory {
   private static final AtomicInteger poolNumber = new AtomicInteger(1);
   private final ThreadGroup group;
   private final  AtomicInteger threadNumber =new AtomicInteger(1);
   private final String namePrefix;

    public ScheduledThreadFactory() {
        SecurityManager s=System.getSecurityManager();
        group = (s != null) ? s.getThreadGroup(): Thread.currentThread().getThreadGroup();
        namePrefix = "Scheduled Pool-" + poolNumber.getAndIncrement()+"-Thread-";
    }


    public Thread newThread(Runnable r) {
       Thread t = new Thread(group,r,namePrefix+threadNumber.getAndIncrement());
        /*
        * 设置为守护进程,所在的jar执行完就退出,如果不是守护进程,在linux运行时,即使业务进程执行完成,这个认证进程也不会关闭。
        * */
         t.setDaemon(true);
         //这个是线程默认的优先级 Thread.NORM_PRIORITY
         if (t.getPriority() != Thread.NORM_PRIORITY){
             t.setPriority(Thread.NORM_PRIORITY);
         }
        return t;
    }

}

Kerberos认证工具类

import com.xxxx.utils.PropertiesUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;

import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class KerberosAuthen {
    private  static ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1,new ScheduledThreadFactory());

    public static  void kerberosAuthen(){
        krbAuth();
        /*
        * 每5分钟执行一次向kerberos进行认证的方法
        * */
        scheduledExecutor.scheduleAtFixedRate(()->krbAuth(),5L,5L, TimeUnit.MINUTES);
    }

  /*
     向kerberos认证
  * */
    private static void krbAuth(){
        String krbConf = PropertiesUtil.getRequiredStringProperty("krb.conf");
        String krbKeytab = PropertiesUtil.getRequiredStringProperty("hive.krb.keytab");
        String krbPrincipal = PropertiesUtil.getRequiredStringProperty("hive.krb.principal");

     if (StringUtils.isEmpty(krbConf) || StringUtils.isEmpty(krbKeytab) || StringUtils.isEmpty(krbPrincipal)){
         throw new RuntimeException("------------------------Kerberos认证文件不存在--------------------------");
     }
     //java 程序本身自带kerberos客户端,需要krbConf. 可以进行当前节点的kerberos认证
        System.setProperty("java.security.krb5.conf",krbConf);
        Configuration configuration = new Configuration();
        configuration.set("hadoop.security.authorization","kerberos");
        //指定keytab文件和principal,为当前java程序配置认证
        configuration.set("keytab.file",krbKeytab);
        configuration.setBoolean("hadoop.security.authorization",true);
        configuration.set("kerberos.principal",krbPrincipal) ;
      try {
          UserGroupInformation.setConfiguration(configuration);
          UserGroupInformation.loginUserFromKeytab(krbPrincipal,krbKeytab);
      }catch (IOException ioe){
          System.err.println(ioe.getMessage());

      }

    }

}

properties配置文件

  • conf.properties示例:
krb.conf=/etc/krb5.conf
hive.krb.key=/opt/keytabs/hive.keytab
hive.krb.principal=hive@Example.COM

文章来源地址https://www.toymoban.com/news/detail-635132.html

到了这里,关于关于Java连接Hive,Spark等服务的Kerberos工具类封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 保姆级连接FusionInsight MRS kerberos Hive

    数新网络,让每个人享受数据的价值 https://xie.infoq.cn/link?target=https%3A%2F%2Fwww.datacyber.com%2F  本文将介绍在华为云 FusionInsight MRS(Managed Relational Service)的Kerberos环境中,如何使用Java和DBeaver实现远程连接Hive的方法。  1.  MRS 3.1.5 安全集群(开启kerberos) 2.  windows 11 64位,需要和

    2024年02月03日
    浏览(29)
  • Hive/Spark/Yarn: User Not Found 错误和 Kerberos / AD / OpenLDAP 之间的关系与解释

    《大数据平台架构与原型实现:数据中台建设实战》一书由博主历时三年精心创作,现已通过知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描

    2024年02月14日
    浏览(51)
  • 企业级大数据安全架构(十)DBeaver连接Hive的Kerberos认证配置

    1.配置本地hosts 因为Kerberos认证过程及集群服务中,很多是以主机名的形式进行访问的,所以工作机要设置hosts. 域名映射,我们通过部署CDH的集群的每一台机器都已经配置了host(文件为/etc/hosts),工作机也需要配置window的host文件,如果提示无法修改,一般是需要管理员权限的原

    2024年02月21日
    浏览(35)
  • 【dbeaver】win环境的kerberos认证和Clouders/cdh集群中Kerberos认证使用Dbeaver连接Hive、Impala和Phoenix

    1.1 下载安装MIT KERBEROS客户端 MIT KERBEROS 下载较新的版本即可。 下载之后一路默认安装即可。 注意:不要修改软件安装位置。 修改系统环境变量中的Path。将刚刚的安装路径置顶。(不置顶,也要比 %JAVA_HOME%bin 和 anaconda 相关的高) 使用CMD命令确认下: 1.2 修改 krb5.conf 文件并

    2024年02月02日
    浏览(42)
  • Java通过kerberos权限认证集成hive

    java通过kerberos权限认证集成hive,并操作hive实现hive库和表、分区表的增删查等功能 1、pom文件中引入hive包 2、从集群中下载认证过可以登录的keytab文件,以及krb5.conf文件还有core-site.xml、hdfs-site.xml、hive-site.xml、yarn-site.xml放到项目的resources目录下 (xml文件按照自己项目需要下载

    2024年02月05日
    浏览(40)
  • JDK8 和 JDK17 下基于JDBC连接Kerberos认证的Hive(代码已测试通过)

    之前自研平台是基于jdk8开发的,连接带Kerberos的hive也是jdk8,现在想升级jdk到17,发现过Kerberos的hive有点不一样,特地记录 连接Kerberos, krb5.conf 和对应服务的 keytab 文件以及对应的 principal 肯定是需要提前准备的, 一般从服务器或者运维那里获取 krb5.conf 与 Hive对应的 keytab 文件。 注意

    2024年02月20日
    浏览(37)
  • Spark---Spark连接Hive

    Apache Hive 是 Hadoop 上的 SQL 引擎,Spark SQL 编译时可以包含 Hive 支持,也可以不包含。包含 Hive 支持的 Spark SQL 可以支持 Hive 表访问、UDF (用户自定义函数)以及 Hive 查询语言(HiveQL/HQL)等。需要强调的一点是,如果要在Spark SQL 中包含Hive 的库,并不需要事先安装 Hive。一般来说,最

    2024年02月03日
    浏览(34)
  • Spark连接Hive读取数据

            Ubuntu 16.04 LTS         ubuntu-16.04.6-desktop-i386.iso          spark-3.0.0-bin-without-hadoop.tgz           hadoop-3.1.3.tar.gz         apache-hive-3.1.2-bin.tar.gz         spark-hive_2.12-3.2.2.jar         openjdk 1.8.0_292         mysql-connector-java-5.1.40.tar.gz         

    2024年02月01日
    浏览(33)
  • 关于hive on spark部署后insert报错Error code 30041问题

    ERROR : FAILED: Execution Error, return code 30041 from org.apache.hadoop.hive.ql.exec.spark.SparkTask.      Spark没有启动;      需在/opt/module/spark路径下输入以下内容启动spark: Spark与hive的版本不一致造成的问题(这里我找到了部分spark和hive对应的版本):      注意:官网下载的 Hive 3.1.2 和

    2024年02月02日
    浏览(42)
  • Spark-SQL连接Hive的五种方法

    若使用Spark内嵌的Hive,直接使用即可,什么都不需要做(在实际生产活动中,很少会使用这一模式) 步骤: 将Hive中conf/下的hive-site.xml拷贝到Spark的conf/目录下; 把Mysql的驱动copy到jars/目录下; 如果访问不到hdfs,则将core-site.xml和hdfs-site.xml拷贝到conf/目录下; 重启spark-shell;

    2024年02月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包