zoukankan      html  css  js  c++  java
  • CDH开启kerberos后在第三方机器上部署Spark程序问题解决

    一、概述

     当CDH平台开启kerberos后,需要kdc服务验证通过和kerberos协议验证通过才可以。如果将spark程序部署在CDH 机器上,直接在生成keytab并使用principal登录kerberos即可。

    如果当spark应用程序部署在第三方机器上时,还需要处理krb5.conf注册问题。

    二、问题解决

     1、当spark程序部署在CDH所在的机器上时,启动spark程序命令如下

      1)进入kerberos

      kadmin.local

      2)、查看kerberos人员

      listprincs

      3)、生成keytab文件

      ktadd -k /home/demo/hive.keytab -norandkey hive@TEST.COM

    4)、认证用户

    kinit -kt /home/demo/hive.keytab hive@TEST.COM

    5)、使用spark-submit提交

      spark-submit --class com.rdc.bdata.compute.ParquetCommonRunner --keytab /home/demo/keytab --principal hive/bdp5@TEST.COM --master local[2]  ... 其他参数设置。

    2、当spark程序部署在CDH第三方机器上时

    其他步骤与第一个场景一致,有以下两个不一致的地方

     1)、需要部署Spark环境

     下载spark客户端环境并部署

    2)、需要下载hive的配置文件,并将文件拷贝到spark环境的conf目录

    在CDH平台上下载hive客户端配置文件,并将hdfs-site.xml、hive-site.xml、core-site.xml、yarn-site.xml拷贝到spark的conf目录中

    3)、将krb5.conf拷贝到%java_home%/lib/security下面

    如果不拷贝会报如下异常:

    java.lang.IllegalArgumentException: Can't get Kerberos realm,具体异常的原因为Caused by: KrbException: Cannot locate default realm

    解决过程:

    1. 问题分析:

      Cannot locate default realm,顾名思义是没有设置default  realm,kerberos设置default  realm有两种方式

              (1)通过设置系统属性,代码如下

             System.setProperty("java.security.krb5.realm",""); 

             System.setProperty("java.security.krb5.kdc","");

              (2)读取kerberos配置文件配置,设置default  realm。指定kerberos配置文件逻辑大概如下

    1. getJavaFileName()方法:获取kerberos的配置文件地址:

    该方式是通过读系统属性java.security.krb5.conf,如果为空的话则以%java_home%/lib/security/krb5.conf为配置文件

            2.getNativeFileName()方法,在不同操作系统去读逻辑有区别

             在Windows下是通过读取c:Windowskrb5.ini路径,如果该路径为空的话,则以c:winntkrb5.ini为主

             在linux下读取etc/krb5.conf

          设置kerberos配置文件代码如下:

    package sun.security.krb5;
    public class Config {
        private final String defaultRealm;
        private Config() throws KrbException {
            //....省略其他代码
            this.defaultRealm = getProperty("java.security.krb5.realm");
        if ((this.defaultKDC != null || this.defaultRealm == null) && (this.defaultRealm != null || this.defaultKDC == null)) {
            try {
                String var3 = this.getJavaFileName();
                List var2;
                if (var3 != null) {
                    var2 = this.loadConfigFile(var3);
                    this.stanzaTable = this.parseStanzaTable(var2);
                    if (DEBUG) {
                        System.out.println("Loaded from Java config");
                    }
                } else {
                    boolean var4 = false;
                    if (isMacosLionOrBetter()) {
                        try {
                            this.stanzaTable = SCDynamicStoreConfig.getConfig();
                            if (DEBUG) {
                                System.out.println("Loaded from SCDynamicStoreConfig");
                            }
     
                            var4 = true;
                        } catch (IOException var6) {
                        }
                    }
     
                    if (!var4) {
                        var3 = this.getNativeFileName();
                        var2 = this.loadConfigFile(var3);
                        this.stanzaTable = this.parseStanzaTable(var2);
                        if (DEBUG) {
                            System.out.println("Loaded from native config");
                        }
                    }
                }
            } catch (IOException var7) {
            }
     
        } else {
            throw new KrbException("System property java.security.krb5.kdc and java.security.krb5.realm both must be set or neither must be set.");
        }
    }
        private String getJavaFileName() {
            String var1 = getProperty("java.security.krb5.conf");
            if (var1 == null) {
                var1 = getProperty("java.home") + File.separator + "lib" + File.separator + "security" + File.separator + "krb5.conf";
                if (!this.fileExists(var1)) {
                    var1 = null;
                }
            }
            
            if (DEBUG) {
                System.out.println("Java config name: " + var1);
            }
            
            return var1;
        }
        //其他代码省略
    }
     

      因为,使用spark-submit之前就需要获取krb5.conf参数,因此需要使用getJavaFileName()方法:将krb5.conf拷贝到jdk所在的目录中。

      

  • 相关阅读:
    linux驱动开发学习一:创建一个字符设备
    如何高效的对有序数组去重
    找到缺失的第一个正整数
    .NET不可变集合已经正式发布
    中国人唯一不认可的成功——就是家庭的和睦,人生的平淡【转】
    自己动手搭建 MongoDB 环境,并建立一个 .NET HelloWorld 程序测试
    ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
    自己动手搭建 Redis 环境,并建立一个 .NET HelloWorld 程序测试
    ServiceStack 介绍
    一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL
  • 原文地址:https://www.cnblogs.com/chhyan-dream/p/13492589.html
Copyright © 2011-2022 走看看