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
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 将以下命令复制到终端中安装Hadoop集群部署脚本: b'shell\xe4\xb8\x80\xe9\x94\xae\xe5\xae\x89\xe8\xa3\x85hadoop\xe9\x9b\x86\xe7\xbe\xa4\xe9\x83\xa8\xe7\xbd\xb2' 按下回车键开始安装安装完成后,将你的Hadoop集群配置文件复制到所需的所有节点上,并启动Hadoop服务就可以了。 ### 回答2: Hadoop是一个分布式计算框架,主要用于处理大规模的数据集。在Hadoop集群部署过程中,需要在每台机器上安装Java、Hadoop,并配置各节点间通信等。Shell脚本为我们提供了自动化一键化的部署方式,有效减少了操作时间和人工错误的可能性。 Shell是一种脚本语言,可以用于执行操作系统内置的命令,也可以组合成程序,实现批处理的工作。可以通过编写Shell脚本,在多个节点上自动安装和配置Hadoop集群。 一般来说,Shell脚本部署Hadoop集群的流程如下: 1. 编写Shell脚本,定义需要安装哪些软件和配置,主要包括安装Java、Hadoop软件、配置Hadoop环境变量、配置Hadoop集群等。 2. 在主节点上运行一键安装脚本脚本会自动下载Java、Hadoop软件到各个节点,并启动安装和配置过程。 3. 在集群各节点上传或复制一键安装脚本,执行脚本完成每台机器的自动化安装和配置。 4. 验证集群配置是否正确,包括节点间的链接通断、数据块的分配、备份等。 Shell脚本部署Hadoop集群的优点很明显,它可以大大简化安装的流程,让不懂Linux命令和Hadoop的人也能快速完成部署。同时,通过Shell脚本一键安装方式,可以让部署过程更具可重复性、可靠性,减少出错和手动调整的可能性。 ### 回答3: Hadoop是一个分布式计算框架,它能够管理和处理大规模数据集。在实际应用中,如果需要进行数据分析、机器学习等工作,通常需要一台或多台计算机上配置Hadoop集群部署来实现。这个过程需要依次安装不同的环境与组件,如Java、Hadoop、Hive等。由于这个过程繁琐复杂,需要操作系统、环境与软件等多方面的知识,因此有必要使用一键安装的方式来简化部署的过程。 Shell一键安装Hadoop集群部署是使用Shell脚本编写自动安装脚本,减少繁琐的部署过程。通过一键安装,可以省去手动安装和配置环境不免出现的人工操作失误,并且可以快速、轻松地完成Hadoop集群的部署。 具体实现过程可以分为以下几步: 1. 准备安装环境,如Ubuntu、CentOS等Linux平台、GitHub下载一键安装脚本; 2. 将主机与节点服务器IP地址写入配置文件中; 3. 创建Shell脚本文件并设置所需的安装环境; 4. 编写自动安装脚本,包括软件下载、配置环境、启动服务等。 5. 安装完毕后,进行配置检查和测试。 在实际使用过程中,一键安装脚本不仅可以用于简化Hadoop集群部署的过程,也可以扩展到其他的应用上。例如,一键安装脚本也可以用与Kafka集群或其他分布式系统等。 总之,Shell一键安装Hadoop集群部署是一项非常有用而又实用的技术,可以帮助用户快速构建和部署Hadoop集群,提高工作效率和减少错误率。同时,还可以使管理和维护的过程更加简单和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值