如何将HDFS(Hadoop分布式FS)部署到K8s(Kubernetes)集群?

时间:2020-05-11 18:39:12

标签: apache-spark hadoop kubernetes hdfs

所以我已经启动并运行了一个K8s集群,我想在其之上运行Spark作业。

Kubernetes是v1.15.3和Spark v2.4.5

现在用于数据存储,我正在考虑使用HDFS,但我不想安装包括YARN和MapReduce的整个Hadoop库(如果我错了,请纠正我)。

我已经将this存储库视为在线上唯一可用的直接解决方案,但目前不适用于我。

当我尝试按回购自述文件中所述部署它时,我看到创建了多个Pod,并且所有Pod进入Running状态后,my-hdfs-namenode-0吊舱进入Error状态,很多吊舱开始崩溃。

这是我从kubectl logs pod/my-hdfs-namenode-0的日志中得到的错误:

20/05/11 09:47:57 ERROR namenode.NameNode: Failed to start namenode.
java.lang.IllegalArgumentException: Unable to construct journal, qjournal://my-hdfs-journalnode-1.my-hdfs-journalnode.default.svc.cluster.local:8485;my-hdfs-journalnode-2.my-hdfs-journalnode.default.svc.cluster.local:8485;my-hdfs-journalnode-0.my-hdfs-journalnode.default.svc.cluster.local:8485/hdfs-k8s
    at org.apache.hadoop.hdfs.server.namenode.FSEditLog.createJournal(FSEditLog.java:1638)
    at org.apache.hadoop.hdfs.server.namenode.FSEditLog.initJournals(FSEditLog.java:282)
    at org.apache.hadoop.hdfs.server.namenode.FSEditLog.initJournalsForWrite(FSEditLog.java:247)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.format(NameNode.java:985)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1429)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1554)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.apache.hadoop.hdfs.server.namenode.FSEditLog.createJournal(FSEditLog.java:1636)
    ... 5 more
Caused by: java.lang.NullPointerException
    at org.apache.hadoop.hdfs.qjournal.client.IPCLoggerChannelMetrics.getName(IPCLoggerChannelMetrics.java:107)
    at org.apache.hadoop.hdfs.qjournal.client.IPCLoggerChannelMetrics.create(IPCLoggerChannelMetrics.java:91)
    at org.apache.hadoop.hdfs.qjournal.client.IPCLoggerChannel.<init>(IPCLoggerChannel.java:178)
    at org.apache.hadoop.hdfs.qjournal.client.IPCLoggerChannel$1.createLogger(IPCLoggerChannel.java:156)
    at org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager.createLoggers(QuorumJournalManager.java:367)
    at org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager.createLoggers(QuorumJournalManager.java:149)
    at org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager.<init>(QuorumJournalManager.java:116)
    at org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager.<init>(QuorumJournalManager.java:105)
    ... 10 more

我猜这是与名称解析(DNS)相关的错误? Here是完整的参考日志。

现在,该存储库没有得到积极维护,因此如果有人可以建议我如何解决此错误,或者建议如何将HDFS部署到Kubernetes集群中。

1 个答案:

答案 0 :(得分:1)

通常,我建议您不要在k8s内使用HDFS ...

  1. 需要对NameNode HA进行容器化,并且NameNode文件系统必须是有状态的。
  2. 您需要Zookeeper QJM,它可以与etcd竞争,以达到领导选举的目的。

HDFS是在真正考虑k8持久卷之前设计的。 Hadoop Ozone项目仍在开发中,旨在解决这些限制。

同时,我建议您考虑使用MinIO或Project Rook(在CephFS上),两者都提供与Hadoop兼容的文件系统(HCFS)


如果必须使用HDFS,则在k8s外部进行设置,然后从容器内对其进行请求。

关于YARN,请务必观看Yunikorn项目(k8s上的YARN)