清澈如初|Spark Operator 问题的救火,一次
背景你听过Spark , Maybe听过SparkonK8S , 但是Almostnot听过SparkOperator 。
JustRemember这是个车厂多于轮胎厂的时代 , 组合创新盛行而有效 。
SparkOperator就是GoogleCloudNative方式在K8S上运行Spark的组装车 。 不多说 , 上车 。
现象在升级SparkOperator后遇到了SparkApplication无法解析HDFSnamenodeservicename , 报"UnknownHost"的错误 。 前方说我们十万火急 , 需要立刻解决 , 不解决就影响项目进度了 。 耳熟?对 , 我们遇到的问题4个9以上面的话结尾 。 First , calmdown 。
线索从表象上看 , 最直接的问题是在SparkDriver中没有HDFS的配置文件:hdfs-site.xml从Pod的信息中可以看到HDFS配置Volume未挂载查看SparkOperator的Log , 有一行可疑信息"BadCertificate"信息因为"BadCertificate"能给我们的信息可能很关键 , 但是并不直观 , 没有直接说明是谁和谁之间通信的证书不对 , 所以本次定位是采用从Volume挂载的地方入手 。 平常喜欢的方式是从现象到理论到代码的方式进行递进 。 先顺着线索收集了相关的理论信息 。
1.MountingvolumeSparkOperator的说明文档中有指出Mountingvolume需要Enablewebhook , 这个点比较难找 。
https://github.com/GoogleCloudPlatform/spark-on-k8s-operator/blob/master/docs/user-guide.md#mounting-volumes
在K8S中 , ServiceAccount通常我们只能使用公钥 , 如果自定义服务之间需要访问 , 就需要自己生成密钥对、创建K8sSecret , 这个过程在Spark-web-hook-init中调用源码里面hack目录下的脚本完成 。
3.Web-hook-init从这个Job的yaml文件中可以看到 , 在早期的版本中干的事情是清除密钥和创建密钥 。 但是遇到了Update会清除密钥但不创建新密钥的问题 , 后面就将这两个功能拆分成两个yaml 。 见
issues: