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

Apache spark 如何将HDFS(Hadoop分布式FS)部署到K8s(Kubernetes)集群?,apache-spark,hadoop,kubernetes,hdfs,Apache Spark,Hadoop,Kubernetes,Hdfs,所以我有一个K8s集群并在运行,我想在上面运行Spark jobs Kubernetes是v1.15.3版,Spark是v2.4.5版 现在对于数据存储,我正在考虑使用HDFS,但我不想安装整个Hadoop库,其中包括Thread和MapReduce(如果我错了,请纠正我) 我认为存储库是唯一在线可用的直接解决方案,但它目前不适合我 当我尝试以repo自述文件中提到的方式部署它时,我看到创建了多个pod,当所有pod都进入运行状态时,my-hdfs-namenode-0pod进入错误状态,许多p

所以我有一个K8s集群并在运行,我想在上面运行Spark jobs

Kubernetes是v1.15.3版,Spark是v2.4.5版

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

我认为存储库是唯一在线可用的直接解决方案,但它目前不适合我

当我尝试以repo自述文件中提到的方式部署它时,我看到创建了多个pod,当所有pod都进入
运行
状态时,
my-hdfs-namenode-0
pod进入
错误
状态,许多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
20/05/11 09:47:57错误namenode.namenode:无法启动namenode。
java.lang.IllegalArgumentException:无法构造日志,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
位于org.apache.hadoop.hdfs.server.namenode.FSEditLog.createJournal(FSEditLog.java:1638)
位于org.apache.hadoop.hdfs.server.namenode.FSEditLog.initJournals(FSEditLog.java:282)
位于org.apache.hadoop.hdfs.server.namenode.FSEditLog.initJournalsForWrite(FSEditLog.java:247)
位于org.apache.hadoop.hdfs.server.namenode.namenode.format(namenode.java:985)
位于org.apache.hadoop.hdfs.server.namenode.namenode.createNameNode(namenode.java:1429)
位于org.apache.hadoop.hdfs.server.namenode.namenode.main(namenode.java:1554)
原因:java.lang.reflect.InvocationTargetException
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于org.apache.hadoop.hdfs.server.namenode.FSEditLog.createJournal(FSEditLog.java:1636)
... 还有5个
原因:java.lang.NullPointerException
位于org.apache.hadoop.hdfs.qjournal.client.IPCLoggerChannelMetrics.getName(IPCLoggerChannelMetrics.java:107)
位于org.apache.hadoop.hdfs.qjournal.client.IPCLoggerChannelMetrics.create(IPCLoggerChannelMetrics.java:91)
位于org.apache.hadoop.hdfs.qjournal.client.IPCLoggerChannel.(IPCLoggerChannel.java:178)
位于org.apache.hadoop.hdfs.qjournal.client.IPCLoggerChannel$1.createLogger(IPCLoggerChannel.java:156)
位于org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager.createLoggers(QuorumJournalManager.java:367)
位于org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager.createLoggers(QuorumJournalManager.java:149)
位于org.apache.hadoop.hdfs.qjournal.client.qorumjournalmanager.(qorumjournalmanager.java:116)
位于org.apache.hadoop.hdfs.qjournal.client.qorumjournalmanager.(qorumjournalmanager.java:105)
... 10多
我猜这是一个名称解析(DNS)相关的错误?是供参考的完整日志


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

一般来说,我建议不要在k8s中使用HDFS

  • namenodeha需要容器化,NameNode文件系统必须是有状态的
  • 你需要动物园管理员QJM,它在某种程度上与etcd竞争,用于领导人选举 HDFS是在真正考虑k8s持久卷之前设计的。Hadoop臭氧项目仍在开发中,旨在克服这些限制

    同时,我建议您考虑使用MinIO或projectrook(在cepfs上),它们都提供与Hadoop兼容的文件系统(HCFS)


    如果必须使用HDFS,则在k8s外部设置它,然后从容器中向它发出请求

    关于纱线,确保观看Yunikorn项目(k8s上的纱线)