社区版本sparkthriftserver对接开kerberos的cdp/cdh的metastore

376 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

引言

#社区sparkthrift对接开kerberos的cdp/cdh的metastore,也开启了ssl。
#ps:都自己对接过了。按照下面的文档ok。

步骤

#首先除了先搭建好的cdp外,另外搭建一台机器,上面只需要hadoop的客户端和spark、kerberos客户端即可。

yum install krb5-workstation krb5-libs krb5-auth-dialog

kerberos客户端需要修改,和对应cdp集群的保持一致。

PS:一般是修改/etc/krb5.conf这个客户端配置即可。

#hadoop客户端的core-site.xml hdfs-site.xml yarn-site.xml记得需要更换成对接集群的文件

PS:这里放hadoop文件是为了能使用hdfs命令,如果不需要的话就不用改,因为spark的conf里面只需要hive-site.xml。

spark的conf下hive-site.xml配置:

#在单独的spark tirift机器里面的hive-site.xml的配置的话只要修改thrift为cdp/cdh集群的,并且新增kerberos和ssl的配置,其他配置默认的就ok。

#修改
<property>
<name>hive.metastore.uris</name>
<value>thrift://cdp02:9083</value>
<description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
</property>

#新增/修改

#如果是spark的thrift不开启kerberos的话,下面的hiveserver2相关配置去掉就好。我下面的配置是因为hive的metastore和这个thrift都需要开启kerberos。

<property>
<name>hive.metastore.sasl.enabled</name>
<value>true</value>
</property>
<property>
    <name>hive.server2.authentication</name>
    <value>kerberos</value>
</property>
<property>
<name>hive.metastore.kerberos.principal</name>
<value>hive/cdp02@DTSTACK.COM</value>
</property>
<property>
<name>hive.server2.authentication.kerberos.keytab</name>
<value>/opt/dtstack/Spark/spark_pkg/conf/hive.keytab</value>
</property>
<property>
<name>hive.metastore.kerberos.keytab.file</name>
<value>/opt/dtstack/Spark/spark_pkg/conf/hive.keytab</value>
</property>
<property>
<name>hive.server2.authentication.kerberos.principal</name>
<value>hive/cdp02@DTSTACK.COM</value>
</property>

#以上的票据必须从cdp集群拷贝过来,而且需要注意metastore是否在这台机器,拷贝好princpal文件即可。

启动

#spark thrift可开kerberos也可不开,开关在于启动参数,还有个hive-site.xml配置文件需要修改,参考下方配置即可。启动命令的话各式各样,比如我的是下面这个:

bin/spark-submit  --class "$command"  --name 'Thrift JDBC/ODBC Server' --conf "spark.driver.extraJavaOptions=-javaagent:./dtstack/prometheus/jmx_prometheus_javaagent-0.3.1.jar=9508:./dtstack/prometheus/spark-prometheus.yml" --conf spark.driver.memory=2G --executor-memory 1G --num-executors 2 --name=ThriftServer02  --principal hive/cdp02@DTSTACK.COM --keytab /opt/dtstack/Spark/spark_pkg/conf/hive.keytab --driver-java-options "-XX:HeapDumpPath=./logs/thriftserver_heap.hprof -XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError -XX:+UseGCLogFileRotation -Xloggc:./logs/spark_thriftserver_gc.log -XX:NumberOfGCLogFiles=2 -XX:GCLogFileSize=256M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -Dlog4j.configuration=file:/opt/dtstack/Spark/spark_pkg/conf/log4j.properties -Dapp.logging.name=$logname "   >> "${log}" 2>&1 < /dev/null

#这里命令启动参数略有不同,大家根据自己的修改一下即可。

成功

遇到的问题

问题一:

#spark的conf里面需要hdfs-site.xml core-site.xml hive-site.xml yarn-site.xml。

#如果缺少了yarn-site.xml的话,thrift查询会报错如下:

java.io.IOException: Can’t get Master Kerberos principal for use as renewer

PS:这一步是我之前第一次遇到的报错了,我现在已经不确定是否能够复现。因为第二次也是放东西进去了。如果报错的话就这样操作吧。因为按理来说spark conf下是不需要hdfs yarn这些配置的,我没有二次验证,也记不清楚了不想再验证下,会很麻烦。

问题二:

#当然我插入创建表的时候也遇到过问题,原因是thrift初始化的时候去创建hdfs目录了,用的是root去创建,但是我hive的warehouse是hive。所以创建stage的时候就会两头报错(因为两个hdfs目录不同)。所以我在spark的spark-env.sh里面开头加上了

export HADOOP_USER_NAME=hive

#当然这是没有开kerberos的情况下,我们这里开启了kerberos是没用的。这个问题是我验证没有开启kerberos集群的时候遇到的。

#这样的话thrift初始化的时候创建的是hive目录。当然这个问题不是每个人都会遇到的,我这里有些逻辑跟开源的稍微有点不同。

问题三:

#死活报gss认证问题。

原因是jdk的jre/lib/security下的jar包需要更换。local_policy.jar和US_export_policy.jar需要替换掉。是java的问题。这个对应jar我貌似上传不了附件,可以自己找下。