Shell 脚本:Hadoop 集群一键安装脚本

一键安装完全分布式 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值