一键安装完全分布式 Hadoop 集群脚本
一、读取传入 IP
local_IP=$(ip a | grep eth0 | awk '$1~/^inet.*/{print $2}' | awk -F '/' '{print $1}')
ip_arrays=()
#传入一个参数作为IP进行校验,返回值0校验合法,1不合法。
check_IP_addr(){
#IP地址必须为全数字
echo $1|grep "^[0-9]\{1,3\}\.\([0-9]\{1,3\}\.\)\{2\}[0-9]\{1,3\}$" > /dev/null;
if [ $? -ne 0 ]
then
return 1
fi
#每个数值必须在0-255之间
ipaddr=$1
a=`echo $ipaddr|awk -F . '{print $1}'` #以"."分隔,取出每个列的值
b=`echo $ipaddr|awk -F . '{print $2}'`
c=`echo $ipaddr|awk -F . '{print $3}'`
d=`echo $ipaddr|awk -F . '{print $4}'`
for num in $a $b $c $d
do
if [ $num -gt 255 ] || [ $num -lt 0 ]
then
return 1
fi
done
return 0
}
#控制台输入集群IP,如果输入的是主机名,可以去掉IP校验
read_ip(){
echo "本机IP地址为:$local_IP"
int=0
echo "请输入正确ip地址,输入0视为退出"
while read -p "输入第`expr ${int} + 1`台的IP:" ip
do
if [ "$ip" == "0" ]
then
break
fi
#IP校验,返回值0校验合法,1不合法。
check_IP_addr $ip
if [ $? -eq 0 ]
then
ip_arrays[$int]=$ip
else
echo "输入的IP不合法,重新进行输入...."
read_ip
fi
let "int++"
done
# 输出 ip_arrays 数据
for i in ${ip_arrays[@]};
do
echo "集群 IP:$i"
done
}
# 判断 IP 数量
check_ip_num(){
# 集群规模最少两台机器,不满足就退出
if [ ${#ip_arrays[@]} -lt 2 ]
then
echo "集群数量未达到数量要求"
exit 1
fi
}
二、配置 SSH 免密登录、关闭防火墙
- 这里只是配置 Master 节点与子节点免密,没有实现全相互免密
# 集群免密登录
distributed_set_ssh(){
echo "------------配置ssh免密登录------------"
echo "------------连续输入三次回车即可生成秘钥------------"
ssh-keygen -t rsa
echo "------------秘钥生成完成,开始生成公钥------------"
echo "根据提示输入相应的信息(yes 和 密码)"
echo "------------------------------------------------"
# 与每个机器进行免密操作
for i in ${ip_arrays[@]};
do
ssh-copy-id $i
done
}
# 集群关闭防火墙
distributed_close_firewalld(){
echo "集群关闭防火墙"
# 远程到各个服务器执行关闭命令
for i in ${ip_arrays[@]};
do
ssh -C $i "systemctl stop firewalld"
ssh -C $i "systemctl disable firewalld"
done
}
三、Java 环境一键安装
INSTALL_DIR=/opt/software/
#检查wget是否正常
install_wget(){
echo "初始化安装环境...."
wget 2>/dev/null
if [ $? -ne 1 ]; then
echo "开始下载wget"
yum -y install wget
else
echo "wget一切正常"
fi
}
# JDK 下载
wget_install_jdk(){
wget \
-P $INSTALL_DIR \
--no-check-certificate \
--no-cookies \
--header \
"Cookie: oraclelicense=accept-securebackup-cookie" \
http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz
}
#优先检查本地安装包,否则从wget下载JDK进行安装
install_JDK(){
[ -d ${INSTALL_DIR} ] || mkdir -p ${INSTALL_DIR}
cd ${INSTALL_DIR}
ls | grep 'jdk.*[tar.gz]$'
if [ $? -ne 0 ]; then
echo "开始尝试从网络下载JDK......."
wget_install_jdk
else
echo "已在本地${INSTALL_DIR}下发现安装包"
fi
tar -zxvf $(ls | grep 'jdk.*[tar.gz]$')
mv $(ls | grep 'jdk.*[^gz]$') jdk1.8/
echo "已在本地${INSTALL_DIR}下安装JDK完毕!"
}
#JDK环境变量配置
set_JDK_path(){
echo "检查JDK环境变量中...."
#PATH设置
grep -q "export PATH=" /etc/profile
if [ $? -ne 0 ]; then
#末行插入
echo "export PATH=$PATH:$JAVA_HOME/bin">>/etc/profile
else
#行尾添加
sed -i '/^export PATH=.*/s/$/:\$JAVA_HOME\/bin/' /etc/profile
fi
grep -q "export JAVA_HOME=" /etc/profile
if [ $? -ne 0 ]; then
#导入配置
filename="$(ls ${INSTALL_DIR} | grep '^jdk.*[^rpm | gz]$' | sed -n '1p')"
sed -i "/^export PATH=.*/i\export JAVA_HOME=\/opt\/software\/$filename" /etc/profile
sed -i '/^export PATH=.*/i\export JRE_HOME=$JAVA_HOME/jre' /etc/profile
sed -i '/^export PATH=.*/i\export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' /etc/profile
else
#替换原有配置
filename="$(ls ${INSTALL_DIR} | grep '^jdk.*[^rpm | gz]$' | sed -n '1p')"
sed -i "s/^export JAVA_HOME=.*/export JAVA_HOME=\/opt\/software\/$filename/" /etc/profile
fi
source /etc/profile
echo "检查JDK环境变量完成!"
}
# Java环境一键配置
java_mode_install(){
echo "开始检查本机JDK"
jdk1.8/bin/javac 2>/dev/null
if [ $? -ne 2 ]; then
echo "检测到本机未安装JDK,开始安装,请耐心等待......"
#检查wget是否正常
install_wget
#优先检查本地安装包,否则从wget下载JDK进行安装
install_JDK
#JDK环境变量配置
set_JDK_path
source /etc/profile
#检测安装结果
jdk1.8/bin/javac 2>/dev/null
if [ $? -eq 2 ]; then
echo "JDK安装并配置完成,最后还需手动输入命令source /etc/profile进行刷新。"
else
echo "安装失败,请重新尝试或手动安装"
fi
else
echo "检测到本机JDK正常,无需操作"
fi
}
四、Hadoop 主节点安装
HADOOPLINK='http://archive.apache.org/dist/hadoop/common/hadoop-2.6.5/hadoop-2.6.5.tar.gz'
#优先检查本地安装包,否则从wget下载hadoop进行安装
install_hadoop(){
cd ${INSTALL_DIR}
ls | grep 'hadoop.*[gz]$'
if [ $? -ne 0 ]; then
echo "开始从网络中下载hadoop安装包..."
wget $HADOOPLINK
else
echo "已在本地${INSTALL_DIR}下发现hadoop安装包"
fi
tar -zxf $(ls | grep 'hadoop.*[gz]$')
mv $(ls | grep 'hadoop.*[^gz]$') hadoop/
echo "已在本地${INSTALL_DIR}下安装hadoop完毕!"
}
# hadoop环境变量配置
set_hadoop_path(){
echo "检查hadoop环境变量中...."
#PATH设置
grep -q "export PATH=" /etc/profile
if [ $? -ne 0 ]; then
#末行插入
echo "export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin">>/etc/profile
else
#行尾添加
sed -i '/^export PATH=.*/s/$/:\$HADOOP_HOME\/bin:\$HADOOP_HOME\/sbin/' /etc/profile
fi
#HADOOP_HOME设置
grep -q "export HADOOP_HOME=" /etc/profile
if [ $? -ne 0 ]; then
#在PATH前面一行插入HADOOP_HOME
sed -i '/^export PATH=.*/i\export HADOOP_HOME=\/opt\/software\/hadoop' /etc/profile
else
#修改文件内的HADOOP_HOME
sed -i 's/^export HADOOP_HOME=.*/export HADOOP_HOME=\/opt\/software\/hadoop/' /etc/profile
fi
source /etc/profile
echo "检查hadoop环境变量完成!"
}
# hadoop 本地模式一键安装
standalone_mode_install(){
# 检查 Java 环境
java_mode_install
echo "开始检查本机hadoop环境"
hadoop/bin/hadoop 2>/dev/null
if [ $? -ne 0 ]; then
# 优先检查本地安装包,否则从wget下载hadoop进行安装
install_hadoop
set_hadoop_path
# 检测安装结果
hadoop/bin/hadoop 2>/dev/null
if [ $? -eq 0 ]; then
echo "hadoop本地模式配置完成,最后还需手动输入命令source /etc/profile进行刷新。"
else
echo "安装失败,请重新尝试或手动安装"
fi
else
echo "检测到本机hadoop正常,无需操作"
fi
}
#写入完全分布式配置信息
set_fully_distributed_model(){
echo "第一步配置core-site.xml"
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/software/hadoop/tmp</value>
<description>指定hadoop运行时产生文件的存储路径</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://$1:9000</value>
<description>hdfs namenode的通信地址,通信端口</description>
</property>
</configuration>" > $HADOOP_HOME/etc/hadoop/core-site.xml
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?>
<!-- Put site-specific property overrides in this file. -->
<!-- 该文件指定与HDFS相关的配置信息。
需要修改HDFS默认的块的副本属性,因为HDFS默认情况下每个数据块保存3个副本,
而在伪分布式模式下运行时,由于只有一个数据节点,
所以需要将副本个数改为1;否则Hadoop程序会报错。 -->
<configuration>
<property>
<name>dfs.replication</name>
<value>${#ip_arrays[@]}</value>
<description>指定HDFS存储数据的副本数目,默认情况下是3份</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/software/hadoop/hdfs/name</value>
<description>namenode存放数据的目录</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/opt/software/hadoop/hdfs/data</value>
<description>datanode存放block块的目录</description>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>$2:50090</value>
<description>secondarynamenode 运行节点的信息,和 namenode 不同节点</description>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
<description>关闭权限验证</description>
</property>
</configuration>" > $HADOOP_HOME/etc/hadoop/hdfs-site.xml
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?>
<!-- Put site-specific property overrides in this file. -->
<!-- 在该配置文件中指定与MapReduce作业相关的配置属性,需要指定JobTracker运行的主机地址-->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>指定mapreduce运行在yarn上</description>
</property>
</configuration>" > $HADOOP_HOME/etc/hadoop/mapred-site.xml
echo "<?xml version=\"1.0\"?>
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>$1</value>
<description>yarn总管理器的IPC通讯地址</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>mapreduce执行shuffle时获取数据的方式</description>
</property>
</configuration>" > $HADOOP_HOME/etc/hadoop/yarn-site.xml
rm -rf $HADOOP_HOME/etc/hadoop/slaves
touch $HADOOP_HOME/etc/hadoop/slaves
int=0
while(( ${int}<${#ip_arrays[*]} ))
do
#echo "while is run"
echo "${ip_arrays[$int]}">>$HADOOP_HOME/etc/hadoop/slaves
if [ $? -ne 0 ]
then
echo "写入slaves配置失败"
break
fi
let "int++"
done
echo "export JAVA_HOME=$JAVA_HOME" >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
}
五、传输到各节点
# 集群 java 配置
distributed_java_scp() {
# 更新配置
source /etc/profile
for i in ${ip_arrays[@]};
do
# 当前服务器不操作
if [ $i != $local_IP ]; then
# 将 java 文件夹远程传送到其他服务器
scp -r $JAVA_HOME root@$i:$INSTALL_DIR
fi
done
}
# 集群 Hadoop 配置
distributed_hadoop_scp(){
source /etc/profile
for i in ${ip_arrays[@]};
do
if [ $i != $local_IP ]; then
# 将 Hadoop 环境
scp -r $HADOOP_HOME root@$i:$INSTALL_DIR
scp /etc/profile root@$i:/etc/profile
ssh -C root@$i "source /etc/profile"
fi
done
}
六、全部代码
local_IP=$(ip a | grep eth0 | awk '$1~/^inet.*/{print $2}' | awk -F '/' '{print $1}')
ip_arrays=()
INSTALL_DIR=/opt/software/
HADOOPLINK='http://archive.apache.org/dist/hadoop/common/hadoop-2.6.5/hadoop-2.6.5.tar.gz'
#传入一个参数作为IP进行校验,返回值0校验合法,1不合法。
check_IP_addr(){
#IP地址必须为全数字
echo $1|grep "^[0-9]\{1,3\}\.\([0-9]\{1,3\}\.\)\{2\}[0-9]\{1,3\}$" > /dev/null;
if [ $? -ne 0 ]
then
return 1
fi
#每个数值必须在0-255之间
ipaddr=$1
a=`echo $ipaddr|awk -F . '{print $1}'` #以"."分隔,取出每个列的值
b=`echo $ipaddr|awk -F . '{print $2}'`
c=`echo $ipaddr|awk -F . '{print $3}'`
d=`echo $ipaddr|awk -F . '{print $4}'`
for num in $a $b $c $d
do
if [ $num -gt 255 ] || [ $num -lt 0 ]
then
return 1
fi
done
return 0
}
#控制台输入集群IP,如果输入的是主机名,可以去掉IP校验
read_ip(){
echo "本机IP地址为:$local_IP"
int=0
echo "请输入正确ip地址,输入0视为退出"
while read -p "输入第`expr ${int} + 1`台的IP:" ip
do
if [ "$ip" == "0" ]
then
break
fi
#IP校验,返回值0校验合法,1不合法。
check_IP_addr $ip
if [ $? -eq 0 ]
then
ip_arrays[$int]=$ip
else
echo "输入的IP不合法,重新进行输入...."
read_ip
fi
let "int++"
done
# 输出 ip_arrays 数据
for i in ${ip_arrays[@]};
do
echo "集群 IP:$i"
done
}
# 判断 IP 数量
check_ip_num(){
# 集群规模最少两台机器,不满足就退出
if [ ${#ip_arrays[@]} -lt 2 ]
then
echo "集群数量未达到数量要求"
exit 1
fi
}
# 集群免密登录
distributed_set_ssh(){
echo "------------配置ssh免密登录------------"
echo "------------连续输入三次回车即可生成秘钥------------"
ssh-keygen -t rsa
echo "------------秘钥生成完成,开始生成公钥------------"
echo "根据提示输入相应的信息(yes 和 密码)"
echo "------------------------------------------------"
# 与每个机器进行免密操作
for i in ${ip_arrays[@]};
do
ssh-copy-id $i
done
}
# 集群关闭防火墙
distributed_close_firewalld(){
echo "集群关闭防火墙"
# 远程到各个服务器执行关闭命令
for i in ${ip_arrays[@]};
do
ssh -C $i "systemctl stop firewalld"
ssh -C $i "systemctl disable firewalld"
done
}
#检查wget是否正常
install_wget(){
echo "初始化安装环境...."
wget 2>/dev/null
if [ $? -ne 1 ]; then
echo "开始下载wget"
yum -y install wget
else
echo "wget一切正常"
fi
}
# JDK 下载
wget_install_jdk(){
wget \
-P $INSTALL_DIR \
--no-check-certificate \
--no-cookies \
--header \
"Cookie: oraclelicense=accept-securebackup-cookie" \
http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz
}
#优先检查本地安装包,否则从wget下载JDK进行安装
install_JDK(){
[ -d ${INSTALL_DIR} ] || mkdir -p ${INSTALL_DIR}
cd ${INSTALL_DIR}
ls | grep 'jdk.*[tar.gz]$'
if [ $? -ne 0 ]; then
echo "开始尝试从网络下载JDK......."
wget_install_jdk
else
echo "已在本地${INSTALL_DIR}下发现安装包"
fi
tar -zxvf $(ls | grep 'jdk.*[tar.gz]$')
mv $(ls | grep 'jdk.*[^gz]$') jdk1.8/
echo "已在本地${INSTALL_DIR}下安装JDK完毕!"
}
#JDK环境变量配置
set_JDK_path(){
echo "检查JDK环境变量中...."
#PATH设置
grep -q "export PATH=" /etc/profile
if [ $? -ne 0 ]; then
#末行插入
echo "export PATH=$PATH:$JAVA_HOME/bin">>/etc/profile
else
#行尾添加
sed -i '/^export PATH=.*/s/$/:\$JAVA_HOME\/bin/' /etc/profile
fi
grep -q "export JAVA_HOME=" /etc/profile
if [ $? -ne 0 ]; then
#导入配置
filename="$(ls ${INSTALL_DIR} | grep '^jdk.*[^rpm | gz]$' | sed -n '1p')"
sed -i "/^export PATH=.*/i\export JAVA_HOME=\/opt\/software\/$filename" /etc/profile
sed -i '/^export PATH=.*/i\export JRE_HOME=$JAVA_HOME/jre' /etc/profile
sed -i '/^export PATH=.*/i\export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' /etc/profile
else
#替换原有配置
filename="$(ls ${INSTALL_DIR} | grep '^jdk.*[^rpm | gz]$' | sed -n '1p')"
sed -i "s/^export JAVA_HOME=.*/export JAVA_HOME=\/opt\/software\/$filename/" /etc/profile
fi
source /etc/profile
echo "检查JDK环境变量完成!"
}
# Java环境一键配置
java_mode_install(){
echo "开始检查本机JDK"
jdk1.8/bin/javac 2>/dev/null
if [ $? -ne 2 ]; then
echo "检测到本机未安装JDK,开始安装,请耐心等待......"
#检查wget是否正常
install_wget
#优先检查本地安装包,否则从wget下载JDK进行安装
install_JDK
#JDK环境变量配置
set_JDK_path
source /etc/profile
#检测安装结果
jdk1.8/bin/javac 2>/dev/null
if [ $? -eq 2 ]; then
echo "JDK安装并配置完成,最后还需手动输入命令source /etc/profile进行刷新。"
else
echo "安装失败,请重新尝试或手动安装"
fi
else
echo "检测到本机JDK正常,无需操作"
fi
}
#优先检查本地安装包,否则从wget下载hadoop进行安装
install_hadoop(){
cd ${INSTALL_DIR}
ls | grep 'hadoop.*[gz]$'
if [ $? -ne 0 ]; then
echo "开始从网络中下载hadoop安装包..."
wget $HADOOPLINK
else
echo "已在本地${INSTALL_DIR}下发现hadoop安装包"
fi
tar -zxf $(ls | grep 'hadoop.*[gz]$')
mv $(ls | grep 'hadoop.*[^gz]$') hadoop/
echo "已在本地${INSTALL_DIR}下安装hadoop完毕!"
}
# hadoop环境变量配置
set_hadoop_path(){
echo "检查hadoop环境变量中...."
#PATH设置
grep -q "export PATH=" /etc/profile
if [ $? -ne 0 ]; then
#末行插入
echo "export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin">>/etc/profile
else
#行尾添加
sed -i '/^export PATH=.*/s/$/:\$HADOOP_HOME\/bin:\$HADOOP_HOME\/sbin/' /etc/profile
fi
#HADOOP_HOME设置
grep -q "export HADOOP_HOME=" /etc/profile
if [ $? -ne 0 ]; then
#在PATH前面一行插入HADOOP_HOME
sed -i '/^export PATH=.*/i\export HADOOP_HOME=\/opt\/software\/hadoop' /etc/profile
else
#修改文件内的HADOOP_HOME
sed -i 's/^export HADOOP_HOME=.*/export HADOOP_HOME=\/opt\/software\/hadoop/' /etc/profile
fi
source /etc/profile
echo "检查hadoop环境变量完成!"
}
# hadoop 本地模式一键安装
standalone_mode_install(){
# 检查 Java 环境
java_mode_install
echo "开始检查本机hadoop环境"
hadoop/bin/hadoop 2>/dev/null
if [ $? -ne 0 ]; then
# 优先检查本地安装包,否则从wget下载hadoop进行安装
install_hadoop
set_hadoop_path
# 检测安装结果
hadoop/bin/hadoop 2>/dev/null
if [ $? -eq 0 ]; then
echo "hadoop本地模式配置完成,最后还需手动输入命令source /etc/profile进行刷新。"
else
echo "安装失败,请重新尝试或手动安装"
fi
else
echo "检测到本机hadoop正常,无需操作"
fi
}
#写入完全分布式配置信息
set_fully_distributed_model(){
echo "第一步配置core-site.xml"
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/software/hadoop/tmp</value>
<description>指定hadoop运行时产生文件的存储路径</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://$1:9000</value>
<description>hdfs namenode的通信地址,通信端口</description>
</property>
</configuration>" > $HADOOP_HOME/etc/hadoop/core-site.xml
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?>
<!-- Put site-specific property overrides in this file. -->
<!-- 该文件指定与HDFS相关的配置信息。
需要修改HDFS默认的块的副本属性,因为HDFS默认情况下每个数据块保存3个副本,
而在伪分布式模式下运行时,由于只有一个数据节点,
所以需要将副本个数改为1;否则Hadoop程序会报错。 -->
<configuration>
<property>
<name>dfs.replication</name>
<value>${#ip_arrays[@]}</value>
<description>指定HDFS存储数据的副本数目,默认情况下是3份</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/software/hadoop/hdfs/name</value>
<description>namenode存放数据的目录</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/opt/software/hadoop/hdfs/data</value>
<description>datanode存放block块的目录</description>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>$2:50090</value>
<description>secondarynamenode 运行节点的信息,和 namenode 不同节点</description>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
<description>关闭权限验证</description>
</property>
</configuration>" > $HADOOP_HOME/etc/hadoop/hdfs-site.xml
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?>
<!-- Put site-specific property overrides in this file. -->
<!-- 在该配置文件中指定与MapReduce作业相关的配置属性,需要指定JobTracker运行的主机地址-->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>指定mapreduce运行在yarn上</description>
</property>
</configuration>" > $HADOOP_HOME/etc/hadoop/mapred-site.xml
echo "<?xml version=\"1.0\"?>
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>$1</value>
<description>yarn总管理器的IPC通讯地址</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>mapreduce执行shuffle时获取数据的方式</description>
</property>
</configuration>" > $HADOOP_HOME/etc/hadoop/yarn-site.xml
rm -rf $HADOOP_HOME/etc/hadoop/slaves
touch $HADOOP_HOME/etc/hadoop/slaves
int=0
while(( ${int}<${#ip_arrays[*]} ))
do
#echo "while is run"
echo "${ip_arrays[$int]}">>$HADOOP_HOME/etc/hadoop/slaves
if [ $? -ne 0 ]
then
echo "写入slaves配置失败"
break
fi
let "int++"
done
echo "export JAVA_HOME=$JAVA_HOME" >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
}
# 集群 java 配置
distributed_java_scp() {
# 更新配置
source /etc/profile
for i in ${ip_arrays[@]};
do
# 当前服务器不操作
if [ $i != $local_IP ]; then
# 将 java 文件夹远程传送到其他服务器
scp -r $JAVA_HOME root@$i:$INSTALL_DIR
fi
done
}
# 集群 Hadoop 配置
distributed_hadoop_scp(){
source /etc/profile
for i in ${ip_arrays[@]};
do
if [ $i != $local_IP ]; then
# 将 Hadoop 环境
scp -r $HADOOP_HOME root@$i:$INSTALL_DIR
scp /etc/profile root@$i:/etc/profile
ssh -C root@$i "source /etc/profile"
fi
done
}
fully_distributed_model_install(){
echo "Hadoop 集群部署"
# 输入集群 IP,所有 IP 在 ip_arrays 中
read_ip
# 判断 IP 数量是否满足要求
check_ip_num
# 配置 SSH 免密登陆
distributed_set_ssh
# 关闭防火墙
distributed_close_firewalld
# 检查 Java 安装情况
java_mode_install
# 远程节点 Java 安装
distributed_java_scp
# 本地模式安装
standalone_mode_install
# 配置集群模式配置
set_fully_distributed_model ${ip_arrays[0]} ${ip_arrays[1]}
# 将 Hadoop 传输到各节点
distributed_hadoop_scp
# Hadoop 初始化
hdfs namenode -format
# 更新环境
source /etc/profile
}
fully_distributed_model_install