Una colección de scripts de uso común para el desarrollo de big data.
Scripts relacionados con el entorno de big data
descripción del modo de ejecución bash
El modo de ejecución de bash se puede dividir en
login shell
(nombre de usuario, inicio de sesión con contraseña) enon-login shell
(inicio de sesión SSH).
Estado de carga de ambos métodos de inicio de sesión:
1. El shell de inicio de sesión se cargará cuando se inicie:/etc/profile,~/.bash_profile,~/.bashrc
2. El shell sin inicio de sesión se cargará cuando se inicie:~/.bashrc
Nota: ~/.bashrc
De hecho, se cargará /etc/bashrc
y /etc/bashrc
cargará nuevamente./etc/profile.d/*.sh
Nota de inicio de sesión SSH:
Al realizar SSH a otros nodos, se utiliza el modo . El archivo de configuración
non-login shell
no se carga de forma predeterminada , lo que provocará que la información de la variable de entorno se desconfigure y no se encuentren algunos comandos./etc/profile
Crear directorio de script de shell
Cree
/root/shell
un directorio para almacenar scripts de shell
Configure el directorio del script de Shell en
/etc/bashrc
el archivo y utilícelo como una variable de entorno para que el script de Shell recién creado se pueda usar en cualquier lugar.
# My Shell
export PATH=$PATH:/root/shell
Configurar hosts
Configure el archivo de hosts de cada nodo y establezca la asignación entre la IP y el nombre del nodo.
vim /etc/hosts
172.29.234.1 node01
172.29.234.2 node02
172.29.234.3 node03
172.29.234.4 node04
172.29.234.5 node05
Script de configuración automática SSH
Ejecute el script para configurar automáticamente el inicio de sesión sin contraseña para cada nodo.
vim ssh_config.sh
#! /bin/bash
function sshPasswordLogin() {
# 检测expect服务是否存在,不存在则使用yum安装expect
expectIsExists=$(rpm -qa | grep expect)
if [ -z "$expectIsExists" ]; then
yum -y install expect
fi
# 密钥对不存在则创建密钥
if [ ! -f /root/.ssh/id_rsa.pub ]; then
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
fi
# 服务器列表
# servers=("IP地址1 用户名1 密码1" "IP地址2 用户名2 密码2" "IP地址3 用户名3 密码3")
servers=("node01 root 123456" "node02 root 123456" "node03 root 123456" "node04 root 123456" "node05 root 123456")
for server in "${servers[@]}"; do
hostname=$(echo "$server" | cut -d " " -f1)
username=$(echo "$server" | cut -d " " -f2)
password=$(echo "$server" | cut -d " " -f3)
echo "Configuring password login on $hostname..."
expect <<EOF
spawn ssh-copy-id "$username@$hostname"
expect {
"yes/no" {
send "yes\n"
exp_continue
}
"password" {
send "$password\n"
exp_continue
}
eof
}
EOF
done
}
sshPasswordLogin
Cambiar permisos de ejecución
chmod +x ssh_config.sh
Ejecute el script ssh_config.sh en cada nodo y luego configure automáticamente las contraseñas SSH para iniciar sesión entre sí.
[root@node01 ~]# ./ssh_config.sh
[root@node02 ~]# ./ssh_config.sh
[root@node03 ~]# ./ssh_config.sh
[root@node04 ~]# ./ssh_config.sh
[root@node05 ~]# ./ssh_config.sh
Herramienta de sincronización y copia de archivos rsync
rsync es una potente herramienta de replicación y sincronización de archivos que puede realizar transferencias y copias de seguridad de archivos entre servidores locales o remotos.
Instalar ejecutando el siguiente comando
# CentOS/RHEL
yum install rsync
# Ubuntu/Debian
apt-get install rsync
Uso básico
1. Copia de archivo local:
Copie los archivos en el directorio de origen al directorio de destino
rsync /path/to/source/file /path/to/destination/
2. Copie el directorio local:
Utilice el parámetro -a para copiar recursivamente el directorio y el parámetro -v para mostrar el proceso de copia detallado.
rsync -av /path/to/source/directory/ /path/to/destination/directory/
3. Sincronización de archivos locales:
Utilice el parámetro --delete para mantener sincronizados los directorios de origen y de destino y eliminar archivos en el directorio de destino que no existen en el directorio de origen.
rsync -av --delete /path/to/source/directory/ /path/to/destination/directory/
4. Copia remota de archivos:
Copie archivos locales al servidor remoto a través de una conexión SSH. El parámetro -z indica el uso de compresión para acelerar las transferencias.
rsync -avz -e "ssh" /path/to/local/file user@remote:/path/to/destination/
5. Copia del directorio remoto:
rsync -avz -e "ssh" /path/to/local/directory/ user@remote:/path/to/destination/directory/
Pasos de sincronización de archivos
Transfiera el archivo especificado a cada nodo host especificado. Antes de transferir, verifique si el archivo existe, luego cree el directorio correspondiente y use rsync para transferir.
Este script realizará un bucle y copiará archivos en el directorio especificado en el nodo actual a la misma ruta en otros nodos.
vim sync.sh
#! /bin/bash
# 检查是否提供了足够的命令行参数
if [ $# -lt 1 ]; then
echo Not Enough Arguement!
exit
fi
# 遍历集群所有机器
for host in node01 node02 node03 node04 node05; do
echo ==================== $host ====================
# 遍历所有目录,挨个发送
for file in $@; do
# 检查文件是否存在
if [ -e $file ]; then
# 获取父目录
pdir=$(
cd -P $(dirname $file)
pwd
)
# 获取当前文件的名称
fname=$(basename $file)
# 在远程主机执行创建目录的命令
ssh $host "mkdir -p $pdir"
# 将文件传输到远程主机的相应目录
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
Cambiar permisos de ejecución
chmod +x sync.sh
Utilice scripts de sincronización de archivos para distribuir y sincronizar la información de configuración de los hosts.
[root@node01 ~]# sync.sh /etc/hosts
Script de ejecución de comandos
Recorra una lista de nombres de servidores y ejecute el comando especificado en cada servidor
#! /bin/bash
for i in node01 node02 node03 node04 node05
do
echo --------- $i ----------
ssh $i "$*"
done
Cambiar permisos de ejecución
chmod +x call.sh
Ejemplo de uso
call.sh jps
Utilice el comando para ejecutar el script y ejecutar el comando especificado en cada nodo
[root@node01 ~]# call.sh jps
Simplificación del bucle de nodos
Definir un archivo de hosts
node01
node02
node03
node04
node05
Tome el script de ejecución de comando simplificado como ejemplo:
#!/bin/bash
for host in `cat /root/hosts` ;
do
# tput命令,用于设置终端输出的文本颜色为绿色
tput setaf 2
echo ======== $host ========
# 将终端输出的文本颜色重置为默认颜色
tput setaf 7
ssh $host "$@"
done
Scripts relacionados con componentes de big data
Secuencia de comandos del clúster Hadoop
vim hadoop.sh
#!/bin/bash
# Hadoop安装目录
HADOOP_HOME="/usr/local/program/hadoop"
# namenode分配节点
NAMENODE="node01"
COMMAND=""
if [ $# -lt 1 ]; then
echo "请输入命令参数 start 或 stop"
exit
fi
case $1 in
"start")
echo "=================== 启动 Hadoop 集群 ==================="
echo "--------------- 启动 HDFS ---------------"
ssh $NAMENODE "$HADOOP_HOME/sbin/start-dfs.sh"
echo "--------------- 启动 YARN ---------------"
ssh $NAMENODE "$HADOOP_HOME/sbin/start-yarn.sh"
;;
"stop")
echo "=================== 关闭 Hadoop 集群 ==================="
echo "--------------- 关闭 YARN ---------------"
ssh $NAMENODE "$HADOOP_HOME/sbin/stop-yarn.sh"
echo "--------------- 关闭 HDFS ---------------"
ssh $NAMENODE "$HADOOP_HOME/sbin/stop-dfs.sh"
;;
*)
echo "无效参数: $1"
echo "请输入: start 或 stop"
exit 1
;;
esac
Iniciar y detener Hadoop
hadoop.sh start
hadoop.sh stop
Script del clúster Zookeeper
vim zk.sh
#!/bin/bash
case $1 in
"start")
for i in node01 node02 node03; do
echo "----------------------zookeeper $i 启动----------------------"
ssh $i "/usr/local/program/zookeeper/bin/zkServer.sh start"
done
;;
"stop")
for i in node01 node02 node03; do
echo "----------------------zookeeper $i 停止----------------------"
ssh $i "/usr/local/program/zookeeper/bin/zkServer.sh stop"
done
;;
"status")
for i in node01 node02 node03; do
echo "----------------------zookeeper $i 状态----------------------"
ssh $i "/usr/local/program/zookeeper/bin/zkServer.sh status"
done
;;
*)
echo "无效的命令"
;;
esac
Modificar los permisos de ejecución de scripts
chmod +x zk.sh
Iniciar y detener Zookeeper
zk.sh start
zk.sh stop
Script de clúster Kafaka
vim kafaka.sh
#!/bin/bash
if [ $# -eq 0 ]; then
echo "请输入命令参数 start 或 stop"
exit 1
fi
KAFKA_HOME="/usr/local/program/kafka"
case $1 in
"start")
for node in "node01" "node02" "node03"; do
echo "----------------------kafka $node 启动----------------------"
ssh $node "$KAFKA_HOME/bin/kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties"
# 通过$?获取上一个命令的执行状态。如果执行状态不为 0,则表示启动或停止失败
if [ $? -ne 0 ]; then
echo "启动 $node 失败"
fi
done
;;
"stop")
for node in "node01" "node02" "node03"; do
echo "----------------------kafka $node 停止----------------------"
ssh $node "$KAFKA_HOME/bin/kafka-server-stop.sh"
if [ $? -ne 0 ]; then
echo "停止 $node 失败"
fi
done
;;
*)
echo "无效参数: $1"
echo "请输入: start 或 stop"
exit 1
;;
esac
Modificar los permisos de ejecución de scripts
chmod +x kafaka.sh
Iniciar y detener Kafaka
kafaka.sh start
kafaka.sh stop
Guión de grupo de canales
Crear vim flume.sh
scripts de inicio y detención del clúster
#!/bin/bash
# flume执行节点
REMOTE_HOST="node01"
# flume-ng位置
FLUME_EXECUTABLE="/usr/local/program/flume/bin/flume-ng"
# flume配置目录
FLUME_CONF_DIR="/usr/local/program/flume/conf/"
# flume配置文件
FLUME_CONF_FILE="/usr/local/program/flume/job/file_to_kafka.conf"
# 执行进程名称
PROCESS_NAME="file_to_kafka"
case $1 in
"start")
echo " ---------------启动flume采集--------------"
ssh "$REMOTE_HOST" "nohup $FLUME_EXECUTABLE agent -n a1 -c \"$FLUME_CONF_DIR\" -f \"$FLUME_CONF_FILE\" >/dev/null 2>&1 &"
;;
"stop")
echo " ---------------停止flume采集--------------"
ssh "$REMOTE_HOST" "ps -ef | grep $PROCESS_NAME | grep -v grep |awk '{print \$2}' | xargs -n1 kill -9 "
;;
*)
echo "无效参数: $1"
echo "请输入: start 或 stop"
exit 1
;;
esac
Modificar los permisos de ejecución de scripts
chmod +x flume.sh
Iniciar y detener Flume
flume.sh start
flume.sh stop