首页 > 解决方案 > 是否可以使用 Spark 从 Kubernetes 之外的外部 HBase 集群中读取数据进行处理?

问题描述

我无法在 Kubernetes 中使用 Spark (2.4.3) 从 HBase (1.3) 读取数据。驱动程序 pod 和执行程序 pod 已成功启动,但是,当驱动程序 pod 尝试调用 HBase 时,它​​与 HBase 的连接失败并出现以下错误:

java.net.ConnectException: Connection refused at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361) at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1081)

我认为根本原因是由于:

INFO ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181

spark 驱动程序和执行程序 pod 正在 localhost 中寻找 zookeeper,而不是远程主机。此外,这些 pod 似乎忽略了我提供的 hbase-site.xml。

我已将带有正确远程主机信息的 hbase-site.xml 放在自定义 spark 映像的 $SPARK_HOME/conf/ 目录中。我已经测试了可以通过使用自定义 spark 映像运行 kubernetes pod 部署来建立从 kubernetes 到 hbase 的连接,该命令使用以下命令使其在 yaml 中保持启动和运行:

command: ["sleep"]
args: ["infinity"]

然后,我通过kubectl exec -it <pod> bash. 在这里,我通过 spark-submit 运行完全相同的脚本,该脚本用于在 Spark 独立本地模式下从 HBase 读取,并且能够成功地从 HBase 读取。我用来从 spark 连接到 HBase 的方法是通过 shc 连接器。

这一次,当我运行完全相同的脚本时,spark-submit 现在指向 k8 集群,它失败了。

由于某种原因,hbase-site.xml 被忽略,驱动程序和执行程序 pod 通过 localhost:2181 查找 zookeeper。

在部署 pod 中,我使用两个命令进行测试:

从 Kubernetes 外部连接到 HBase 集群的 Spark 本地模式

spark-submit \
--jars=/hbase-jars/* \
--files=gs://<project>/dependencies/hbase-site.xml \
gs://<project>/dependencies/test-read.py

hbase-jars 是存储 shc 和相关 hbase jar 的地方。为了便于测试,我已将 hbase-site.xml 放在 gcs 上。此测试能够从 hbase 返回读取。

Spark Kubernetes 提交:

--master k8s://https://<ip> \
--deploy-mode cluster \
--conf spark.driver.memory=2G   \
--conf spark.executor.memory=2G  \
--conf spark.executor.instances=2   \
--conf spark.kubernetes.executor.request.cores=1 \
--conf spark.kubernetes.namespace=default   \
--conf spark.authenticate.driver.serviceAccountName=default   \
--conf spark.kubernetes.container.image=gcr.io/<project>/spark-hbase:latest \
--jars=/hbase-jars/* \
--files=gs://<project>/dependencies/hbase-site.xml \
gs://<project>/dependencies/test-read.py

从上面返回错误。我还连接到正在运行的驱动程序和执行程序 pod 以运行本地 spark-submit 并得到与运行 Kubernetes 的 spark-submit 时相同的错误

是否需要设置某种环境变量才能使驱动程序和执行程序 pod 成功读取 hbase-site.xml?我是否在 spark-submit 中错误地提供了 hbase-site.xml?非常感谢您的帮助!

标签: pythonapache-sparkkubernetespysparkhbase

解决方案


推荐阅读