【问题标题】:Externally Access Hadoop HDFS deployed in Kubernetes外部访问部署在 Kubernetes 中的 Hadoop HDFS
【发布时间】:2019-04-08 12:23:20
【问题描述】:

目前,我已经在 Kubernetes 中部署了一个 Hadoop 集群。 HDFS 有三个数据节点(statefulset)和一个名称节点。 我想从外部访问 HDFS 中的数据。因此,我创建了一个 nodePort 类型的服务来导出名称节点。当我尝试在 HDFS 中下载文件时,namenode 将我重定向到 datanode。问题是,redirect url的域是Kubernetes中的域,如hadoop-hdfs-dn-0.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075,外部无法访问。

我的第一个想法是由客户端自己解析域。喜欢

hadoop-hdfs-dn-0.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075 => IP0:50075
hadoop-hdfs-dn-1.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075 => IP1:50075
hadoop-hdfs-dn-2.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075 => IP2:50075

但是nodePort适用于Kubernetes集群中的所有节点,所以上面三个IP都会去同一个服务,可能会去到错误的datanode。

这种情况有什么解决办法吗? 无论是从 Hadoop 还是 Kubernetes 方面。 像这样强制namenode重定向?

hadoop-hdfs-dn-0.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075 => <node IP>:50001
hadoop-hdfs-dn-1.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075 => <node IP>:50002
hadoop-hdfs-dn-2.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075 => <node IP>:50003

这样我就可以为 statefulset 中的每个 pod 创建三个服务。

【问题讨论】:

标签: hadoop dns kubernetes hdfs


【解决方案1】:

我建议你试试externalIP。

假设你的datanode正在监听50000端口,你可以为每个datanode创建单独的服务,并使用它运行的节点的nodeip作为externalIP。像这样:

apiVersion: v1
kind: Service
metadata:
  name: datanode-1
spec:
  externalIPs:
  - node1-ip
  ports:
  - name: datanode
    port: 50000
  selector:
    app: datanode
    id: "1"
---
apiVersion: v1
kind: Service
metadata:
  name: datanode-2
spec:
  externalIPs:
  - node2-ip
  ports:
  - name: datanode
    port: 50000
  selector:
    app: datanode
    id: "2"
---
apiVersion: v1
kind: Service
metadata:
  name: datanode-3
spec:
  externalIPs:
  - node3-ip
  ports:
  - name: datanode
    port: 50000
  selector:
    app: datanode
    id: "3"

然后您可以将这些 pod 域名解析为它运行的节点 ip。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多