如何将HDFS (Hadoop分布式文件系统)部署到K8s (Kubernetes) 集群中?

4

我有一个正在运行的K8s集群,想在其上运行Spark作业。

Kubernetes版本为v1.15.3,Spark版本为v2.4.5

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

我看到了这个仓库作为唯一在线直接提供解决方案,但目前对我来说它不起作用。

当我尝试按照仓库中的ReadMe所述部署它时,我发现创建了多个Pod,并且只要它们全部进入Running状态,my-hdfs-namenode-0 Pod就会进入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

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

现在,这个仓库没有得到积极的维护,如果有人可以建议我如何解决这个错误或者另一种部署HDFS到我的Kubernetes集群的方法。

1个回答

11

一般来说,我建议您不要在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在k8s上的应用)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接