apache-spark - 如何将 HDFS(Hadoop 分布式 FS)部署到 K8s(Kubernetes)集群?
问题描述
所以我有一个 K8s 集群启动并运行,我想在它上面运行 Spark 作业。
Kubernetes 是 v1.15.3 和 Spark v2.4.5。
现在对于数据存储,我正在考虑使用 HDFS,但我不想安装包括 YARN 和 MapReduce 的整个 Hadoop 库(如果我错了,请纠正我)。
我已经将此存储库视为唯一可在线获得的直接解决方案,但它目前不适用于我。
当我尝试按照 repo 上的自述文件中提到的方式部署它时,我看到创建了多个 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 集群。
解决方案
一般来说,我建议你不要在 k8s 中使用 HDFS ......
- NameNode HA 需要容器化,NameNode 文件系统必须是有状态的。
- 你需要 Zookeeper QJM,它在某种程度上与 etcd 竞争,用于领导选举。
HDFS 是在真正考虑 k8s 持久卷之前设计的。Hadoop Ozone 项目仍在开发中,旨在解决这些限制。它目前有 k8s 部署,说明,不过
或者,我建议您考虑使用 MinIO 或 Project Rook(在 CephFS 上),它们都提供与 Hadoop 兼容的文件系统 (HCFS)
如果你必须使用 HDFS,那么在 k8s 之外设置它,然后从容器内向它发出请求。
关于 YARN,请务必观看 Yunikorn 项目(YARN on k8s)
推荐阅读
- asp.net - Azure AD 身份验证与 WebAssembly Asp.net .NET 5.5 托管的个人用户帐户身份验证相结合
- c# - 如何在提供 CultureInfo 的同时设置 DateTime 组件的顺序
- android - 无法使用 RETROFIT + COROUTINE 获取数据
- javascript - 如何将值插入到 PostgreSQL 中特定行的列中?
- sql - 出现时如何在两个破折号后返回字符
- wordpress - 您可以在管理面板的分类关系字段中显示 ACF 字段吗?
- php - 从 api 数组中获取数据
- google-cloud-platform - GCP Composer (Autoscaling) 环境错误 - “某些 GKE pod 无法正常运行”
- flutter - Flutter stack + 容器来构建类似火种的东西
- node.js - NodeJS ImageMagick 如何转换具有透明背景的图像