1. 拉取镜像

1. 创建存放资源的文件夹

  1. mkdir -p ~/k8s
  2. mkdir ~/k8s/hadoop-helm
  3. cd ~/k8s/hadoop-helm

2. 从官方Helm库拉取镜像

  1. # https://hub.helm.sh/charts/stable/hadoop
  2. helm search repo hadoop
  3. # Hadoop-2.9.0
  4. helm fetch azure/hadoop --version 1.1.2
  5. # Hadoop-2.7.3
  6. helm fetch aliyun/hadoop --version 1.0.4

2. 修改脚本

  1. tar -zxvf hadoop-1.1.2.tgz
  2. cd hadoop
  3. vi templates/hadoop-configmap.yaml
  4. :set nu

默认为每次启动都格式化NameNode,所以修改34-38行为:

  1. # 修改前
  2. 34 if [[ "${HOSTNAME}" =~ "hdfs-nn" ]]; then
  3. 35 mkdir -p /root/hdfs/namenode
  4. 36 $HADOOP_PREFIX/bin/hdfs namenode -format -force -nonInteractive
  5. 37 $HADOOP_PREFIX/sbin/hadoop-daemon.sh start namenode
  6. 38 fi
  7. # 修改后
  8. if [[ "${HOSTNAME}" =~ "hdfs-nn" ]]; then
  9. if [[ -f "/root/hdfs/namenode/exsit" ]]; then
  10. echo "NameNode had already format!"
  11. $HADOOP_PREFIX/sbin/hadoop-daemon.sh start namenode
  12. else
  13. mkdir -p /root/hdfs/namenode
  14. $HADOOP_PREFIX/bin/hdfs namenode -format -force -nonInteractive
  15. $HADOOP_PREFIX/sbin/hadoop-daemon.sh start namenode
  16. touch /root/hdfs/namenode/exsit
  17. fi
  18. fi

修改后会判断是否格式化过NameNode。

  1. vi templates/hdfs-nn-statefulset.yaml
  2. :set nu

将59-70行注释掉。

  1. 59 #readinessProbe:
  2. 60 # httpGet:
  3. 61 # path: /
  4. 62 # port: 50070
  5. 63 # initialDelaySeconds: 5
  6. 64 # timeoutSeconds: 2
  7. 65 #livenessProbe:
  8. 66 # httpGet:
  9. 67 # path: /
  10. 68 # port: 50070
  11. 69 # initialDelaySeconds: 10
  12. 70 # timeoutSeconds: 2

DataNode配置修改:

  1. vi templates/hdfs-dn-statefulset.yaml
  2. :set nu

将59-70行注释掉:

  1. 59 #readinessProbe:
  2. 60 # httpGet:
  3. 61 # path: /
  4. 62 # port: 50075
  5. 63 # initialDelaySeconds: 5
  6. 64 # timeoutSeconds: 2
  7. 65 #livenessProbe:
  8. 66 # httpGet:
  9. 67 # path: /
  10. 68 # port: 50075
  11. 69 # initialDelaySeconds: 10
  12. 70 # timeoutSeconds: 2

还可以修改datanode个数等信息,在values.yaml中修改即可。

  1. vi values.yaml

内容如下:

  1. dataNode:
  2. replicas: 2
  3. pdbMinAvailable: 1

3. 导入Hadoop镜像

  1. 上传镜像(所有安装节点)。
  2. 加载镜像(所有安装节点)。

    1. docker load -i docker-hadoop_2.9.0.tar

    4. 启动Chart

    1. helm install hadoop --namespace bigdata .
    2. kubectl get pods -n bigdata

    5. 暴露端口

    此时Hadoop运行无误,但是此时我们不能访问,因为Hadoop的端口是pod内部共享的,我们在外面用不了,所以此时需要将我们用到的端口暴露出来。

    1. 暴露Hadoop WebUI端口

  3. 创建svc文件。

    1. vi nnport.yaml

    内容如下:

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: nnport
    5. labels:
    6. name: nnport
    7. spec:
    8. type: NodePort # 这里代表是NodePort类型的,暴露端口需要此类型
    9. ports:
    10. - port: 50070 # 这里的端口就是要暴露的,供内部访问
    11. targetPort: 50070 # 端口一定要和暴露出来的端口对应
    12. protocol: TCP
    13. nodePort: 30070 # 所有的节点都会开放此端口,此端口供外部调用,需要大于30000
    14. selector:
    15. app: hadoop
    16. component: hdfs-nn
    17. release: hadoop

    上述文件的selector要和我们此时的环境对应上,可以通过下面命令查看:

    1. kubectl edit svc hadoop-hadoop-hdfs-nn -n bigdata

    修改内容如下:

    1. selector:
    2. app: hadoop
    3. component: hdfs-nn
    4. release: hadoop
    5. sessionAffinity: None
    6. type: ClusterIP
    7. status:
    8. loadBalancer: {}
  4. 开启端口。

    1. kubectl apply -f nnport.yaml -n bigdata
    2. kubectl get svc -n bigdata
  5. 访问WebUI(http://ltsr003:30070)。

image.png

2. 暴露Yarn WebUI端口

  1. 创建svc文件。

    1. vi rmport.yaml
    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: rmport
    5. labels:
    6. name: rmport
    7. spec:
    8. type: NodePort #这里代表是NodePort类型的
    9. ports:
    10. - port: 8088
    11. targetPort: 8088
    12. protocol: TCP
    13. nodePort: 30088 # 所有的节点都会开放此端口,此端口供外部调用。
    14. selector:
    15. app: hadoop
    16. component: yarn-rm
    17. release: hadoop
  2. 开启端口。

    1. kubectl create -f rmport.yaml -n bigdata
    2. kubectl get svc -n bigdata
  3. 访问WebUI(http://ltsr003:30088)。

image.png

6. 验证Hadoop

1. 测试HDFS

  1. HDFS基本信息查看。

    1. # 查看HDFS的基本数据
    2. kubectl -n bigdata exec -it hadoop-hadoop-hdfs-nn-0 -- /usr/local/hadoop/bin/hdfs dfsadmin -report
  2. 进入NameNode(nn)容器。

    1. kubectl -n bigdata exec -it hadoop-hadoop-hdfs-nn-0 /bin/bash
  3. 创建文件夹并上传文件。

    1. hadoop fs -mkdir /test
    2. hadoop fs -put README.txt /test
  4. 查看结果(WebUI:http://ltsr003:30070/explorer.html#/)。

image.png

2. 测试Yarn

  1. 查看Yarn的NodeManager(nm)节点。

    1. kubectl -n bigdata exec -it hadoop-hadoop-yarn-rm-0 -- /usr/local/hadoop/bin/yarn node -list
  2. 进入ResourceManager(rm)容器。

    1. kubectl -n bigdata exec -it hadoop-hadoop-yarn-rm-0 /bin/bash
  3. 运行官方WordCount案例。

    1. hadoop jar /usr/local/hadoop-2.9.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.0.jar wordcount /test /result
  4. 查看结果(WebUI:http://ltsr003:30088http://ltsr003:30070/explorer.html#/result)。

image.png
image.png

7. 卸载

  1. kubectl -n bigdata delete -f nnport.yaml
  2. kubectl -n bigdata delete -f rmport.yaml
  3. helm uninstall hadoop -n bigdata