/*
此脚本为搭建hadoop集群的脚本,可以在一台机器上完成。
需要注意以下几点:
1、使用这个脚本的前提为
{
拥有且开启samba服务(可有可无);
samba的共享路名为/home/samba ;
/home/samba中拥有hadoop软件包和java软件包;
hadoop的配置文件需要在conf目录中(由于版本不同,配置文件的位置也许会不同);
已经挂载了linux系统的镜像光盘;
};
2、在使用脚本的时候需要根据要求更改变量名;
3、当集群中的几点不是 3 个时:
{
需要添加变量名(比如 slave3_ip, slave_name3 等等);
需要更改hdfs-site.xml中dfs.replication的值;
/etc/hosts 中的内容需要添加或更改;
scp 命令时,需要添加或更改;
ssh 命令时,需要添加或更改;
};
4、此脚本结束后,一定要严格按照脚本提示语操作(比如:必须在 为hadoop所创建的用户下执行 ssh-copy-id.sh );
5、ssh.sh 和 3.1.sh 和 3.2.sh 需要用root用户运行,1.sh 和 2.sh 需要用hadoop用户运行;
6、
*/
首先编写 ssh 脚本,然后去每台机器上执行 1.sh 2.sh
注意:在每台机器上执行完相同脚本号的脚本之后才可以执行下一个脚本。
相同脚本好的脚本可以同时运行。
vi /home/hadoop/ssh.sh
#!/bin/bash
group_name=hadoop
user_name=hadoop
user_passwd=hadoop
master_ip=192.168.18.17
slave1_ip=192.168.18.18
slave2_ip=192.168.18.16
master_name=h1
slave_name1=h2
slave_name2=h3
#定义变量
echo "请注意:"
echo "完成此脚本之后,请用hadoop用户在每台机器上按照脚本编号的大小依次执行脚本"
echo "######################################################"
echo "注意:在每台机器上执行完相同脚本号的脚本之后才可以执行下一个脚本。"
echo "######################################################"
cat <<EOF >/home/$user_name/3.sh
group_name=hadoop
user_name=hadoop
user_passwd=hadoop
master_ip=192.168.18.17
slave1_ip=192.168.18.18
slave2_ip=192.168.18.16
master_name=h1
slave_name1=h2
slave_name2=h3
#定义变量
echo "$master_ip $master_name" >> /etc/hosts
echo "$slave1_ip $slave_name1" >> /etc/hosts
echo "$slave2_ip $slave_name2" >> /etc/hosts
#修改hosts文件
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
#创建密钥
EOF
cat <<EOF >/home/$user_name/4.sh
ssh-copy-id -i /home/$user_name/.ssh/id_rsa.pub $user_name@$master_ip
ssh-copy-id -i /home/$user_name/.ssh/id_rsa.pub $user_name@$slave1_ip
ssh-copy-id -i /home/$user_name/.ssh/id_rsa.pub $user_name@$slave2_ip
EOF
cat <<EOF >/home/$user_name/1.sh
echo "请确认您现在的操作用户为root...."
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
ssh-copy-id -i /root/.ssh/id_rsa.pub root@$slave1_ip
ssh-copy-id -i /root/.ssh/id_rsa.pub root@$slave2_ip
EOF
scp /home/$user_name/3.sh $user_name@$slave1_ip:/home/$user_name/
scp /home/$user_name/3.sh $user_name@$slave2_ip:/home/$user_name/
scp /home/$user_name/4.sh $user_name@$slave1_ip:/home/$user_name/
scp /home/$user_name/4.sh $user_name@$slave2_ip:/home/$user_name/
之后编写 hadoop 集群脚本 2.sh
vi /home/hadoop/2.sh
#!/bin/bash
group_name=hadoop
user_name=hadoop
user_passwd=hadoop
master_ip=192.168.18.17
slave1_ip=192.168.18.18
slave2_ip=192.168.18.16
master_name=h1
slave_name1=h2
slave_name2=h3
package_name_hadoop=hadoop-0.20.2-cdh3u5.tar.gz
dirc_haoop=${package_name_hadoop%%.tar*}
HADOOP_HOME=/home/$user_name/app/hadoop
HADOOP_PREFIX=$HADOOP_HOME/$dirc_haoop
conf_hadoop=$HADOOP_PREFIX/conf
#groupadd $group_name
#useradd -g $group_name $user_name
#echo "$user_passwd" | passwd $user_name --stdin
#安装java
package_name_java=jdk-7u25-linux-i586.tar.gz
pre_pwd=`dirname $HADOOP_HOME`
JAVA_PREHOME=$pre_pwd/java
mount -o loop /dev/cdrom /mnt
rm -rf /etc/yum.repos.d/*
cat <<EOF > /etc/yum.repos.d/base.repo
[Base]
name=base
baseurl=file:///mnt/Server
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
EOF
yum -y remove java
mkdir -p $JAVA_PREHOME
cp /home/samba/$package_name_java $JAVA_PREHOME
cd $JAVA_PREHOME
tar zxpf $JAVA_PREHOME/$package_name_java
rm -rf $package_name_java
JAVA_NAME=`ls ${JAVA_PREHOME}`
echo "export JAVA_HOME=$JAVA_PREHOME/$JAVA_NAME" >> /etc/profile
echo "export CLASSPATH=.:\$JAVA_HOME/jre/lib/rt.jar:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar" >> /etc/profile
echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile
chown -R root:root $JAVA_PREHOME/$JAVA_NAME
chmod 755 -R $JAVA_PREHOME/$JAVA_NAME
source /etc/profile
#此时开始搭建hadoop
mkdir -p $HADOOP_HOME
cp /home/samba/$package_name_hadoop $HADOOP_HOME
cd $HADOOP_HOME
tar zxpf $package_name_hadoop
rm -rf $package_name_hadoop
cd $conf_hadoop
sed -i '/<configuration>/a<property>' core-site.xml
sed -i '/<property>/a<name>fs.default.name</name>' core-site.xml
sed -i '/<name>fs.default.name/a<value>hdfs://'${master_name}':9000</value>' core-site.xml
sed -i '/hdfs:\/\/'${master_name}':9000/a</property>' core-site.xml
sed -i '/<configuration>/a<property>' hdfs-site.xml
sed -i '/<property>/a<name>dfs.replication</name>' hdfs-site.xml
sed -i '/<name>dfs.replication/a<value>2</value>' hdfs-site.xml
sed -i '/<value>2/a</property>' hdfs-site.xml
sed -i '/<configuration>/a<property>' mapred-site.xml
sed -i '/<property>/a<name>mapred.job.tracker</name>' mapred-site.xml
sed -i '/<name>mapred.job.tracker/a<value>'${master_name}':9001</value>' mapred-site.xml
sed -i '/<value>'${master_name}':9001/a</property>' mapred-site.xml
sed -i '/export JAVA_HOME/aexport JAVA_HOME='${JAVA_PREHOME}'\/'${JAVA_NAME}'' hadoop-env.sh
echo ${master_name} > masters
echo ${slave_name1} > slaves
echo ${slave_name2} >> slaves
chown -R $user_name:$group_name /home/$user_name
echo "$master_ip $master_name" >> /etc/hosts
echo "$slave1_ip $slave_name1" >> /etc/hosts
echo "$slave2_ip $slave_name2" >> /etc/hosts
echo "##############################"
echo "请注意:"
echo "在接下来的过程中将会向其他节点传输文件........."
echo "##############################"
ssh -t root@$slave1_ip <<EOF
mkdir -p $HADOOP_HOME
mkdir -p $JAVA_PREHOME
exit
EOF
echo "######################################"
echo "此时将要向节点 $slave1_ip 中传输文件......."
echo "######################################"
echo "此时将要传输hadoop文件......."
scp -r $HADOOP_PREFIX root@$slave1_ip:$HADOOP_HOME
echo "hadoop文件传输完毕,即将传输java...... "
scp -r $JAVA_PREHOME/* root@$slave1_ip:$JAVA_PREHOME
echo "java文件传输完毕,即将替换 /etc/profile 文件.... "
scp -r /etc/profile root@$slave1_ip:/etc/profile
echo "文件传输完毕,接下来将要对 $slave_name1 中的文件进行修改 "
ssh -t root@$slave1_ip <<EOF
echo "$master_ip $master_name" >> /etc/hosts
echo "$slave1_ip $slave_name1" >> /etc/hosts
echo "$slave2_ip $slave_name2" >> /etc/hosts
chown -R $user_name:$group_name /home/$user_name
chmod 755 -R $JAVA_PREHOME/$JAVA_NAME
source /etc/profile
exit
EOF
ssh -t root@$slave2_ip <<EOF
mkdir -p $HADOOP_HOME
mkdir -p $JAVA_PREHOME
exit
EOF
echo "######################################"
echo "此时将要向节点 $slave2_ip 中传输文件"
echo "######################################"
echo "此时将要传输hadoop文件"
scp -r $HADOOP_PREFIX root@$slave2_ip:$HADOOP_HOME
echo "hadoop文件传输完毕,即将传输java "
scp -r $JAVA_PREHOME/* root@$slave2_ip:$JAVA_PREHOME
echo "java文件传输完毕,即将替换 /etc/profile 文件 "
scp -r /etc/profile root@$slave2_ip:/etc/profile
echo "文件传输完毕,接下来将要对 $slave_name2 中的文件进行修改 "
ssh -t root@$slave2_ip <<EOF
echo "$master_ip $master_name" >> /etc/hosts
echo "$slave1_ip $slave_name1" >> /etc/hosts
echo "$slave2_ip $slave_name2" >> /etc/hosts
chown -R $user_name:$group_name /home/$user_name
chmod 755 -R $JAVA_PREHOME/$JAVA_NAME
source /etc/profile
exit
EOF
#此时,hadoop集群已经搭建完毕。
echo "#########################################"
echo "请注意:"
echo "此时,hadoop集群已经搭建完毕.请继续退回到hadoop用户中操作..."
echo "#########################################"
第一次写博客有点小激动,不管效果是怎样的我打算对文字格式不做任何更改了。
分享知识是世界上最快乐的事情。。。
请大家多多指教。