在Kubernetes上远程访问HDFS

mou*_*usi 5 hadoop hdfs kubernetes

我正在尝试在minikube上(目前)以及以后在DEV kubernetes群集上设置HDFS,以便可以在Spark上使用它。我希望Spark在我的机器上本地运行,以便我可以在开发过程中以调试模式运行,因此它应该可以在K8s上访问我的HDFS。

我已经设置了1个namenode部署和一个datanode statefulset(3个副本),当我从群集中使用HDFS时,它们可以正常工作。我正在为数据节点使用无头服务,为名称节点使用cluster-ip服务。

当我尝试公开hdfs时,问题开始了。我当时正在考虑使用一个入口,但这只会将端口80暴露在集群外部,并将路径映射到集群内的其他服务,这不是我想要的。据我了解,我的本地Spark作业(或hdfs客户端)与namenode对话,该namenode为每个数据块提供一个地址。该地址虽然有点类似172.17.0.x:50010,但是我的本地机器当然看不到这些地址。

有什么办法可以使我工作吗?提前致谢!

Ric*_*ico 5

我知道这个问题是关于让它在开发环境中运行,但是 HDFS 在 K8s 上的工作正在进行中,所以我无论如何都不会在生产中运行它(在撰写本文时)。让它在容器编排系统上工作非常棘手,因为:

  1. 您正在谈论大量数据和大量节点(名称节点/数据节点),它们并不打算在集群的不同位置启动/停止。
  2. 如果您没有将您的名称节点/数据节点固定到 K8s 节点(这违背了拥有容器编排系统的目的),那么您将面临集群持续不平衡的风险
  3. 如果您在 HA 模式下运行您的名称节点,并且由于任何原因您的名称节点死亡并重新启动,您将面临破坏名称节点元数据的风险,这将使您丢失所有数据。如果您只有一个节点并且没有将其固定到 K8s 节点,这也是有风险的。
  4. 如果不在不平衡的集群中运行,您就无法轻松扩展和缩减。运行不平衡的集群违背了 HDFS 的主要目的之一。

如果您查看DC/OS,他们能够使其在他们的平台上运行,因此可以为您提供一些指导。

在 K8s 中,您基本上需要为所有 namenode 端口和所有 datanode 端口创建服务。您的客户端需要能够找到每个 namenode 和 datanode,以便它可以读取/写入它们。此外,某些端口无法通过 Ingress,因为它们是第 4 层端口 (TCP),例如名称8020节点和数据50020节点上的IPC 端口。

希望能帮助到你!