• [二次开发] 使用开源canal采集binlog日志到kafka,说是server not found in kerberos databas
    【功能模块】【操作步骤&问题现象】1、具体报错信息如下:2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [数据集成] 使用Kettle 8.3对接开启Kerberos认证的MRS集群的HDFS组件
    ## 背景 Kettel是一款比较最容易上手的开源ETL工具,在很多数据集成的项目中都有使用, Kettel商业化以后改名为Pentaho,Pentaho推出了商业化的付费产品套件,在商用版本中增强了很多企业级的能力,当前Kettle支持Kerberos认证Hadoop集群的能力是放在其商用版本中的,开源版本不支持Kerberos认证的Hadoop集群 本文通过简单的插件改造,使得Kettle 8.3能够连接开启Kerberos认证的MRS集群的HDFS组件 ## 对接方法 参考博文原文 [**链接**](https://bbs.huaweicloud.com/blogs/255354)
  • [问题求助] 【dayu产品】【MRS SPARK功能】Kerberos认证错误
    【功能模块】写spark代码进行yarn-cluster进行kerberos认证,kerberos报错困扰了快半个月了,各位大佬救救我。【操作步骤&问题现象】1、提交代码2、报错3、回传的Debug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is false    显示出来的principal与验证时配置的不一致,keytab的文件路径及文件名与验证时配置的不同。    在HbaseAdmin.available(conf)时无报错,而在将hbase查询的道德dataframe.show()出来时报错,Failed to find any Kerberos tgt。【截图信息】1.提交信息2.认证代码def kerberosCheck(hbaseConf: Configuration, sparkContext: SparkContext,                    sparkSession: SparkSession, schema: StructType, start_time: String, end_time: String): String = {System.setProperty("java.security.krb5.conf",      "/srv/BigData/hadoop/data4/nm/localdir/usercache/sjzt_mrs_jmzhyn/filecache/117/krb5.conf")    val userPrincipal = "sjzt_mrs_jmzhyn"    val USER_KEYTAB_FILE = "user.keytab"    val fsFileSystemPath = "/srv/BigData/hadoop/data4/nm/localdir/usercache/sjzt_mrs_jmzhyn/filecache/117/"    val krbFile = fsFileSystemPath + "krb5.conf"    val userKeyTableFile = fsFileSystemPath + USER_KEYTAB_FILE    val ZKServerPrincipal = "zookeeper/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com"    val ZOOKEEPER_DEFAULT_LOGIN_CONTEXT_NAME: String = "Cluster"    LoginUtil.setJaasConf(ZOOKEEPER_DEFAULT_LOGIN_CONTEXT_NAME, userPrincipal, userKeyTableFile)    LoginUtil.setZookeeperServerPrincipal(ZKServerPrincipal)    UserGroupInformation.setConfiguration(hbaseConf)    val ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI(userPrincipal, userKeyTableFile)    println("认证用户名:" + ugi.getUserName)    ugi.doAs(new PrivilegedExceptionAction[Void]() {      @throws[Exception]      override def run: Void = {        try {          println("验证认证")          ugi.checkTGTAndReloginFromKeytab()          println("验证hbase")          HBaseAdmin.available(hbaseConf)        } catch {          case e: Exception =>            e.printStackTrace()            println("认证失败!")        }        println("验证认证")        ugi.checkTGTAndReloginFromKeytab()        val dataframe = calculated(sparkContext, sparkSession, schema, start_time, end_time)        ugi.checkTGTAndReloginFromKeytab()        dataframe.show()        null      }    })    println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>认证成功<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")    return "success"  }def inputFile(fileName: String): String = {    val endPoint = "obs.jx-region-1.sgic.sgcc.com.cn"    val ak = "adsadsdsadsadsa"    val sk = "aadsdadsadsada"    println(">>>>>>>>>>>>>>>>>>>>>读取obs文件<<<<<<<<<<<<<<<<<<<<<<<")    // 创建ObsClient实例    val obsClient = new ObsClient(ak, sk, endPoint)    val obsObject = obsClient.getObject("obs-zhyn", fileName)    // 读取对象内容    println("Object content:")    val input = obsObject.getObjectContent    var bytes = new Array[Byte](2048)    val bos = new ByteArrayOutputStream()    var len = 0    try {      while (!((len = input.read(bytes)) equals -1)) {        bos.write(bytes, 0, len)      }    } catch {      case e: Exception =>        e.printStackTrace()    }    println(new String(bos.toByteArray()))    val userFile = new File("/srv/BigData/hadoop/data4/nm/localdir/usercache/sjzt_mrs_jmzhyn/filecache/117/" + fileName);    val fileParent = userFile.getParentFile();    //返回的是File类型,可以调用exsit()等方法    val fileParentPath = userFile.getParent(); //返回的是String类型    if (!fileParent.exists()) {      fileParent.mkdirs(); // 能创建多级目录    }    if (!userFile.exists())      userFile.createNewFile(); //有路径才能创建文件    val fileOutputStream = new FileOutputStream("/srv/BigData/hadoop/data4/nm/localdir/usercache/sjzt_mrs_jmzhyn/filecache/117/" + fileName)    fileOutputStream.write(bos.toByteArray)    bos.close()    return "success"  }【日志信息】(可选,上传日志内容或者附件)stdout认证用户名:sjzt_mrs_jmzhyn@B4887930_9018_4516_8D22_CDB3E3E06966.COM验证认证验证hbaseDebug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is falseprincipal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com@B4887930_9018_4516_8D22_CDB3E3E06966.COMWill use keytabCommit Succeeded 验证认证0329202100000003292021005959Debug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is falseDebug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is falseDebug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is falseDebug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is falseDebug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is falseDebug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is falseDebug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is falseprincipal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com@B4887930_9018_4516_8D22_CDB3E3E06966.COMWill use keytabCommit Succeeded principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com@B4887930_9018_4516_8D22_CDB3E3E06966.COMWill use keytabprincipal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com@B4887930_9018_4516_8D22_CDB3E3E06966.COMWill use keytabCommit Succeeded principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com@B4887930_9018_4516_8D22_CDB3E3E06966.COMWill use keytabCommit Succeeded principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com@B4887930_9018_4516_8D22_CDB3E3E06966.COMWill use keytabCommit Succeeded principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com@B4887930_9018_4516_8D22_CDB3E3E06966.COMWill use keytabCommit Succeeded principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com@B4887930_9018_4516_8D22_CDB3E3E06966.COMWill use keytabCommit Succeeded Commit Succeeded Debug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is falseDebug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is falseDebug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is falseDebug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is falseprincipal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com@B4887930_9018_4516_8D22_CDB3E3E06966.COMWill use keytabCommit Succeeded principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com@B4887930_9018_4516_8D22_CDB3E3E06966.COMprincipal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com@B4887930_9018_4516_8D22_CDB3E3E06966.COMWill use keytabWill use keytabCommit Succeeded Commit Succeeded principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com@B4887930_9018_4516_8D22_CDB3E3E06966.COMWill use keytabCommit Succeeded Debug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is /opt/Bigdata/tmp/nm_zk/spark_zk.keytab refreshKrb5Config is false principal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com tryFirstPass is false useFirstPass is false storePass is false clearPass is falseprincipal is spark_zk/hadoop.b4887930_9018_4516_8d22_cdb3e3e06966.com@B4887930_9018_4516_8D22_CDB3E3E06966.COMWill use keytabCommit Succeeded stdout.log2021-03-31 17:01:54,051 | INFO  | [dag-scheduler-event-loop] | Block broadcast_12_piece0 stored as bytes in memory (estimated size 15.7 KB, free 1997.6 MB) | org.apache.spark.internal.Logging$class.logInfo(Logging.scala:54)2021-03-31 17:01:54,052 | INFO  | [dispatcher-event-loop-11] | Added broadcast_12_piece0 in memory on node-ana-corePDlZ:22661 (size: 15.7 KB, free: 2004.0 MB) | org.apache.spark.internal.Logging$class.logInfo(Logging.scala:54)2021-03-31 17:01:54,053 | INFO  | [dag-scheduler-event-loop] | Created broadcast 12 from broadcast at DAGScheduler.scala:1039 | org.apache.spark.internal.Logging$class.logInfo(Logging.scala:54)2021-03-31 17:01:54,066 | INFO  | [dag-scheduler-event-loop] | Submitting 1 missing tasks from ResultStage 0 (MapPartitionsRDD[114] at show at temp.scala:239) (first 15 tasks are for partitions Vector(0)) | org.apache.spark.internal.Logging$class.logInfo(Logging.scala:54)2021-03-31 17:01:54,067 | INFO  | [dag-scheduler-event-loop] | Adding task set 0.0 with 1 tasks | org.apache.spark.internal.Logging$class.logInfo(Logging.scala:54)2021-03-31 17:01:54,144 | INFO  | [dispatcher-event-loop-12] | Starting task 0.0 in stage 0.0 (TID 0, node-ana-coreJSkT, executor 1, partition 0, RACK_LOCAL, 8383 bytes) | org.apache.spark.internal.Logging$class.logInfo(Logging.scala:54)2021-03-31 17:01:54,420 | INFO  | [dispatcher-event-loop-18] | Added broadcast_12_piece0 in memory on node-ana-coreJSkT:22815 (size: 15.7 KB, free: 2.5 GB) | org.apache.spark.internal.Logging$class.logInfo(Logging.scala:54)2021-03-31 17:01:55,971 | INFO  | [dispatcher-event-loop-28] | Added broadcast_0_piece0 in memory on node-ana-coreJSkT:22815 (size: 52.6 KB, free: 2.5 GB) | org.apache.spark.internal.Logging$class.logInfo(Logging.scala:54)2021-03-31 17:11:11,784 | WARN  | [task-result-getter-0] | Lost task 0.0 in stage 0.0 (TID 0, node-ana-coreJSkT, executor 1): org.apache.hadoop.hbase.DoNotRetryIOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]at org.apache.hadoop.hbase.client.RpcRetryingCallerImpl.callWithRetries(RpcRetryingCallerImpl.java:117)at org.apache.hadoop.hbase.client.ResultBoundedCompletionService$QueueingFuture.run(ResultBoundedCompletionService.java:80)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)Caused by: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:211)at org.apache.hadoop.hbase.security.AbstractHBaseSaslRpcClient.getInitialResponse(AbstractHBaseSaslRpcClient.java:131)at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler$1.run(NettyHBaseSaslRpcClientHandler.java:109)at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler$1.run(NettyHBaseSaslRpcClientHandler.java:105)at java.security.AccessController.doPrivileged(Native Method)at javax.security.auth.Subject.doAs(Subject.java:422)at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1729)at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.handlerAdded(NettyHBaseSaslRpcClientHandler.java:105)at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline.callHandlerAdded0(DefaultChannelPipeline.java:606)at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:187)at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:380)at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:359)at org.apache.hadoop.hbase.ipc.NettyRpcConnection.saslNegotiate(NettyRpcConnection.java:200)at org.apache.hadoop.hbase.ipc.NettyRpcConnection.access$800(NettyRpcConnection.java:71)at org.apache.hadoop.hbase.ipc.NettyRpcConnection$3.operationComplete(NettyRpcConnection.java:273)at org.apache.hadoop.hbase.ipc.NettyRpcConnection$3.operationComplete(NettyRpcConnection.java:261)at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:500)at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:479)at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:82)at org.apache.hbase.thirdparty.io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:306)at org.apache.hbase.thirdparty.io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:341)at org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:633)at org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)at org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)at org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)at org.apache.hbase.thirdparty.io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)... 1 moreCaused by: GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)at sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:147)at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:122)at sun.security.jgss.krb5.Krb5MechFactory.getMechanismContext(Krb5MechFactory.java:187)at sun.security.jgss.GSSManagerImpl.getMechanismContext(GSSManagerImpl.java:224)at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:212)at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179)at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:192)... 30 more | org.apache.spark.internal.Logging$class.logWarning(Logging.scala:66)
  • [问题求助] 【DAYU产品】【MRS SPARK功能】Kerberos认证成功提示后,Failed to find any Kerberos
    【功能模块】【DAYU产品】【MRS SPARK功能】【操作步骤&问题现象】1、将从obs上下载到本地,进行认证2、前面有UserGroupInformation以及LoginUtil类报的Login success !!! 的认证成功标志3、连接hbase数据库报Failed to find any Kerberos【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 请问能否通过obs上的认证文件完成kerberos认证
    【功能模块】请问能否通过在obs上的kerberos认证文件完成认证【操作步骤&问题现象】1、当前账号仅有在dayu上发布作业执行的权力,没有给服务器的ip,账号,密码。2、如何仅通过该账号完成kerberos认证?3、如果不行我需要申请什么权限呢?4、对端太难说话了,刚刚上手不懂这块,一直被他们糊弄。【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 在dayu上通过yarn-cluster集群方式如何进行kerberos认证
    【功能模块】在dayu上通过yarn-cluster集群方式进行kerberos认证【操作步骤&问题现象】1、管理员给我一个账户可以将作业提交至mrs上运行,我这边想通过user.keytab,krb5.conf进行kerberos认证。2、我目前没有任何主机权限,管理员给出的建议是将认证文件放在obs上,通过obs进行,认证。3、然后发现UserGroupInformation用的好像是linux路径,写obs路径无法访问。【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [基础组件] 华为FI C80 kerberos认证环境下,Flink 无法提交作业到yarn上,既是flink配置了认证文件也不行,求助
    因公司需要,需要在华为FIC80环境下执行Flink作业,但是目前遇到了问题,过程如下:1、先将Flink 1.12.0 版本解压后配置conf/flink-conf.yml 的安全认证,如下:security.kerberos.login.use-ticket-cache: truesecurity.kerberos.login.keytab: /home/kgp/user.keytabsecurity.kerberos.login.principal: kgp@HADOOP.COMsecurity.kerberos.login.contexts: Client,KafkaClient环境变量中的hadoop_home 和 hadoop_classpath都配置了,flink是可以找到yarn的2、然后尝试执行官网的demo案例:先执行了kinit命令:kinit -kt user.keytab kgp然后提交作业./bin/flink run -t yarn-per-job --detached ./examples/streaming/TopSpeedWindowing.jar3、结果出现异常:此时yarn UI 界面没有此任务,按照提示执行yarn命令来查看日志命令:yarn logs -applicationId application_1616467846343_00314、执行后得到的日志为:所用到的票据皆是从FI管理界面上下载的,可以保证正确求助
  • [赋能学习] 使用python连接有kerberos认证的kafka指导
    ## 一、测试环境说明 FusionInsight集群:版本8.0.2 开启安全模式 客户端系统类型:CentOS Linux release 7.6.1810 x86_64位 集群和客户端均位于无法连接互联网的内网环境 ## 二、配置步骤 **本章节所有步骤在客户端节点执行** ### 2.1 配置yum源 已有可用yum源的可忽略2.1章节 1. 上传系统安装镜像文件 CentOS-7.6-x86_64-DVD-1810.iso 到客户端节点,例如/opt目录 2. 将镜像文件挂载到/media目录 ``` mount -o loop /opt/CentOS-7.6-x86_64-DVD-1810.iso /media ``` 3. 配置/etc/yum.repos.d/目录下的repo文件,保证该目录下只有一个以.repo结尾的文件,其内容如下 ``` [base] name=file baseurl=file:///media enabled=1 gpgcheck=0 ``` 4. 配置完毕后检查下yum源,如图执行yum repolist命令 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202012/10/164449p1ncagerkbfi3tjv.png) ### 2.2 安装python3 从python官网下载python3源码包,本例中下载的链接为 https://www.python.org/ftp/python/3.7.8/Python-3.7.8.tgz 将获取的Python-3.7.8.tgz上传到/opt目录下,安装命令如下 ``` yum -y install zlib-devel bzip2-devel openssl-devel openssl-static ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libcap-devel xz-devel libffi-devel lzma gcc cd /opt rm -rf /tmp/Python-3.7.8 tar -zxvf Python-3.7.8.tgz -C /tmp mv /tmp/Python-3.7.8 /usr/local/python-3.7 cd /usr/local/python-3.7/ ./configure --prefix=/usr/local/sbin/python-3.7 make && make install ln -sv /usr/local/sbin/python-3.7/bin/python3 /usr/bin/python3 ln -sv /usr/local/sbin/python-3.7/bin/pip3 /usr/bin/pip3 ``` ### 2.3 安装kafka-python **说明:安装该依赖之前切记不可执行 FusionInsight 客户端环境变量,即不能执行 source /opt/client/bigdata_env** 附件中的安装包都是从pypi官网下载,可直接使用,或者到pypi下载 ***<u>切记:如下依赖包的安装顺序必须是 six > decorator > gssapi > kafka-python</u>*** 1. 获取依赖包,pypi下载链接如下 six https://pypi.org/project/six/#files decorator https://pypi.org/project/decorator/#files gssapi https://pypi.org/project/gssapi/#files kafka-python https://pypi.org/project/kafka-python/#files 2. 安装依赖six ``` tar -zxvf six-1.15.0.tar.gz cd six-1.15.0 python3 setup.py install ``` 3. 安装decorator ``` tar -zxvf decorator-4.4.2.tar.gz cd decorator-4.4.2 python3 setup.py install ``` 4. 安装gssapi ``` tar -zxvf gssapi-1.6.11.tar.gz cd gssapi-1.6.11 python3 setup.py install ``` 5. 安装kafka-python ``` tar -zxvf kafka-python-2.0.2.tar.gz cd kafka-python-2.0.2 python3 setup.py install ``` ### 2.4 安装FusionInsight客户端 本步骤略,客户端安装目录自定义,例如/opt/client ## 三、验证 ### 3.1 执行kerberos认证 参考命令 ``` source /opt/client/bigdata_env kinit -k -t user.keytab developuser ``` ### 3.2 创建python测试脚本,内容参考如下 注意bootstrap_servers和sasl_kerberos_domain_name根据实际环境进行修改 ``` #!/usr/bin/env python3 # coding=utf-8 import time from kafka import KafkaProducer from kafka import KafkaConsumer def kafka_python_producer_main(): producer = KafkaProducer(bootstrap_servers='10.162.26.137:21007', security_protocol='SASL_PLAINTEXT', sasl_mechanism='GSSAPI', sasl_kerberos_service_name='kafka', sasl_kerberos_domain_name='hadoop.hadoop.com', sasl_plain_username='KafkaClient') producer.send('testTopic3', 'kafka python test'.encode('utf-8')) producer.flush() producer.close() print('producer done') def kafka_python_consumer_main(): consumer = KafkaConsumer('testTopic3', bootstrap_servers='10.162.26.137:21007', group_id='kafka-test-20191014', auto_offset_reset='earliest', security_protocol='SASL_PLAINTEXT', sasl_mechanism='GSSAPI', sasl_kerberos_service_name='kafka', sasl_kerberos_domain_name='hadoop.hadoop.com', sasl_plain_username='KafkaClient') for msg in consumer: print(msg.value) print(msg.partition) print('consumer done') if __name__ == '__main__': kafka_python_producer_main() time.sleep(1) kafka_python_consumer_main() ``` 3.3 执行测试脚本,查看执行结果 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202012/10/164828mnus548bykwullyl.png) 通过kafka自带脚本验证结果: ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202012/10/164955yustuehfqtuti1to.png) ## 更多kafka-python使用参考: https://kafka-python.readthedocs.io/en/master/usage.html
  • [技术干货] MRS开启Kerberos认证的集群,客户端使用中报Message stream modified (41)错误
    一、问题现象     hbase客户端程序访问开启Kerberos认证的MRS集群的时候,报如下错误,使用jdk版本为1.8.0_252。二、问题原因      jre-8u242及以上版本会根据krb5.conf中是否配置了renew_lifetime属性值,重新设置kdcOptions renewable属性值为true;     客户端配置文件krb5.conf中的renew_lifetime设置为0m,renewable配置的是false,服务端配置中的kdc_renewable设置的也是false;     jdk中重新设置kdcOptions renewable属性值为true后,因为renewable为false不一致,故报了此错误;     此问题不是jdk的bug,只是242版本之前不支持ticket续期,规范发生变化导致;三、问题解决办法    删除客户端使用的配置文件中的krb5.conf中的renew_lifetime = 0m配置项注:如果使用的jdk是jre 8u242及以上版本才有此问题,如果是低版本无此问题。
  • [技术干货] 每日分享:kerberos认证机制介绍
    博文地址:https://bbs.huaweicloud.com/blogs/194484Kerberos协议是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用客户端/服务器结构,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。可以用于防止窃听、防止replay攻击、保护数据完整性等场合,是一种应用对称密钥体制进行密钥管理的系统。Kerberos的扩展产品也使用公开密钥加密方法进行认证。这篇文章简单介绍了Kerberos认证的基本原理,对理解其使用有很大的帮助
  • [技术干货] Kerberos集群启动Phoenix QueryServer
    在MRS安全集群中,使用Phoenix时如何开启QueryServer会有鉴权问题,本文会基于apache-phoenix-5.0.0-HBase-2.0版本,指导如何正常启动QueryServer服务。1.首先安装Phoenix至指定目录下,可以参考https://support.huaweicloud.com/devg-mrs/mrs_06_0041.html安装Phoenix。2.进入bin目录下,例如/opt/phoenix/apache-phoenix-5.0.0-HBase-2.0-bin/bin修改hbase-site.xml文件,按照如下添加参数:hbase.regionserver.wal.codechbase.regionserver.kerberos.principalhbase.zookeeper.quorumhbase.master.kerberos.principalhbase.security.authenticationphoenix.queryserver.keytab.filephoenix.queryserver.kerberos.principalphoenix.queryserver.http.keytab.filephoenix.queryserver.http.kerberos.principal3.修改同目录下的queryserver.py脚本,在java_cmd后面按照截图将bin目录放置进去4.执行bin/queryserver.py即可以启动queryserver5.
  • [技术干货] Tableau对接MRS集群
    配置windows的kerberos认证(未开启kerberos的集群,请跳过此步骤)        1.  下载并安装MIT Kerberos,下载地址:http://web.mit.edu/kerberos/dist/#kfw-4.0 版本需和操作系统位数保持一致;        2.  确认客户端机器的时间与MRS集群的时间保持一致,时间差要小于5分钟;        3.  设置Kerberos的配置文件                1)在MRS Manager上创建角色和“人机”用户,具体请参见https://support.huaweicloud.com/usermanual-mrs/mrs_01_0343.html,角色需要根据业  务授予Hive的访问权限,并将用户加入该角色;                2)下载用户对应的认证文件,具体请参见https://support.huaweicloud.com/usermanual-mrs/mrs_01_0352.html,解压后将krb5.conf文件重命名为krb5.ini,并放到C:\ProgramData\MIT\Kerberos5 目录中。        4.  设置Kerberos票据的缓存文件;               1)  创建存放票据的目录,如“C:\temp”;         2) 设置Windows的系统环境变量,变量名称为“KRB5CCNAME”,变量值为“C:\temp\krb5cache”;     3)  重启Windows机器;5.  在windows上进行认证1)使用上面创建出来的用户名和密码登录,用户名格式为:用户名@Kerberos域名;2)打开MIT Kerberos,单击“get Ticket”,在弹出的“MIT Kerberos:Get Ticket”窗口中,“Principal”输入用户名,“Password”输入密码,然后单击“OK”。    对接Hive ODBC 测试环境使用各软件版本说明1)  MRS 2.0.5 版本集群2)  ECS (Windows Server 2016标准版 64位) ,须和MRS集群网络互通3)  Hive ODBC驱动 2.5.21 64bit(下载时需要注册信息)   下载地址:https://www.cloudera.com/downloads/connectors/hive/odbc/2-5-21.html4)  Tableau版本10.5.21 64bit   下载地址:https://www.tableau.com/support/releases/desktop/10.5.21 安装并配置Hive ODBC驱动1) 下载并安装对应的ODBC版本;2) 安装完成之后,在开始菜单栏里搜索ODBC,并根据系统选择合适版本,点击进入,如ODBC数据源(64位);      3) 在 系统DSN 页签中点击添加,并在弹出框中选择Cloudera ODBC Driver for Apache Hive,点击完成;            4) 如果MRS集群为普通集群(未开启kerberos),在弹出框中进行如下配置,其中host为任一HiveServer所在节点IP,可以在MRS Manager页面hive服务中查看;        5)如果MRS集群为安全集群(开启kerberos),在弹出框中进行如下配置,其中host为任一HiveServer所在节点IP,可以在MRS Manager页面hive服务中查看,其中Host FQDN为集群的domain name;        6)配置完成后,点击test进行测试连接,待连接成功后点击OK,保存退出;     安装并配置Tableau工具1) 下载并安装Tableau;2) 打开软件,依次执行 到服务器 -> 更多 -> 其他数据库(ODBC);3) 在弹出框中,DSN选择刚才配置的ODBC名称,点击连接,待连接成功后,配置数据库名称为HIVE,然后点击登录按钮;      4) 进入Tableau界面之后,点击架构框的下拉选项,点击搜索并选择对应的database,然后点击表选项的下拉框,点击搜索即可查询操作创建的表。            对接Spark 测试环境使用各软件版本说明1) MRS 2.0.5 版本集群2) ECS (Windows Server 2016标准版 64位) ,须和MRS集群网络互通3) Spark ODBC驱动 1.2-64-bit     下载地址:https://www.tableau.com/support/drivers4) Tableau版本10.5.21 64bit     下载地址:https://www.tableau.com/support/releases/desktop/10.5.21安装并配置Spark ODBC驱动1)下载并安装对应版本的ODBC驱动;2) 安装完成之后,执行安装目录下的DriverConfiguration64.exe文件,      如C:\Program Files\Simba Spark ODBC Driver\lib\ DriverConfiguration64.exe;3) 如果MRS集群为普通集群(未开启kerberos),在弹出窗口中进行如下配置;      4)如果MRS集群为安全集群(开启kerberos),在弹出窗口中进行如下配置,其中Host FQDN为集群的domain name;     5)点击Advanced Options,在Advanced Options窗口勾选如下选项后,点击OK按钮按钮保存退出;      安装并配置Tableau1) 下载并安装Tableau工具;2) 打开软件,依次执行 到服务器 -> 更多 -> Spark SQL ;3) 在弹出窗口中进行如下配置,然后点击登录按钮。其中服务器为任一jdbcServer所在节点IP,端口为22550;      4) 进入界面之后,点击架构框的下拉选项,点击搜索并选择对应的database,然后点击表选项的下拉框,点击搜索即可查询操作创建的表。      FAQ   1.  票据一定时间(如10小时)后过期,无法再访问数据在windows上新增定时任务,定时执行kinit命令,刷新kerberos票据
  • [技术干货] 集群守卫Kerberos&amp;Ldap
    作者叶子是一位90后,天秤座,大数据&人工智能美女讲师。钟情创作,相信一切感受皆是生命的体验,坚持在朴素的文字中寻找生活的出路。是一位集才气于一身的大美女。【技术分享】在中国有这样一句话,能者多劳。而大数据既然可以用来预测未来,那么大数据集群肩负的责任有多重,我们可想而知。在这样一种情况下,首先就要保证这个集群的安全性。怎么保证呢?大家都玩QQ或者微信吧?我们想想腾讯他是怎么保证用户使用QQ或者微信的安全性的?是不是需要登录密码才可以登录?这里边就涉及到一个认证的问题。在我们的大数据集群里,也有认证,而且是专门的一个组件来做整个集群的认证。他就是Kerberos&Ldap。kerberos&Ldap是怎么做认证的呢?我们先回想一个生活中很常见的场景:买票看电影。电影,我们每一个人应该都看过吧?假设电影院就是我们的集群,并不是我们想进去就能随便进去的,“持票入场”就是最基本的认证方式。那么从买票到入场我们要经历那几个流程呢?我们以网上买票为例跟大家做一个简单的说明:第一步,网上订票,获取电子凭证;第二步,出示电子凭证,到售票窗口获取纸质票据;第三步,出示纸质票据,经检验之后进入影院。注意,电子凭证和纸质票据都具有一定的有效期!这个过程和我们的Kerberos&Ldap认证非常的类似。Kerberos&Ldap认证过程中也有两类票据,一类是TGT(票据授权票据),一类是ST(服务票据)。用户要登录集群的时候,需要先找Kerberos的认证服务器(AS)做一个用户认证,获取TGT;用户拿到TGT之后访问Kerberos的票据授权服务器(TGS),获取访问相应服务的ST(服务票据);拿到服务票据之后用户才可以访问最终的服务器!但是又问题来了,这里面涉及到的用户认证具体怎么做的呢?TGT和ST又是怎么发放的呢?接下来请看详细流程。1、客户端需要访问某个服务器。2、客户端发送报文给Kerberos,申请TGT。客户端在发送报文给Kerberos的时候,会发送两份信息第一份信息是明文信息(我是谁,我需要申请一张TGT去访问服务)第二份信息是加密信息(客户端的基本信息),通过客户端的密码加密的3、Kerberos接收到报文。根据客户端发送的明文信息,去Ldap找到客户端的密码通过从Ldap拿到的客户端密码去解密客户端发送给他的加密信息解密完成之后,对比解密出的客户端信息和客户端发送的明文信息是否一致4、Kerberos生成一个session key。将session key复制两分一份session key通过客户端的密码加密另一份session key和客户端信息通过Kerberos 密码加密(即TGT)Kerberos将这份信息一起发送给客户端5、客户端申请ST。向Kerberos发送请求(我是谁,我想要访问哪个服务)-->明文信息客户端通过自己的密码解析上一步Kerberos发送给自己的通过自己密码加密的报文,拿到session key使用session key将自己的信息加密将加密信息和TGT一起发送给Kerberos6、Kerberos接收到客户端发送给他的报文。先通过自己的密码解析TGT,解析完成之后,拿到session key(Kerberos服务端和客户端的session key)和客户端信息通过拿到的session key(Kerberos服务端和客户端的session key)解密上一步客户端发送给他的经过session key(Kerberos服务端和客户端的session key)加密的信息,拿到客户端信息将客户端信息和TGT里面包含的客户端信息做比较,看是否符合,如果符合,说明此客户端之前已经通过Kerberos认证,可以给客户端生成STKerberos 再次生成一个session key(客户端和他所要访问的服务的session key)通过客户端所要访问的服务端的密码将session key(所要访问的服务端和客户端的session key)和客户端信息加密(即ST)通过上一步发送给客户端的session key(Kerberos服务端和客户端之间的session key)将客户端和服务端的session key加密将这两个报文一起发送给客户端7、客户端收到两个报文。通过本地缓存的session key解密Kerberos 给他发送的通过自己session key加密的自己和服务端的session key再使用和服务端之间的session key将自己的信息加密将加密好的报文和ST一起发送给自己所要访问的服务8、被访问服务收到报文。通过自己的密码解密ST,拿到和客户端之间的session key和客户端信息使用session key解密客户端使用session key加密的信息,拿到客户端信息将拿到的客户端信息和ST里面包含的客户端信息做比对,看是否一致,如果一致,则客户端认证成功9、客户端可以去访问他所需要访问的服务。今天的分享看起来好像有点小复杂,为了保卫集群安全,防止不法分子入侵,Kerberos&Ldap真是费劲了力气,点个赞!不过话说回来,虽然整个认证过程经历了一次又一次的加密解密,绕来绕去让人眼花缭乱,但其实都是有规律可循的哦!你发现Kerberos&Ldap认证**的套路了吗?文末惊喜大放送:小编写了这么多遍Kerberos&Ldap,有没有细心的读者们想要问,Kerberos和Ldap究竟是个什么关系呢?为什么要写在一起呢?简单的理解,在认证过程中,Kerberos负责认证逻辑的具体执行,Ldap负责存放和管理认证数据,这两者分工明确,紧密关系在一起!个人订阅号“叶子的浅浅时光”,集文学作品和技术文章于一体。读者叹之:才学傲须眉,妙笔若行云。
总条数:29 到第
上滑加载中