最近领导安排我给一个客户安装CDH6.1,具体过程可以参考SUSE 12安装CDH 6.1.0操作步骤【附CDH/HDP安装资料】。由于不是我要用,安装完以后再那边睡大觉了。安装CDH不是终极目标,终极目标是要在CDH上部署一个SAPHanaSparkController的组件。
和大家一样,我知道Hana是什么,知道Spark是什么,但是并不清楚这个SAPHanaSparkController具体是干啥的。安装材料只有一个官方的英文指导文档,没办法,只能硬着头皮上。
安装过程暂时不赘述了,重点总结这中间遇到的坑。再多次踩坑重试以后,SAPHanaSparkController组件终于安装成功,并且启动成功。但是很诡异的是端口没有监听。
很正常的逻辑,开始找日志中的错误,但是很可惜,啥也没有。
Tue Jan 26 10:09:32 CST 2021JAVA_HOME=/usr/java/jdk1.8.0_181Using /var/run/cloudera-scm-agent/process/253-spark_controller-SPARK_CONTROLLER_MASTER as conf dirUsing scripts/control.sh as process scriptCONF_DIR=/var/run/cloudera-scm-agent/process/253-spark_controller-SPARK_CONTROLLER_MASTERCMF_CONF_DIR=Going to update /var/run/cloudera-scm-agent/process/253-spark_controller-SPARK_CONTROLLER_MASTER Permissions as rootStarting SAP HANA Spark Controller as hanaes on port: INFO: Verifying, that this script is run as 'hanaes' user ...INFO: Starting SAP HANA Spark Controller ... INFO: Current Class path is /var/run/cloudera-scm-agent/process/253-spark_controller-SPARK_CONTROLLER_MASTER/conf:/opt/cloudera/parcels/CDH/lib/spark/jars/*:/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/*:/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/lib/*:/opt/cloudera/parcels/CDH/lib/hadoop-yarn/*:/opt/cloudera/parcels/CDH/lib/hadoop-yarn/lib/*:/opt/cloudera/parcels/CDH/lib/hive/lib/*:/etc/hadoop/conf:/etc/hive/conf:/opt/cloudera/parcels/SAPHanaSparkController-2.5.0/lib/sap/spark/controller/*:/opt/cloudera/parcels/SAPHanaSparkController-2.5.0/lib/sap/spark/controller/lib_2.11/*:/opt/cloudera/parcels/SAPHanaSparkController-2.5.0/lib/sap/spark/controller/lib_2.11/other/*:/opt/cloudera/parcels/SAPHanaSparkController-2.5.0/lib/sap/spark/controller/lib_2.11/hana/*:/opt/cloudera/parcels/CDH/lib/hadoop/*:/opt/cloudera/parcels/CDH/lib/hadoop/lib/*:/opt/cloudera/parcels/CDH-6.1.0-1.cdh6.1.0.p0.770702/lib/hadoop/libexec/../../hadoop-hdfs/*:/opt/cloudera/parcels/CDH-6.1.0-1.cdh6.1.0.p0.770702/lib/hadoop/libexec/../../hadoop-hdfs/lib/*INFO: Running Java app with flags: -Xmx8172m INFO: Starting in Foreground
周末的时候,先是怀疑启动脚本没有执行完,先后下载两个启动脚本层层追踪,最后发现脚本启动以后就只有上图那个进程。于是有怀疑参数不正确,于是找到对应的核心包controller.core_2.11-2.5.0.jar,反编译了尝试找其中的配置项,也没有任何结果。
最新的突破是昨天,也就是周二,我准备找人帮我查找错误,发日志的时候,被眼尖的同事发现了一个错误:
2021-01-26 10:09:34,172 INFO com.sap.hana.network.Server: Preparing to start SAP HANA Spark Controller ...2021-01-26 10:09:34,186 INFO com.sap.hana.network.Server: Validating hanaes property configuration...2021-01-26 10:09:34,203 INFO com.sap.hana.utils.ClusterUtils: Running in standalone mode.2021-01-26 10:09:36,057 WARN org.apache.hadoop.util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable2021-01-26 10:09:36,091 INFO org.apache.spark.sql.hana.HanaSparkFacade: Spark Assembly: /opt/cloudera/parcels/CDH/lib/spark/jars/*2021-01-26 10:09:36,092 INFO org.apache.spark.sql.hana.HanaSparkFacade: Running Spark version 2Exception: java.security.PrivilegedActionException thrown from the UncaughtExceptionHandler in thread "main"
重点就是最后一句“Exception: java.security.PrivilegedActionException thrown from the UncaughtExceptionHandler in thread "main"”,这个起码说明,jar包启动过程中还是报错了,说明jar程序代码应该是没问题的。于是研究的重点转移到:到底这个未捕获的异常时什么异常?
首先,cdh页面上面看不到任何更具体的信息,操作系统的进程目录也只有cdh页面展示的日志内容。
由于这个应用时基于spark的,所以我就想到了去spark上面看看有没有进程和错误信息。很意外的就发现了spark处于异常状态。
百度了一下这个错误,很容易就联想到了hdfs文件权限问题。参照下面的说明,执行了三步操作,spark就可以正常查看进程日志了。不过并没有什么收获。
由于这个权限问题的启发,我就联想到了SAPHanaSparkController可能也是权限异常。在深入解决SAPHanaSparkController异常之前,我有找到几个命令可以查看java进程中的错误。
虽然看不懂是什么错误,但是在此指向了hadoop的hdfs文件系统。检查了一下CDH安装以后自动生成的用户及其归属组,我瞬间凌乱了。
不过SAPHanaSparkController本身其实也没错,创建用户默认加上了hdfs组和sapsys组,奈何CDH的创建的用户没有统一归属组。
既然明确了是用户属主权限,接下来就由两条路可以走了。第一种方案,关闭用户组权限验证,即设置dfs.permissions=flase,第二种方案,将用户统一归属到默认的supergroup组。鉴于当时的环境是测试环境,加上supergroup组也可能遇上权限不足的情况,于是我选择了第一种方案。
调整完hdfs参数,然后重启相关进程,终于看到了7860的端口处于监听状态了。连续多日的阴霾终于一扫而空。
回头来总结,其实SAPHanaSparkController安装也没用问题,重点在于CDH的默认配置和默认权限存在CDH默认的用户组是supergroup,但是对应的用户都没有归属到这个用户组。这点实在是太坑了。