在Kubernetes上远程访问HDFS

时间:2018-11-03 17:43:04

标签: hadoop kubernetes hdfs

我试图在minikube上(现在)设置HDFS,然后再在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,但我的本地计算机当然看不到这些地址。

有什么办法可以使我工作吗?预先感谢!

1 个答案:

答案 0 :(得分:3)

我知道这个问题只是关于使其能够在开发环境中运行,但是HDFS在K8上仍处于开发阶段,因此,无论如何我都不会在生产环境中运行它(截至撰写本文时)。要使其在容器编排系统上工作非常棘手,因为:

  1. 您所谈论的是大量数据和许多节点(名称节点/数据节点),它们并不是要在群集中的不同位置启动/停止的。
  2. 如果不将namenode / datanode固定到K8s节点,则可能会出现群集不断失衡的风险(这违背了使用容器编排系统的目的)
  3. 如果您以高可用性模式运行名称节点,并且由于某种原因而导致名称节点死亡并重新启动,则可能会损坏名称节点元数据,从而使您丢失所有数据。如果您只有一个节点,并且没有将其固定到K8s节点,那么这也有风险。
  4. 如果不在不平衡的集群中运行,就无法轻松地进行扩展和缩小。运行不平衡的群集会破坏HDFS的主要目的之一。

如果您查看DC/OS,他们就能在其平台上使用它,因此可能会为您提供一些指导。

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

希望有帮助!