1. 程式人生 > >Kubernetes部署大資料元件系列二:一鍵部署Hadoop叢集

Kubernetes部署大資料元件系列二:一鍵部署Hadoop叢集

系列一中忘了說明,用Kubernetes部署大資料容器平臺,有一個很大的好處是壓根不用操心容器間的網路通訊,不管是同一物理伺服器內,還是跨物理伺服器間的網路通訊,你都不用操心,只需要把容器間互相關心的埠暴露好,把容器間的service name對映好,就OK了。

本篇教大家部署Hadoop 2.7.3叢集,暫時沒有做HA和聯邦: Docker適合封裝無狀態的、單程序的應用程式,如果用它來部署Hadoop分散式叢集,還是比較複雜的,主要考慮幾個問題:

  • 1,需要製作幾個映象?
  • 2,哪些配置屬於通用的,可以直接打包到映象中?
  • 3,會變更的配置,如何在容器啟動時自動的、靈活的替換?
  • 4,哪些服務埠需要暴露?
  • 5,哪些目錄需要持久化?
  • 6,NameNode的Format怎麼實現和如何避免重複Format?
  • 7,用哪些指令碼來啟動哪些服務?
  • 8,需要提前設定哪些環境變數?
  • 9,Pod間的依賴和啟動順序如何控制? 等等等。

物理拓撲及Hadoop叢集角色如下:

伺服器地址角色
yuyan210.0.8.182Docker映象製作、K8s yaml指令碼編輯、kubectl客戶端
HARBOR10.10.4.57私有映象庫
ksp-110.10.4.56NameNode、DataNode、ResourceManager、NodeManager
ksp-210.10.4.57DataNode、NodeManager
ksp-510.10.4.60DataNode、NodeManager

1,先製作一個基礎映象: 包含Ubuntu 16.04 LTS、jdk1.8.0_111、各類常用工具(net-tools、iputils、vim、wget)、SSH免密及開機啟動、時鐘與宿主機同步、無防火牆等。 該映象PUSH到HARBOR私有映象庫,以便後面製作Hadoop容器時引用它。 製作過程略過,想用的話直接從連結下載即可: Ubuntu基礎映象

2,鑑於Hadoop2.x版本有YARN的存在,所以製作兩個映象,稱為: 主映象,包含:NameNode、ResourceManager守護程序; 從映象,包含:DataNode、NodeManager守護程序。

新建一個hadoop2.7.3目錄,結構如下:

  • 從官網下載hadoop-2.7.3.tar.gz;
  • 取出其/etc/hadoop中的配置,放入到conf檔案中,修改:core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、並將slaves清空;
  • docker-entrypoint-namenode.sh 製作主映象時,重新命名為docker-entrypoint.sh,啟動相關服務程序;
  • docker-entrypoint-datanode.sh 製作從映象時,重新命名為docker-entrypoint.sh,啟動相關服務程序;
  • Dockerfile,定義環境變數、申明埠、拷貝及替換檔案等操作。

如下幾個目錄是需要持久化的,在後面的yaml檔案中體現: core-site.xml:hadoop.tmp.dir hdfs-site.xml:dfs.namenode.name.dir hdfs-site.xml:dfs.namenode.data.dir

哪些配置檔案作為通用檔案,哪些配置檔案的內容需要動態替換,NameNode 什麼情況下做Format,主、從映象各啟動什麼服務等,請自行參考連結中的指令碼: Hadoop的兩個映象及相關指令碼

製作好映象,並推送到HARBOR私有映象庫中,以便K8s編排容器時使用:

➜  hadoop2.7.3 mv docker-entrypoint-namenode.sh docker-entrypoint.sh
➜  hadoop2.7.3 sudo docker build -t hadoop-2.7.3-namenode-resourcemanager:0.0.1 .
➜  hadoop2.7.3 sudo docker tag hadoop-2.7.3-namenode-resourcemanager:0.0.1  registry.k8s.intra.knownsec.com/bigdata/hadoop-2.7.3-namenode-resourcemanager:0.0.1
➜  hadoop2.7.3 sudo docker push registry.k8s.intra.knownsec.com/bigdata/hadoop-2.7.3-namenode-resourcemanager:0.0.1
➜  hadoop2.7.3 mv docker-entrypoint-datanode.sh docker-entrypoint.sh
➜  hadoop2.7.3 sudo docker build -t hadoop-2.7.3-datanode-nodemanager:0.0.1 .
➜  hadoop2.7.3 sudo docker tag hadoop-2.7.3-datanode-nodemanager:0.0.1  registry.k8s.intra.knownsec.com/bigdata/hadoop-2.7.3-datanode-nodemanager:0.0.1
➜  hadoop2.7.3 sudo docker push registry.k8s.intra.knownsec.com/bigdata/hadoop-2.7.3-datanode-nodemanager:0.0.1

相關映象已經推送到私有映象庫:


3,經過上述的步驟,主、從兩個映象就製作好了,下面,新生成一個
hadoop資料夾,用來編寫yaml檔案,並執行K8s編排任務:


由於容器間需要相互通訊,且需要對外提供服務,所以我們仍然採用Deployment方式來編排,每個Pod啟動一個容器,Pod間暴露相關介面,每個Pod都可以對外提供服務,啟動主映象的Pod使用0.0.0.0監聽自己的埠,啟動從映象的其他Pod使用主Pod的service name,作為目的hostname,持久化的 細節及動態替換hostname的細節,請參考yaml檔案:
K8s編排Hadoop叢集的yaml檔案

按照順序啟動Pod(這個過程可以做成指令碼,一鍵執行):

➜  hadoop kubectl create -f hadoop-namenode-resourcemanager.yaml --validate=false
➜  hadoop kubectl create -f hadoop-datanode-nodemanager01.yaml --validate=false
➜  hadoop kubectl create -f hadoop-datanode-nodemanager02.yaml --validate=false
➜  hadoop kubectl create -f hadoop-datanode-nodemanager05.yaml --validate=false

當主映象的Pod要更換service name時,只需要替換從映象Pod yaml中的ConfigMap hostname值即可

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: hdp-2-cm
data:
  hostname: "hdp-1-svc"
---

驗證:

  • 可以看到4個Pod分配到了指定的物理伺服器上:

  • 可以看到每個Pod對外提供的埠:

  • 使用ksp-1主機的IP加hdp-1-2386450527-9x6b9暴露的50070:30980/TCP,可以看到HDFS Web中DataNode的情況:

  • 使用ksp-1主機的IP加hdp-1-2386450527-9x6b9暴露的8088:32326/TCP,可以看到YARN Web中NodeManager的情況:

補充:
對上述操作部署好的hadoop叢集進行簡單驗證,hdfs的基本功能正常,執行一個mapreduce wordcount用例時,出現錯誤提示:

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount file:///hadoop-2.7.3/NOTICE.txt file:///hadoop-2.7.3/output2
17/07/03 05:32:10 INFO client.RMProxy: Connecting to ResourceManager at hdp-1-svc/12.0.112.23:8032
17/07/03 05:32:11 INFO input.FileInputFormat: Total input paths to process : 1
17/07/03 05:32:12 INFO mapreduce.JobSubmitter: number of splits:1
17/07/03 05:32:12 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1498909283586_0006
17/07/03 05:32:12 INFO impl.YarnClientImpl: Submitted application application_1498909283586_0006
17/07/03 05:32:12 INFO mapreduce.Job: The url to track the job: http://hdp-1-2386450527-9x6b9:8088/proxy/application_1498909283586_0006/
17/07/03 05:32:12 INFO mapreduce.Job: Running job: job_1498909283586_0006
17/07/03 05:32:18 INFO mapreduce.Job: Job job_1498909283586_0006 running in uber mode : false
17/07/03 05:32:18 INFO mapreduce.Job:  map 0% reduce 0%
17/07/03 05:32:19 INFO mapreduce.Job: Task Id : attempt_1498909283586_0006_m_000000_0, Status : FAILED
Container launch failed for container_1498909283586_0006_01_000002 : java.lang.IllegalArgumentException: java.net.UnknownHostException: hdp-2-1789154958-g0njg
    at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:377)
    at org.apache.hadoop.security.SecurityUtil.setTokenService(SecurityUtil.java:356)
    at org.apache.hadoop.yarn.util.ConverterUtils.convertFromYarn(ConverterUtils.java:238)
    at org.apache.hadoop.yarn.client.api.impl.ContainerManagementProtocolProxy$ContainerManagementProtocolProxyData.newProxy(ContainerManagementProtocolProxy.java:266)
    at org.apache.hadoop.yarn.client.api.impl.ContainerManagementProtocolProxy$ContainerManagementProtocolProxyData.<init>(ContainerManagementProtocolProxy.java:244)
    at org.apache.hadoop.yarn.client.api.impl.ContainerManagementProtocolProxy.getProxy(ContainerManagementProtocolProxy.java:129)
    at org.apache.hadoop.mapreduce.v2.app.launcher.ContainerLauncherImpl.getCMProxy(ContainerLauncherImpl.java:409)
    at org.apache.hadoop.mapreduce.v2.app.launcher.ContainerLauncherImpl$Container.launch(ContainerLauncherImpl.java:138)
    at org.apache.hadoop.mapreduce.v2.app.launcher.ContainerLauncherImpl$EventProcessor.run(ContainerLauncherImpl.java:375)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.UnknownHostException: hdp-2-1789154958-g0njg
    ... 12 more

這個錯誤的原因:
因為建立Pod時,會給每個容器隨機分配一個hostname,我們前面是使用svc-name來保證服務間的通訊,但是mapreduce執行時,使用的是hostname,而每臺容器啟動後,/etc/hosts中是僅有自己的主機名和ip的對映,是不包含其他容器的。而且,也無法動態的向/etc/hosts裡面增加其他容器的主機名和ip的對映,所以分配ApplicationMaster時,無法響應客戶端的請求。

修復起來較麻煩:
需要修改主、從映象的dockerfile,docker-entrypoint.sh,重新制作主,從映象,然後修改yaml,之後按照原有流程啟動即可。
修改方案就是使用Headless Service,不再使用cluster ip,而是在 Pod之間直接使用各容器的私有IP,並在yaml指定Pod啟動的容器的主機名,和svc-name配置成一致的。不過,這種方式下,外網不能直接訪問叢集了(比如外網的一個使用者想登陸HDFS的web ui),需要啟動一個Nginx容器,由它做一個DNS代理,能夠讓外網訪問叢集IP和埠即可,請自行搜尋解決方案,這裡不再描述。

相關修改如下,修改之後如何重新搭建叢集,請參考前文。另,yaml我只修改了2個,其他節點的yaml照著修改就行了:
Dockerfile:

FROM registry.k8s.intra.knownsec.com/bigdata/ubuntu16.04_jdk1.8.0_111:0.0.2
MAINTAINER Wang Liang <[email protected]>

ARG DISTRO_NAME=hadoop-2.7.3
ARG DISTRO_NAME_DIR=/hadoop-2.7.3

ENV HADOOP_HOME=$DISTRO_NAME_DIR
ENV HADOOP_PREFIX=$DISTRO_NAME_DIR
ENV HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop
ENV YARN_CONF_DIR=$HADOOP_PREFIX/etc/hadoop
ENV HADOOP_TMP_DIR=$HADOOP_HOME/tmp
ENV HADOOP_DFS_DIR=$HADOOP_HOME/dfs
ENV HADOOP_DFS_NAME_DIR=$HADOOP_DFS_DIR/name
ENV HADOOP_DFS_DATA_DIR=$HADOOP_DFS_DIR/data
ENV HADOOP_LOGS=$HADOOP_HOME/logs
ENV Master=localhost
ENV USER=root

USER root

# Hdfs ports
EXPOSE 9000 50010 50020 50070 50075 50090 31010 8020

# Mapred ports
EXPOSE 19888 10020

#Yarn ports
EXPOSE 8030 8031 8032 8033 8040 8042 8088

#Other ports
EXPOSE 49707 2122

ADD hadoop-2.7.3.tar.gz /
WORKDIR $DISTRO_NAME_DIR
#ENV ZOO_USER=zookeeper \
#    ZOO_CONF_DIR=/conf \
#    ZOO_DATA_DIR=/data \
#    ZOO_UI_DIR=/zkui \
#    ZOO_DATA_LOG_DIR=/datalog \
#    ZOO_PORT=2181 \
#    ZOO_TICK_TIME=2000 \
#    ZOO_INIT_LIMIT=5 \
#    ZOO_SYNC_LIMIT=2

# Add a user and make dirs
#RUN set -x \
#    && adduser -D "$ZOO_USER" \
#    && mkdir -p "$ZOO_DATA_LOG_DIR" "$ZOO_DATA_DIR" "$ZOO_CONF_DIR" \
#    && chown "$ZOO_USER:$ZOO_USER" "$ZOO_DATA_LOG_DIR" "$ZOO_DATA_DIR" "$ZOO_CONF_DIR"

#ARG DISTRO_NAME=hadoop-2.7.3

RUN rm -r -f $HADOOP_CONF_DIR
RUN mkdir -p "$HADOOP_TMP_DIR" "$HADOOP_DFS_NAME_DIR" "$HADOOP_DFS_DATA_DIR" "$HADOOP_LOGS"
ADD conf $HADOOP_CONF_DIR

COPY conf /conf_tmp

ENV PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

# Download Apache Zookeeper, verify its PGP signature, untar and clean up
#RUN set -x \
#    && tar -xzf "$DISTRO_NAME.tar.gz"

#WORKDIR $DISTRO_NAME

#VOLUME ["$ZOO_DATA_DIR", "$ZOO_DATA_LOG_DIR"]

#EXPOSE $ZOO_PORT 2888 3888

#ENV PATH=$PATH:/$DISTRO_NAME/bin:$ZOO_UI_DIR \
#    ZOOCFGDIR=$ZOO_CONF_DIR

COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

docker-entrypoint-namenode.sh:

#!/bin/bash
source /etc/environment
source ~/.bashrc
source /etc/profile
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin


sed "s/HOSTNAME/"$Master"/g"    /conf_tmp/core-site.xml > $HADOOP_CONF_DIR/core-site.xml
sed "s/HOSTNAME/"$Master"/g"    /conf_tmp/mapred-site.xml > $HADOOP_CONF_DIR/mapred-site.xml
sed "s/HOSTNAME/"$Master"/g"    /conf_tmp/yarn-site.xml > $HADOOP_CONF_DIR/yarn-site.xml


if [ "`ls -A $HADOOP_DFS_NAME_DIR`" = "" ]; then
echo "$DIRECTORY is indeed empty"
$HADOOP_PREFIX/bin/hdfs namenode -format
else
echo "$DIRECTORY is not empty"
fi

$HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR start namenode
#$HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR start datanode

$HADOOP_PREFIX/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start resourcemanager
#$HADOOP_PREFIX/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start nodemanager
$HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh   start historyserver



#exec nohup /etc/init.d/ssh start &
/etc/init.d/ssh start
#exec /bin/bash
while true; do sleep 1000; done

docker-entrypoint-datanode.sh:

#!/bin/bash
source /etc/environment
source ~/.bashrc
source /etc/profile
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin


sed "s/HOSTNAME/"$Master"/g"    /conf_tmp/core-site.xml > $HADOOP_CONF_DIR/core-site.xml
sed "s/HOSTNAME/"$Master"/g"    /conf_tmp/mapred-site.xml > $HADOOP_CONF_DIR/mapred-site.xml
sed "s/HOSTNAME/"$Master"/g"    /conf_tmp/yarn-site.xml > $HADOOP_CONF_DIR/yarn-site.xml


#if [ "`ls -A $HADOOP_DFS_NAME_DIR`" = "" ]; then
#echo "$DIRECTORY is indeed empty"
#$HADOOP_PREFIX/bin/hdfs namenode -format
#else
#echo "$DIRECTORY is not empty"
#fi

#$HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR start namenode
$HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR start datanode

#$HADOOP_PREFIX/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start resourcemanager
$HADOOP_PREFIX/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start nodemanager
#$HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh   start historyserver

#exec nohup /etc/init.d/ssh start &
/etc/init.d/ssh start
#exec /bin/bash
while true; do sleep 1000; done

hadoop-namenode-resourcemanager.yaml :

---
apiVersion: v1
kind: Service
metadata:
  name: hdp-1-svc
  labels:
    app: hdp-1-svc
spec:
  clusterIP: None  #注意這裡,要寫成None,才能使用headless service
  ports:
  - port: 9000
    name: hdfs
  - port: 50070
    name: hdfsweb
  - port: 19888
    name: jobhistory
  - port: 8088
    name: yarn
  - port: 50010
    name: hdfs2
  - port: 50020
    name: hdfs3
  - port: 50075
    name: hdfs5
  - port: 50090
    name: hdfs6
  - port: 10020
    name: mapred2
  - port: 8030
    name: yarn1
  - port: 8031
    name: yarn2
  - port: 8032
    name: yarn3
  - port: 8033
    name: yarn4
  - port: 8040
    name: yarn5
  - port: 8042
    name: yarn6
  - port: 49707
    name: other1
  - port: 2122
    name: other2
  - port: 31010
    name: hdfs7
  - port: 8020
    name: hdfs8

  selector:
    app: hdp-1
  type: NodePort
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: hdp-1-cm
data:
  master: "0.0.0.0"
  hostname: "hdp-1-svc"
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hdp-1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: hdp-1
    spec:
      hostname: hdp-1-svc  #指定容器啟動時的主機名,配置成svc-name即可
      nodeSelector:
        zk: zk-1
      containers:
      - name: myhadoop-nn-rm
        imagePullPolicy: Always
        image: registry.k8s.intra.knownsec.com/bigdata/hadoop-2.7.3-namenode-resourcemanager:0.0.1
        securityContext:
          privileged: true
        resources:
          requests:
            memory: "2Gi"
            cpu: "500m"
        ports:
        - containerPort: 9000
          name: hdfs
        - containerPort: 50010
          name: hdfs2
        - containerPort: 50020
          name: hdfs3
        - containerPort: 50070
          name: hdfsweb
        - containerPort: 50075
          name: hdfs5
        - containerPort: 50090
          name: hdfs6
        - containerPort: 19888
          name: jobhistory
        - containerPort: 10020
          name: mapred2
        - containerPort: 8030
          name: yarn1
        - containerPort: 8031
          name: yarn2
        - containerPort: 8032
          name: yarn3
        - containerPort: 8033
          name: yarn4
        - containerPort: 8040
          name: yarn5
        - containerPort: 8042
          name: yarn6
        - containerPort: 8088
          name: yarn
        - containerPort: 49707
          name: other1
        - containerPort: 2122
          name: other2
        - containerPort: 31010
          name: hdfs7
        - containerPort: 8020
          name: hdfs8
        env:
        - name: Master
          valueFrom:
            configMapKeyRef:
                name: hdp-1-cm
                key: master
        - name: HOSTNAME
          valueFrom:
            configMapKeyRef:
                name: hdp-1-cm
                key: hostname
#        readinessProbe:
#          exec:
#            command:
#            - "zkok.sh"
#          initialDelaySeconds: 10
#          timeoutSeconds: 5
#        livenessProbe:
#          exec:
#            command:
#            - "zkok.sh"
#          initialDelaySeconds: 10
#          timeoutSeconds: 5
        volumeMounts:
        - name: name
          mountPath: /hadoop-2.7.3/dfs/name
        - name: data
          mountPath: /hadoop-2.7.3/dfs/data
        - name: tmp
          mountPath: /hadoop-2.7.3/tmp
        - name: logs
          mountPath: /hadoop-2.7.3/logs
      volumes:
      - name: name
        hostPath:
          path: /home/data/bjrddata/hadoop/name021
      - name: data
        hostPath:
          path: /home/data/bjrddata/hadoop/data021
      - name: tmp
        hostPath:
          path: /home/data/bjrddata/hadoop/tmp021
      - name: logs
        hostPath:
          path: /home/data/bjrddata/hadoop/logs021

hadoop-datanode-nodemanager01.yaml :

---
apiVersion: v1
kind: Service
metadata:
  name: hdp-2-svc
  labels:
    app: hdp-2-svc
spec:
  clusterIP: None
  ports:
  - port: 9000
    name: hdfs
  - port: 50070
    name: hdfsweb
  - port: 19888
    name: jobhistory
  - port: 8088
    name: yarn
  - port: 50010
    name: hdfs2
  - port: 50020
    name: hdfs3
  - port: 50075
    name: hdfs5
  - port: 50090
    name: hdfs6
  - port: 10020
    name: mapred2
  - port: 8030
    name: yarn1
  - port: 8031
    name: yarn2
  - port: 8032
    name: yarn3
  - port: 8033
    name: yarn4
  - port: 8040
    name: yarn5
  - port: 8042
    name: yarn6
  - port: 49707
    name: other1
  - port: 2122
    name: other2
  - port: 31010
    name: hdfs7
  - port: 8020
    name: hdfs8

  selector:
    app: hdp-2
  type: NodePort
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: hdp-2-cm
data:
  master: "hdp-1-svc"
  hostname: "hdp-2-svc"
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hdp-2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: hdp-2
    spec:
      hostname: hdp-2-svc
      nodeSelector:
        zk: zk-1
      containers:
      - name: myhadoop-dn-nm
        imagePullPolicy: Always
        image: registry.k8s.intra.knownsec.com/bigdata/hadoop-2.7.3-datanode-nodemanager:0.0.1
        securityContext:
          privileged: true
        resources:
          requests:
            memory: "2Gi"
            cpu: "500m"
        ports:
        - containerPort: 9000
          name: hdfs
        - containerPort: 50010
          name: hdfs2
        - containerPort: 50020
          name: hdfs3
        - containerPort: 50070
          name: hdfsweb
        - containerPort: 50075
          name: hdfs5
        - containerPort: 50090
          name: hdfs6
        - containerPort: 19888
          name: jobhistory
        - containerPort: 10020
          name: mapred2
        - containerPort: 8030
          name: yarn1
        - containerPort: 8031
          name: yarn2
        - containerPort: 8032
          name: yarn3
        - containerPort: 8033
          name: yarn4
        - containerPort: 8040
          name: yarn5
        - containerPort: 8042
          name: yarn6
        - containerPort: 8088
          name: yarn
        - containerPort: 49707
          name: other1
        - containerPort: 2122
          name: other2
        - containerPort: 31010
          name: hdfs7
        - containerPort: 8020
          name: hdfs8
        env:
        - name: Master
          valueFrom:
            configMapKeyRef:
                name: hdp-2-cm
                key: master
        - name: HOSTNAME
          valueFrom:
            configMapKeyRef:
                name: hdp-2-cm
                key: hostname
#        readinessProbe:
#          exec:
#            command:
#            - "zkok.sh"
#          initialDelaySeconds: 10
#          timeoutSeconds: 5
#        livenessProbe:
#          exec:
#            command:
#            - "zkok.sh"
#          initialDelaySeconds: 10
#          timeoutSeconds: 5
        volumeMounts:
        - name: name
          mountPath: /hadoop-2.7.3/dfs/name
        - name: data
          mountPath: /hadoop-2.7.3/dfs/data
        - name: tmp
          mountPath: /hadoop-2.7.3/tmp
        - name: logs
          mountPath: /hadoop-2.7.3/logs
      volumes:
      - name: name
        hostPath:
          path: /home/data/bjrddata/hadoop/name022
      - name: data
        hostPath:
          path: /home/data/bjrddata/hadoop/data022
      - name: tmp
        hostPath:
          path: /home/data/bjrddata/hadoop/tmp022
      - name: logs
        hostPath:
          path: /home/data/bjrddata/hadoop/logs022

重新部署叢集:(可以看到Cluster ip已經沒有了)


wordcount執行結果:

[email protected]:/hadoop-2.7.3# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount hdfs://hdp-1-svc:9000/test/NOTICE.txt hdfs://hdp-1-svc:9000/test/output01
17/07/03 09:53:57 INFO client.RMProxy: Connecting to ResourceManager at hdp-1-svc/192.168.25.14:8032
17/07/03 09:53:57 INFO input.FileInputFormat: Total input paths to process : 1
17/07/03 09:53:57 INFO mapreduce.JobSubmitter: number of splits:1
17/07/03 09:53:58 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1499075310680_0001
17/07/03 09:53:58 INFO impl.YarnClientImpl: Submitted application application_1499075310680_0001
17/07/03 09:53:58 INFO mapreduce.Job: The url to track the job: http://hdp-1-svc:8088/proxy/application_1499075310680_0001/
17/07/03 09:53:58 INFO mapreduce.Job: Running job: job_1499075310680_0001
17/07/03 09:54:04 INFO mapreduce.Job: Job job_1499075310680_0001 running in uber mode : false
17/07/03 09:54:04 INFO mapreduce.Job:  map 0% reduce 0%
17/07/03 09:54:09 INFO mapreduce.Job:  map 100% reduce 0%
17/07/03 09:54:14 INFO mapreduce.Job:  map 100% reduce 100%
17/07/03 09:54:15 INFO mapreduce.Job: Job job_1499075310680_0001 completed successfully
17/07/03 09:54:15 INFO mapreduce.Job: Counters: 49
    File System Counters
        FILE: Number of bytes read=11392
        FILE: Number of bytes written=261045
        FILE: Number of read operations=0
        FILE: Number of large read operations=0
        FILE: Number of write operations=0
        HDFS: Number of bytes read=15080
        HDFS: Number of bytes written=8969
        HDFS: Number of read operations=6
        HDFS: Number of large read operations=0
        HDFS: Number of write operations=2
    Job Counters
        Launched map tasks=1
        Launched reduce tasks=1
        Data-local map tasks=1
        Total time spent by all maps in occupied slots (ms)=2404
        Total time spent by all reduces in occupied slots (ms)=2690
        Total time spent by all map tasks (ms)=2404
        Total time spent by all reduce tasks (ms)=2690
        Total vcore-milliseconds taken by all map tasks=2404
        Total vcore-milliseconds taken by all reduce tasks=2690
        Total megabyte-milliseconds taken by all map tasks=2461696
        Total megabyte-milliseconds taken by all reduce tasks=2754560
    Map-Reduce Framework
        Map input records=437
        Map output records=1682
        Map output bytes=20803
        Map output materialized bytes=11392
        Input split bytes=102
        Combine input records=1682
        Combine output records=614
        Reduce input groups=614
        Reduce shuffle bytes=11392
        Reduce input records=614
        Reduce output records=614
        Spilled Records=1228
        Shuffled Maps =1
        Failed Shuffles=0
        Merged Map outputs=1
        GC time elapsed (ms)=173
        CPU time spent (ms)=1800
        Physical memory (bytes) snapshot=470913024
        Virtual memory (bytes) snapshot=4067495936
        Total committed heap usage (bytes)=342360064
    Shuffle Errors
        BAD_ID=0
        CONNECTION=0
        IO_ERROR=0
        WRONG_LENGTH=0
        WRONG_MAP=0
        WRONG_REDUCE=0
    File Input Format Counters
        Bytes Read=14978
    File Output Format Counters

執行成功

相關推薦

Kubernetes部署資料元件系列部署Hadoop叢集

系列一中忘了說明,用Kubernetes部署大資料容器平臺,有一個很大的好處是壓根不用操心容器間的網路通訊,不管是同一物理伺服器內,還是跨物理伺服器間的網路通訊,你都不用操心,只需要把容器間互相關心的埠暴露好,把容器間的service name對映好,就OK了。 本篇教大家部署Hadoop 2.7.3叢集,暫

Kubernetes部署資料元件系列部署Zookeeper叢集

目前的大資料平臺存在的問題: 通過手工方式直接部署在物理機上,過程複雜、效率低,不適合大規模叢集的部署和動態擴容。 由於平臺元件繁多,對宿主機底層庫依賴過高,一旦安裝完成,很難進行遷移,也無法做成模版進行重複使用。 元件升級不夠靈活,往往會對有相同底層依賴的其他元件帶來影響。 採用虛機部署時,會對宿主機產生資

《架構系列部署應用到Tomcat叢集中》

基於前面的《架構系列三:使用Keepalived+Nginx+tomcat實現叢集部署》,我們配置了nginx+Tomcat叢集,如果需要在VM1,VM2各部署6個Tomcat,這時候怎麼將應用部署到叢集中呢,如果手動一個一個的部署,那要部署12次,效率非常底,因此我們迫切需要一鍵自動部

Skype For Business 2015綜合部署系列AD域部署等Skype 安裝先決條件

自動申請證書策略 server 2012 搭建域環境 server 2012 配置ca skype 2015部署 skype 2015 配置dns相關記 本篇博文進入Skype for business 2015 綜合部署系列的第二部分:配置AD域環境、安裝Ca證書、配置自動申請證書策略

資料HBase系列之HBase分散式資料庫部署

一、部署準備 1. 依賴框架 大資料Hadoop系列之Hadoop分散式叢集部署:https://blog.csdn.net/volitationLong/article/details/80285123 大資料Zookeeper系列之Zookeeper叢集部署:https://

架構系列使用Nginx+tomcat實現叢集部署

在前面的一篇文章《架構系列一:系統架構的演變》中,簡單介紹了系統架構的演變,從單機到叢集部署,現在的企業級專案,可以說99.99%以上的專案,都是叢集部署,當叢集中的一個節點出現故障,會自動切換另一個節點,實現故障自動轉移,現在就基於Nginx+tomcat搭建

資料基礎知識()Shell命令

Shell命令Shell是系統的使用者介面,提供了使用者與核心進行互動操作的一種介面。它接收使用者輸入的命令並把它送入核心去執行 [1] 。實際上Shell是一個命令直譯器,它解釋由使用者輸入的命令並且把它們送到核心。不僅如此,Shell有自己的程式語言用於對命令的編輯,它允

什麼是Hadoop資料基礎系列

MapReduce 是適合海量資料處理的程式設計模型。Hadoop是能夠執行在使用各種語言編寫的MapReduce程式: Java, Ruby, Python, and C++. MapReduce程式是平行性的,因此可使用多臺機器叢集執行大規模的資料分析非常有用的。Ma

Android自定義控制元件系列自定義開關按鈕(

這一次我們將會實現一個完整純粹的自定義控制元件,而不是像之前的組合控制元件一樣,拿系統的控制元件來實現;計劃分為三部分:自定義控制元件的基本部分,和自定義控制元件的自定義屬性; 下面就開始第一部分的編寫,本次以一個定義的開關按鈕為例,下面就開始吧: 先看看效果,一個點選開

資料開發面試部分正常工作的Hadoop叢集中Hadoop都分別需要啟動哪些程序,它們的作用分別是什麼(資料開發面試)

啟動的程序: namenode socondarynamenode datanode ResourceManager(JobTracker)JobTracker NodeManager(TaskTracker) DFSZKFailoverController J

docker-compose入門示例部署 Nginx+Tomcat+Mysql

命令 real 一定的 mes 映射 如果 們的 提前 出現 整體環境配置 整體環境的配置,如果一個一個 Dockerfile 去寫,那麽是相當麻煩的,好在 Docker 有一個名為 Docker-Compose 的工具提供,我們可以使用它一次性完成整體環境的配置: 首先

一個簡單的shell指令碼部署tomcat及釋出簡單程式指令碼

測試環境中一鍵部署的一個小指令碼,這裡記錄下,方便想聯絡的人進行參考 環境介紹: 作業系統cos7.4 jdk版本:1.8 中介軟體服務版本:tomcat7.0.75 ——————————————以下是指令碼內容—————————————————————————

Kubernetes資料編譯並執行基於Scalar的Spark程式WordCount

一、前言 通過SBT編譯scala程式然後在Kubernetes使用Spark執行WordCount任務。 轉載自https://blog.csdn.net/cloudvtech 二、安裝環境和編譯 2.1 安裝SBT mv bintray-sbt-rpm

面試系列精選資料面試真題JVM專項-附答案詳細解析

> 公眾號(五分鐘學大資料)已推出大資料面試系列文章—**五分鐘小面試**,此係列文章將會**深入研究各大廠筆面試真題**,並根據筆面試題**擴充套件相關的知識點**,助力大家都能夠成功入職大廠! ![](https://cdn.jsdelivr.net/gh/sunmyuan/cdn/xiaomia

Exchange Server 2016安裝部署系列 郵箱服務器角色安裝

郵箱服務器角色安裝 exchange 2016 郵箱安裝 郵箱服務器角色 exchange 2016 本篇博文進入Exchange server 2016 安裝部署系列的第二部分:Exchange server 2016的郵箱服務器安裝,本文以exch01.itwish.cn 服務器為例進行

資料Zookeeper系列之Zookeeper分散式協調服務部署

一、部署準備 1. 安裝介質 zookeeper-3.4.13:http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz 2. 主機規劃 192.168.233.13

資料(十自定義OutputFormat與ReduceJoin合併(資料傾斜)

一、OutputFormat介面         OutputFormat是MapReduce輸出的基類,所有實現MapReduce輸出都實現了OutputFormat介面。 1.文字輸出TextOutPutFormat  &n

資料學習系列8-Centos6.7 hadoop-2.6.5下sqoop-1.4.6的安裝部署

安裝sqoop的前提是已經具備java和hadoop的環境 1、下載並解壓 2、修改配置檔案 $ cd $SQOOP_HOME/conf $ mv sqoop-env-template.sh sqoop-env.sh 開啟sqoop-env.sh並編輯下面幾

神教你玩轉 SSD 系列基準測試環境和專案

如何評估固態儲存裝置的效能,並根據業務需求挑選出合適的SSD產品?在上一篇中,介紹了 SSD 基準測試應該關注哪些指標,這裡我們繼續關注基準測試環境和具體測試專案。 前言 本系列將分為以下 4 個主題進行介紹。 一、SSD基準測試應該關注哪些指標 二、基準測試環境(工具/磁碟要

glance系列glance部署及操作

一 簡單架構圖示參考 更新中... 二 部署glance yum install memcached python-memcachedsystemctl enable memcached.servicesystemctl start memcached.service step 1:glance關於資