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

Dr.*_*eto 4 hadoop hdfs apache-spark kubernetes

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

Kubernetes 是 v1.15.3 ,Spark v2.4.5

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

我已将此存储库视为在线可用的唯一直接解决方案,但目前它对我不起作用。

当我尝试按照存储库上的自述文件中提到的方式部署它时,我看到创建了多个 Pod,一旦所有 Pod 都进入状态Runningmy-hdfs-namenode-0Pod 就会进入Error状态,并且许多 Pod 开始崩溃。

这是我在日志中收到的错误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
Run Code Online (Sandbox Code Playgroud)

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

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

cri*_*007 12

一般来说,我建议你不要在 k8s 中使用 HDFS...(尽管像 Uber 这样的公司已经这样做了,他们也有大型团队来维护这项工作)

  1. NameNode HA 需要容器化,并且 NameNode 文件系统必须是有状态的。
  2. 您需要 Zookeeper QJM,它在某种程度上与 etcd 竞争,以实现领导者选举的目的。

HDFS 是在真正考虑 k8s 持久卷之前设计的。Hadoop Ozone 项目现已普遍可用,旨在解决这些限制。它还具有 k8s 部署说明。

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


如果您必须使用 HDFS,那么您可以在 k8s 外部设置它,然后从容器内向它发出请求。

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