大数据开发中常用组件服务的集群管理脚本整理集合

大数据开发常用脚本整理集合

  • 大数据环境相关脚本
    • bash运行模式说明
    • 创建shell脚本目录
    • 配置hosts
    • SSH自动配置脚本
    • 文件同步、复制工具rsync
      • 基本用法
      • 文件同步脚步
    • 命令执行脚本
    • 节点循环简化
  • 大数据组件相关脚本
    • Hadoop集群脚本
    • Zookeeper集群脚本
    • Kafaka集群脚本
    • Flume集群脚本

大数据环境相关脚本

bash运行模式说明

bash的运行模式可分为login shell(用户名、密码登录)和non-login shell(SSH登录)。

两者登录方式加载情况:

1.login shell启动时会加载:/etc/profile,~/.bash_profile,~/.bashrc

2.non-login shell启动时会加载:~/.bashrc

注意:~/.bashrc实则会加载/etc/bashrc/etc/bashrc又加载/etc/profile.d/*.sh

SSH登录注意:

当SSH到其他节点的时候是使用non-login shell模式,默认是不加载/etc/profile配置文件,也就会导致环境变量信息未配置,从而会找不到部分命令的问题

创建shell脚本目录

创建/root/shell目录,用于存放shell脚本

/etc/bashrc文件配置shell脚本目录,将其作为环境变量,以便在任何地方使用新建的shell脚本

# My Shell
export PATH=$PATH:/root/shell

配置hosts

配置每个节点的hosts文件,设置节点IP与Name的映射。

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

SSH自动配置脚本

执行脚本来自动配置各个节点免密登录。

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

更改执行权限

chmod +x ssh_config.sh

在各个节点执行ssh_config.sh脚本,然后就会自动进行SSH互相配置密码登录

[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

文件同步、复制工具rsync

rsync 是一个功能强大的文件同步和复制工具,可以在本地或远程服务器之间进行文件传输和备份。

通过运行以下命令安装

# CentOS/RHEL
yum install rsync

# Ubuntu/Debian 
apt-get install rsync

基本用法

1.本地文件复制:

把source 目录下的文件复制到 destination 目录

rsync /path/to/source/file /path/to/destination/

2.本地目录复制:

使用 -a 参数表示递归复制目录,-v 参数表示显示详细的复制过程

rsync -av /path/to/source/directory/ /path/to/destination/directory/

3.本地文件同步:

使用 --delete 参数可以保持源和目标目录的同步,删除目标目录中不存在于源目录的文件

rsync -av --delete /path/to/source/directory/ /path/to/destination/directory/

4.远程文件复制:

通过 SSH 连接复制本地文件到远程服务器。-z 参数表示使用压缩来加速传输

rsync -avz -e "ssh" /path/to/local/file user@remote:/path/to/destination/

5.远程目录复制:

rsync -avz -e "ssh" /path/to/local/directory/ user@remote:/path/to/destination/directory/

文件同步脚步

将指定的文件传输到每个指定的主机节点,在传输之前,会检查文件是否存在,然后创建相应的目录并使用 rsync 进行传输。

这个脚本将循环复制当前节点指定目录下的文件到其他节点的相同路径下

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

更改执行权限

chmod +x sync.sh

使用文件同步脚本,进行分发同步hosts配置信息

[root@node01 ~]# sync.sh /etc/hosts

命令执行脚本

遍历服务器名称列表,然后在每台服务器上运行指定的命令

#! /bin/bash
for i in node01 node02 node03 node04 node05
do
	echo --------- $i ----------
	ssh $i "$*"
done

更改执行权限

chmod  +x call.sh

使用示例

call.sh jps

使用命令执行脚本,在每个节点执行指定的命令

[root@node01 ~]# call.sh jps

节点循环简化

定义一个hosts文件

node01
node02
node03
node04
node05

以命令执行脚本简化为例说明:

#!/bin/bash
for host in `cat /root/hosts` ;
do
	# tput命令,用于设置终端输出的文本颜色为绿色
    tput setaf 2
         echo ======== $host ========
    # 将终端输出的文本颜色重置为默认颜色     
    tput setaf 7
        ssh $host "$@"
done

大数据组件相关脚本

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

启动、停止Hadoop

hadoop.sh start

hadoop.sh stop

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

修改脚本执行权限

chmod +x zk.sh

启动、停止Zookeeper

zk.sh start

zk.sh stop

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

修改脚本执行权限

chmod +x kafaka.sh

启动、停止Kafaka

kafaka.sh start

kafaka.sh stop

Flume集群脚本

创建vim flume.sh集群启动停止脚本

#!/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

修改脚本执行权限

chmod +x flume.sh

启动、停止Flume

flume.sh start

flume.sh stop

你可能感兴趣的:(大数据,大数据,hadoop,zookeeper,flume,kafka)