##hadoop-pseudo-distributed.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: hadoop-custom-config-cm
labels:
app: hadoop
data:
bootstrap.sh: |+
#!/usr/bin/env bash
# K8s将 shell 和 *-site.xml都挂载到 /root/bootstrap 下
cd /root/bootstrap
# Don't override slaves、core-site.xml and yarn-site.xml
rm -f "$HADOOP_HOME"/etc/hadoop/slaves "$HADOOP_HOME"/etc/hadoop/core-site.xml "$HADOOP_HOME"/etc/hadoop/yarn-site.xml
# Copy hadoop file to $HADOOP_CONF_DIR
#chmod +w -R "$HADOOP_CONF_DIR"
#cp -f /root/bootstrap/*.xml "$HADOOP_CONF_DIR"
#chmod +w -R "$HADOOP_CONF_DIR"
# Get this node's FQDN
# FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。(通过符号“.”)
FQDN=$(ping "$HOSTNAME" -c 1 | grep PING | awk '{print $2}')
# Apply custom config file context
# Copy hadoop file to $HADOOP_CONF_DIR
for cfg in ./*; do
if [[ ! "$cfg" =~ bootstrap.sh ]]; then
cat "$cfg" > "$HADOOP_CONF_DIR"/"${cfg##*/}"
fi
done
# Set nameNode's FQDN to file
echo "$NAME_NODE_FQDN" > "$HADOOP_CONF_DIR"/NameNode
echo "Set nameNode's FQDN( $NAME_NODE_FQDN ) to $HADOOP_CONF_DIR/NameNode"
# Replace nameNode's FQDN
sed -i 's/${NAME_NODE_FQDN}/'"$NAME_NODE_FQDN"'/g' $(grep '${NAME_NODE_FQDN}' -rl "$HADOOP_CONF_DIR")
echo "Replace nameNode's FQDN( $NAME_NODE_FQDN ) to $(grep '${NAME_NODE_FQDN}' -rl "$HADOOP_CONF_DIR")"
# Set dataNode's FQDN to "$HADOOP_CONF_DIR"/slaves
SLAVE_NODES=( "${SLAVE_NODES_FQDN//,/ }" )
# shellcheck disable=SC2068
for SLAVE_NODE in ${SLAVE_NODES[@]}
do
if [[ -e "$HADOOP_CONF_DIR"/slaves ]]; then
# 避免重复,如果文件存在,首先尝试删除
sed -i '/'"$SLAVE_NODE"'/d' "$HADOOP_CONF_DIR"/slaves
fi
echo "$SLAVE_NODE" >> "$HADOOP_CONF_DIR"/slaves
echo "Set slaveNode's FQDN( $SLAVE_NODE ) to $HADOOP_CONF_DIR/slaves"
done
# If this node is nameNode, set it's FQDN to core-site.xml file and yarn-site.xml file
if [[ "$NODE_TYPE" =~ "NN" ]]; then
# Format HDFS if not formatted yet
# 前提: nfs共享了配置文件夹,可以将 hdfs-namenode-format.out 持久化
if [[ ! -e $HADOOP_CONF_DIR/hdfs-namenode-format.out ]]; then
"$HADOOP_HOME"/bin/hdfs namenode -format -force -nonInteractive &> "$HADOOP_CONF_DIR"/hdfs-namenode-format.out
"$HADOOP_HOME"/bin/hdfs namenode -format -force -nonInteractive &> "$HADOOP_CONF_DIR"/hdfs-namenode-format.out
fi
# Start hadoop nameNode daemon
"$HADOOP_HOME"/sbin/hadoop-daemon.sh start namenode
fi
# If this node is ResourceManager
if [[ "$NODE_TYPE" =~ "RM" ]]; then
"$HADOOP_HOME"/sbin/yarn-daemon.sh start resourcemanager
fi
# If this node is nodeManager, add it to slave
if [[ "$NODE_TYPE" =~ "NM" ]]; then
# Waiting nameNode set NAME_NODE_FQDN
while [[ "200" != $(curl -I -m 10 -o /dev/null -s -w %\{http_code\} -X GET "$NAME_NODE_FQDN:50070") ]]; do
echo "Waiting for nameNode: $NAME_NODE_FQDN";
sleep 2;
done;
# Start hadoop nodeManager daemon
#while [[ -z $(curl -sf http://"$NAME_NODE_FQDN":8088/ws/v1/cluster/info) ]]; do
# echo "Waiting for nodeManager: $FQDN" && sleep 2
#done
"$HADOOP_HOME"/sbin/yarn-daemon.sh start nodemanager
fi
# If this node is dataNode, add it to slave
if [[ "$NODE_TYPE" =~ "DN" ]]; then
# Waiting nameNode set NAME_NODE_FQDN
while [[ "200" != $(curl -I -m 10 -o /dev/null -s -w %\{http_code\} -X GET "$NAME_NODE_FQDN:50070") ]]; do
echo "Waiting for nameNode: $NAME_NODE_FQDN";
sleep 2;
done;
# Start hadoop dataNode daemon
while [[ -z $(curl -sf http://"$NAME_NODE_FQDN":50070) ]]; do
echo "Waiting for $NAME_NODE_FQDN" && sleep 2
done
"$HADOOP_HOME"/sbin/hadoop-daemon.sh start datanode
fi
# keep container running
sleep infinity
hdfs-site.xml: |+
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/root/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/root/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.rpc-bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>dfs.servicerpc-bind-host</name>
<value>0.0.0.0</value>
</property>
</configuration>
core-site.xml: |+
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://${NAME_NODE_FQDN}:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoop/tmp</value>
</property>
</configuration>
mapred-site.xml: |+
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml: |+
<?xml version="1.0"?>
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>${NAME_NODE_FQDN}</value>
</property>
<property>
<name>yarn.resourcemanager.bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>yarn.nodemanager.bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>yarn.timeline-service.bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
---
apiVersion: v1
kind: Service
metadata:
name: hadoop-ui-service
labels:
app: hadoop-nn
spec:
ports:
- port: 8088
nodePort: 8088
targetPort: 8088
name: resource-manager
- port: 50070
nodePort: 50070
targetPort: 50070
name: name-node
selector:
app: hadoop-nn
type: NodePort
---
apiVersion: v1
kind: Service
metadata:
name: hadoop-rpc-service
labels:
app: hadoop-nn
spec:
ports:
- port: 9000
targetPort: 9000
nodePort: 9000
name: hdfs
- port: 50010
targetPort: 50010
nodePort: 50010
name: data-node-trans
selector:
app: hadoop-nn
type: NodePort
---
apiVersion: v1
kind: Service
metadata:
name: hadoop-nn-service
labels:
app: hadoop-nn
spec:
ports:
- port: 9000
name: hdfs
- port: 50070
name: name-node
clusterIP: None
selector:
app: hadoop-nn
---
apiVersion: v1
kind: Service
metadata:
name: hadoop-dn-service
labels:
app: hadoop-dn
spec:
ports:
- port: 9000
name: hdfs
- port: 50010
name: data-node-trans
- port: 50075
name: data-node-http
clusterIP: None
selector:
app: hadoop-nn
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: hadoop-nn
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: hadoop-nn
serviceName: hadoop-nn-service
template:
metadata:
labels:
app: hadoop-nn
spec:
containers:
- name: hadoop-nn
image: tonychen0716/hadoop:2.7.7-java-8
command: [ "bash", "-c", "bash /root/bootstrap/bootstrap.sh" ]
env:
- name: HADOOP_CONF_DIR
value: /etc/hadoop
- name: NODE_TYPE
value: NN,RM,DN,NM
- name: NAME_NODE_FQDN
value: hadoop-nn-0.hadoop-nn-service.default.svc.cluster.local
- name: SLAVE_NODES_FQDN
value: hadoop-nn-0.hadoop-nn-service.default.svc.cluster.local
volumeMounts:
- name: hadoop-config-volume
mountPath: /etc/hadoop
- name: hadoop-custom-config-volume
mountPath: /root/bootstrap
- name: dfs-name-dir-volume
mountPath: /root/hadoop/dfs/name
- name: dfs-data-dir-volume
mountPath: /root/hadoop/dfs/data
- name: hadoop-tmp-dir-volume
mountPath: /root/hadoop/tmp
volumes:
- name: hadoop-config-volume
emptyDir: { }
# persistentVolumeClaim:
# claimName: hadoop-config-nfs-pvc
- name: hadoop-custom-config-volume
configMap:
name: hadoop-custom-config-cm
- name: dfs-name-dir-volume
emptyDir: { }
- name: dfs-data-dir-volume
emptyDir: { }
- name: hadoop-tmp-dir-volume
emptyDir: { }
##hadoop-distributed.yaml
#---
#apiVersion: v1
#kind: PersistentVolume
#metadata:
# name: hadoop-config-nfs-pv
# labels:
# release: hadoop-config
#spec:
# capacity:
# storage: 16Mi
# accessModes:
# - ReadWriteMany
# persistentVolumeReclaimPolicy: Retain
# nfs:
# path: /home/nfs/data/hadoop-config
# server: 192.168.112.240
#---
#apiVersion: v1
#kind: PersistentVolumeClaim
#metadata:
# name: hadoop-config-nfs-pvc
#spec:
# accessModes:
# - ReadWriteMany
# resources:
# requests:
# storage: 16Mi
# selector:
# matchLabels:
# release: hadoop-config
---
apiVersion: v1
kind: ConfigMap
metadata:
name: hadoop-custom-config-cm
labels:
app: hadoop
data:
bootstrap.sh: |+
#!/usr/bin/env bash
# K8s将 shell 和 *-site.xml都挂载到 /root/bootstrap 下
cd /root/bootstrap
# Don't override slaves、core-site.xml and yarn-site.xml
rm -f "$HADOOP_HOME"/etc/hadoop/slaves "$HADOOP_HOME"/etc/hadoop/core-site.xml "$HADOOP_HOME"/etc/hadoop/yarn-site.xml
# Copy hadoop file to $HADOOP_CONF_DIR
#chmod +w -R "$HADOOP_CONF_DIR"
#cp -f /root/bootstrap/*.xml "$HADOOP_CONF_DIR"
#chmod +w -R "$HADOOP_CONF_DIR"
# Get this node's FQDN
# FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。(通过符号“.”)
FQDN=$(ping "$HOSTNAME" -c 1 | grep PING | awk '{print $2}')
# Apply custom config file context
# Copy hadoop file to $HADOOP_CONF_DIR
for cfg in ./*; do
if [[ ! "$cfg" =~ bootstrap.sh ]]; then
cat "$cfg" > "$HADOOP_CONF_DIR"/"${cfg##*/}"
fi
done
# Set nameNode's FQDN to file
echo "$NAME_NODE_FQDN" > "$HADOOP_CONF_DIR"/NameNode
echo "Set nameNode's FQDN( $NAME_NODE_FQDN ) to $HADOOP_CONF_DIR/NameNode"
# Replace nameNode's FQDN
sed -i 's/${NAME_NODE_FQDN}/'"$NAME_NODE_FQDN"'/g' $(grep '${NAME_NODE_FQDN}' -rl "$HADOOP_CONF_DIR")
echo "Replace nameNode's FQDN( $NAME_NODE_FQDN ) to $(grep '${NAME_NODE_FQDN}' -rl "$HADOOP_CONF_DIR")"
# Set dataNode's FQDN to "$HADOOP_CONF_DIR"/slaves
SLAVE_NODES=( "${SLAVE_NODES_FQDN//,/ }" )
# shellcheck disable=SC2068
for SLAVE_NODE in ${SLAVE_NODES[@]}
do
if [[ -e "$HADOOP_CONF_DIR"/slaves ]]; then
# 避免重复,如果文件存在,首先尝试删除
sed -i '/'"$SLAVE_NODE"'/d' "$HADOOP_CONF_DIR"/slaves
fi
echo "$SLAVE_NODE" >> "$HADOOP_CONF_DIR"/slaves
echo "Set slaveNode's FQDN( $SLAVE_NODE ) to $HADOOP_CONF_DIR/slaves"
done
# If this node is nameNode, set it's FQDN to core-site.xml file and yarn-site.xml file
if [[ "$NODE_TYPE" =~ "NN" ]]; then
# Format HDFS if not formatted yet
# 前提: nfs共享了配置文件夹,可以将 hdfs-namenode-format.out 持久化
if [[ ! -e $HADOOP_CONF_DIR/hdfs-namenode-format.out ]]; then
"$HADOOP_HOME"/bin/hdfs namenode -format -force -nonInteractive &> "$HADOOP_CONF_DIR"/hdfs-namenode-format.out
"$HADOOP_HOME"/bin/hdfs namenode -format -force -nonInteractive &> "$HADOOP_CONF_DIR"/hdfs-namenode-format.out
fi
# Start hadoop nameNode daemon
"$HADOOP_HOME"/sbin/hadoop-daemon.sh start namenode
fi
# If this node is ResourceManager
if [[ "$NODE_TYPE" =~ "RM" ]]; then
"$HADOOP_HOME"/sbin/yarn-daemon.sh start resourcemanager
fi
# If this node is nodeManager, add it to slave
if [[ "$NODE_TYPE" =~ "NM" ]]; then
# Waiting nameNode set NAME_NODE_FQDN
while [[ "200" != $(curl -I -m 10 -o /dev/null -s -w %\{http_code\} -X GET "$NAME_NODE_FQDN:50070") ]]; do
echo "Waiting for nameNode: $NAME_NODE_FQDN";
sleep 2;
done;
# Start hadoop nodeManager daemon
#while [[ -z $(curl -sf http://"$NAME_NODE_FQDN":8088/ws/v1/cluster/info) ]]; do
# echo "Waiting for nodeManager: $FQDN" && sleep 2
#done
"$HADOOP_HOME"/sbin/yarn-daemon.sh start nodemanager
fi
# If this node is dataNode, add it to slave
if [[ "$NODE_TYPE" =~ "DN" ]]; then
# Waiting nameNode set NAME_NODE_FQDN
while [[ "200" != $(curl -I -m 10 -o /dev/null -s -w %\{http_code\} -X GET "$NAME_NODE_FQDN:50070") ]]; do
echo "Waiting for nameNode: $NAME_NODE_FQDN";
sleep 2;
done;
# Start hadoop dataNode daemon
while [[ -z $(curl -sf http://"$NAME_NODE_FQDN":50070) ]]; do
echo "Waiting for $NAME_NODE_FQDN" && sleep 2
done
"$HADOOP_HOME"/sbin/hadoop-daemon.sh start datanode
fi
# keep container running
sleep infinity
hdfs-site.xml: |+
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/root/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/root/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.rpc-bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>dfs.servicerpc-bind-host</name>
<value>0.0.0.0</value>
</property>
</configuration>
core-site.xml: |+
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://${NAME_NODE_FQDN}:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoop/tmp</value>
</property>
</configuration>
mapred-site.xml: |+
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml: |+
<?xml version="1.0"?>
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>${NAME_NODE_FQDN}</value>
</property>
<property>
<name>yarn.resourcemanager.bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>yarn.nodemanager.bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>yarn.timeline-service.bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
---
apiVersion: v1
kind: Service
metadata:
name: hadoop-ui-service
labels:
app: hadoop-nn
spec:
ports:
- port: 8088
nodePort: 8088
targetPort: 8088
name: resource-manager
- port: 50070
nodePort: 50070
targetPort: 50070
name: name-node
selector:
app: hadoop-nn
type: NodePort
---
apiVersion: v1
kind: Service
metadata:
name: hadoop-rpc-service
labels:
app: hadoop-nn
spec:
ports:
- port: 9000
targetPort: 9000
nodePort: 9000
name: hdfs-rpc
selector:
app: hadoop-nn
type: NodePort
---
apiVersion: v1
kind: Service
metadata:
name: hadoop-nn-service
labels:
app: hadoop-nn
spec:
ports:
- port: 9000
name: hdfs
- port: 50070
name: name-node
clusterIP: None
selector:
app: hadoop-nn
---
apiVersion: v1
kind: Service
metadata:
name: hadoop-dn-service
labels:
app: hadoop-dn
spec:
ports:
- port: 9000
name: hdfs
- port: 50010
name: data-node-trans
- port: 50075
name: data-node-http
clusterIP: None
selector:
app: hadoop-dn
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: hadoop-nn
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: hadoop-nn
serviceName: hadoop-nn-service
template:
metadata:
labels:
app: hadoop-nn
spec:
containers:
- name: hadoop-nn
image: tonychen0716/hadoop:2.7.7-java-8
command: [ "bash", "-c", "bash /root/bootstrap/bootstrap.sh" ]
env:
- name: HADOOP_CONF_DIR
value: /etc/hadoop
- name: NODE_TYPE
value: NN,RM
- name: NAME_NODE_FQDN
value: hadoop-nn-0.hadoop-nn-service.default.svc.cluster.local
- name: SLAVE_NODES_FQDN
value: hadoop-dn-0.hadoop-dn-service.default.svc.cluster.local,hadoop-dn-1.hadoop-dn-service.default.svc.cluster.local,hadoop-dn-2.hadoop-dn-service.default.svc.cluster.local
volumeMounts:
- name: hadoop-config-volume
mountPath: /etc/hadoop
- name: hadoop-custom-config-volume
mountPath: /root/bootstrap
- name: dfs-name-dir-volume
mountPath: /root/hadoop/dfs/name
- name: dfs-data-dir-volume
mountPath: /root/hadoop/dfs/data
- name: hadoop-tmp-dir-volume
mountPath: /root/hadoop/tmp
volumes:
- name: hadoop-config-volume
emptyDir: { }
# persistentVolumeClaim:
# claimName: hadoop-config-nfs-pvc
- name: hadoop-custom-config-volume
configMap:
name: hadoop-custom-config-cm
- name: dfs-name-dir-volume
emptyDir: { }
- name: dfs-data-dir-volume
emptyDir: { }
- name: hadoop-tmp-dir-volume
emptyDir: { }
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: hadoop-dn
spec:
replicas: 3
revisionHistoryLimit: 10
selector:
matchLabels:
app: hadoop-dn
serviceName: hadoop-dn-service
template:
metadata:
labels:
app: hadoop-dn
spec:
containers:
- name: hadoop-dn
image: tonychen0716/hadoop:2.7.7-java-8
command: [ "bash", "-c", "bash /root/bootstrap/bootstrap.sh" ]
env:
- name: HADOOP_CONF_DIR
value: /etc/hadoop
- name: NODE_TYPE
value: DN,NM
- name: NAME_NODE_FQDN
value: hadoop-nn-0.hadoop-nn-service.default.svc.cluster.local
- name: SLAVE_NODES_FQDN
value: hadoop-dn-0.hadoop-dn-service.default.svc.cluster.local,hadoop-dn-1.hadoop-dn-service.default.svc.cluster.local,hadoop-dn-2.hadoop-dn-service.default.svc.cluster.local
volumeMounts:
- name: hadoop-config-volume
mountPath: /etc/hadoop
- name: hadoop-custom-config-volume
mountPath: /root/bootstrap
- name: dfs-name-dir-volume
mountPath: /root/hadoop/dfs/name
- name: dfs-data-dir-volume
mountPath: /root/hadoop/dfs/data
- name: hadoop-tmp-dir-volume
mountPath: /root/hadoop/tmp
volumes:
- name: hadoop-config-volume
emptyDir: { }
# persistentVolumeClaim:
# claimName: hadoop-config-nfs-pvc
- name: hadoop-custom-config-volume
configMap:
name: hadoop-custom-config-cm
- name: dfs-name-dir-volume
emptyDir: { }
- name: dfs-data-dir-volume
emptyDir: { }
- name: hadoop-tmp-dir-volume
emptyDir: { }
Content type
Image
Digest
Size
486.1 MB
Last updated
over 5 years ago
docker pull tonychen0716/hadoop:3.1.4-java-8