1. 拉取镜像
1. 创建存放资源的文件夹
mkdir -p ~/k8s
mkdir ~/k8s/hadoop-helm
cd ~/k8s/hadoop-helm
2. 从官方Helm库拉取镜像
# https://hub.helm.sh/charts/stable/hadoop
helm search repo hadoop
# Hadoop-2.9.0
helm fetch azure/hadoop --version 1.1.2
# Hadoop-2.7.3
helm fetch aliyun/hadoop --version 1.0.4
2. 修改脚本
tar -zxvf hadoop-1.1.2.tgz
cd hadoop
vi templates/hadoop-configmap.yaml
:set nu
默认为每次启动都格式化NameNode,所以修改34-38行为:
# 修改前
34 if [[ "${HOSTNAME}" =~ "hdfs-nn" ]]; then
35 mkdir -p /root/hdfs/namenode
36 $HADOOP_PREFIX/bin/hdfs namenode -format -force -nonInteractive
37 $HADOOP_PREFIX/sbin/hadoop-daemon.sh start namenode
38 fi
# 修改后
if [[ "${HOSTNAME}" =~ "hdfs-nn" ]]; then
if [[ -f "/root/hdfs/namenode/exsit" ]]; then
echo "NameNode had already format!"
$HADOOP_PREFIX/sbin/hadoop-daemon.sh start namenode
else
mkdir -p /root/hdfs/namenode
$HADOOP_PREFIX/bin/hdfs namenode -format -force -nonInteractive
$HADOOP_PREFIX/sbin/hadoop-daemon.sh start namenode
touch /root/hdfs/namenode/exsit
fi
fi
修改后会判断是否格式化过NameNode。
vi templates/hdfs-nn-statefulset.yaml
:set nu
将59-70行注释掉。
59 #readinessProbe:
60 # httpGet:
61 # path: /
62 # port: 50070
63 # initialDelaySeconds: 5
64 # timeoutSeconds: 2
65 #livenessProbe:
66 # httpGet:
67 # path: /
68 # port: 50070
69 # initialDelaySeconds: 10
70 # timeoutSeconds: 2
DataNode配置修改:
vi templates/hdfs-dn-statefulset.yaml
:set nu
将59-70行注释掉:
59 #readinessProbe:
60 # httpGet:
61 # path: /
62 # port: 50075
63 # initialDelaySeconds: 5
64 # timeoutSeconds: 2
65 #livenessProbe:
66 # httpGet:
67 # path: /
68 # port: 50075
69 # initialDelaySeconds: 10
70 # timeoutSeconds: 2
还可以修改datanode个数等信息,在values.yaml中修改即可。
vi values.yaml
内容如下:
dataNode:
replicas: 2
pdbMinAvailable: 1
3. 导入Hadoop镜像
- 上传镜像(所有安装节点)。
加载镜像(所有安装节点)。
docker load -i docker-hadoop_2.9.0.tar
4. 启动Chart
helm install hadoop --namespace bigdata .
kubectl get pods -n bigdata
5. 暴露端口
此时Hadoop运行无误,但是此时我们不能访问,因为Hadoop的端口是pod内部共享的,我们在外面用不了,所以此时需要将我们用到的端口暴露出来。
1. 暴露Hadoop WebUI端口
创建svc文件。
vi nnport.yaml
内容如下:
apiVersion: v1
kind: Service
metadata:
name: nnport
labels:
name: nnport
spec:
type: NodePort # 这里代表是NodePort类型的,暴露端口需要此类型
ports:
- port: 50070 # 这里的端口就是要暴露的,供内部访问
targetPort: 50070 # 端口一定要和暴露出来的端口对应
protocol: TCP
nodePort: 30070 # 所有的节点都会开放此端口,此端口供外部调用,需要大于30000
selector:
app: hadoop
component: hdfs-nn
release: hadoop
上述文件的selector要和我们此时的环境对应上,可以通过下面命令查看:
kubectl edit svc hadoop-hadoop-hdfs-nn -n bigdata
修改内容如下:
selector:
app: hadoop
component: hdfs-nn
release: hadoop
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
开启端口。
kubectl apply -f nnport.yaml -n bigdata
kubectl get svc -n bigdata
访问WebUI(http://ltsr003:30070)。
2. 暴露Yarn WebUI端口
创建svc文件。
vi rmport.yaml
apiVersion: v1
kind: Service
metadata:
name: rmport
labels:
name: rmport
spec:
type: NodePort #这里代表是NodePort类型的
ports:
- port: 8088
targetPort: 8088
protocol: TCP
nodePort: 30088 # 所有的节点都会开放此端口,此端口供外部调用。
selector:
app: hadoop
component: yarn-rm
release: hadoop
开启端口。
kubectl create -f rmport.yaml -n bigdata
kubectl get svc -n bigdata
访问WebUI(http://ltsr003:30088)。
6. 验证Hadoop
1. 测试HDFS
HDFS基本信息查看。
# 查看HDFS的基本数据
kubectl -n bigdata exec -it hadoop-hadoop-hdfs-nn-0 -- /usr/local/hadoop/bin/hdfs dfsadmin -report
进入NameNode(nn)容器。
kubectl -n bigdata exec -it hadoop-hadoop-hdfs-nn-0 /bin/bash
创建文件夹并上传文件。
hadoop fs -mkdir /test
hadoop fs -put README.txt /test
查看结果(WebUI:http://ltsr003:30070/explorer.html#/)。
2. 测试Yarn
查看Yarn的NodeManager(nm)节点。
kubectl -n bigdata exec -it hadoop-hadoop-yarn-rm-0 -- /usr/local/hadoop/bin/yarn node -list
进入ResourceManager(rm)容器。
kubectl -n bigdata exec -it hadoop-hadoop-yarn-rm-0 /bin/bash
运行官方WordCount案例。
hadoop jar /usr/local/hadoop-2.9.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.0.jar wordcount /test /result
查看结果(WebUI:http://ltsr003:30088、http://ltsr003:30070/explorer.html#/result)。
7. 卸载
kubectl -n bigdata delete -f nnport.yaml
kubectl -n bigdata delete -f rmport.yaml
helm uninstall hadoop -n bigdata