1.免密钥登录

1.1 准备工作

  新增的机器创建用户设置密码:

useradd hadoop
passwd hadoop

  用户创建好以后,先找任意一台之前集群里的机器,把新增的机器的ip和hostname加入到/etc/hosts中,然后scp分发到集群中各个机器上,当然要包括新机器。
然后继续回到新增的机器上,对hostname进行修改,先vim /etc/sysconfig/network,编辑完后的文件为:

NETWORKING=yes
HOSTNAME=cluster.hadoop.datanode20

  这里的hostname记得要和/etc/hosts里当前机器的hostname保持一致。完成以上操作后,需要重启服务器才能使得hostname配置生效,但是一般服务器不一定能随意重启,所以需要进行执行hostname cluster.hadoop.datanode20使得当前先临时生效,这样即便之后有人重启了服务器,之前在/etc/sysconfig/network上的配置也会生效。
  日常维护的时候,如果新增的节点过多,每个节点之间的hosts均需要同步,如果一个个操作太费时,这里分享一个hosts同步的脚本,脚本主要包含以下几个文件:

$ ls
append  expect_host.sh  root_hosts.sh  slaves
--> append
#append start
ip1    hostname1
ip2   hostname2
ip3   hostname3
ip4   hostname4
ip5   hostname5
#append end
--> slaves
ip1
ip2
...
ipn
--> root_hosts.sh
#!/bin/bash
nodes=($(awk \"{print \\$1}\" slaves))
echo $nodes
for node in ${nodes[*]}
do
   ssh root@$node \"mkdir -p /usr/local/host \"
   scp append root@$node:/usr/local/host /hosts
   expect expect_host.sh $node root pwd
done
--> expect_host.sh
#!/usr/bin/expect -f
#! /bin/bash
set timeout 1
set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]

spawn ssh $username@$host
expect {
    \"Are you sure you want to continue connecting (yes/no)?\" {send \"yes\\r\"; exp_continue}
    \"*password*\" {send \"$password\\r\"}
}

expect \"*#\"
send \"cat /usr/local/host /hosts >> /etc/hosts\\r\"

expect EOF

  其中append是记录需要追加到/etc/hosts文件中的内容,这里之所以要这样用追加的模式,是因为我不确定是否会存在某些机器可能部署了其它应用的原因从而配置了其它的host映射,如果直接覆盖所有机器上的host文件有一定风险,所以个人用的追加最为安全。
  slaves中是存需要同步机器的ip,而root_hosts.sh负责遍历slaves中的ip分发append到对应服务器上,然后执行expect_host.sh脚本将append的内容依次追加到各个服务器的/etc/hosts文件后。
  当然脚本对于密码输入部分未进行处理,可以通过expect进一步进行优化。

1.2 配置免密钥

  在新增机器上,切换到新增的hadoop用户下,执行

$ ssh-keygen -t rsa

  所有提示均直接回车即可,然后就生成了本机对应hadoop用户的密钥对,路径为~/.ssh/下,然后我们需要将namenode的公钥id_rsa.pub拷贝到新增节点上:

scp ~/.ssh/id_rsa.pub hadoop@hadoop20:/home/hadoop/id_rsa.01

  这样就成功把公钥拷贝到了新增的远程主机上,这里后缀加上当前机器的id,方便区分不同机器的密钥。
然后将刚才拷贝的公钥追加到~/.ssh/authorized_keys中:

cat /home/hadoop/id_rsa.20 >> /home/hadoop/.ssh/authorized_keys

  至此,密钥追加成功,还需要修改authorized_keys的权限:chmod 600 authorized_keys,一定要修改权限,否则配置无法生效的。

2. 部署服务

2.1 配置文件同步

  在主节点中,所有服务的路径基本都会配置在一个固定的配置文件中,例如这里笔者公司的配置全部在~/.bash_profile中,所以部署服务的时候直接参考配置文件就能很清楚的知道哪些应用需要部署:

--> .bash_profile
JAVA_HOME=/home/hadoop/local/jdk/jdk1.7.0_65
ZOOKEEPER_HOME=/home/hadoop/Application/enterprise/zookeeper/zookeeper-3.4.5-cdh5.4.1
HADOOP_HOME=/home/hadoop/Application/enterprise/hadoop/hadoop-2.6.0-cdh5.4.1
HADOOP_USER_CLASSPATH_FIRST=true

#spark env
SPARK_HOME=/home/hadoop/Application/enterprise/spark/spark-1.5.1-bin-hadoop2.6
CLASSPATH=\"$CLASSPATH:$HADOOP_HOME/share/hadoop/common/*:$HADOOP_HOME/share/hadoop/common/lib/*\"
CLASSPATH=\"$CLASSPATH:$HADOOP_HOME/share/hadoop/mapreduce/*\"
CLASSPATH=\"$CLASSPATH:$HADOOP_HOME/share/hadoop/mapreduce/lib/*\"
CLASSPATH=\"$CLASSPATH:$HADOOP_HOME/share/hadoop/yarn/*\"
CLASSPATH=\"$CLASSPATH:$HADOOP_HOME/share/hadoop/yarn/lib/*\"
CLASSPATH=\"$CLASSPATH:$HADOOP_HOME/share/hadoop/hdfs/*\"
CLASSPATH=\"$CLASSPATH:$HADOOP_HOME/share/hadoop/hdfs/lib/*\"
CLASSPATH=\"$CLASSPATH:$SPARK_HOME/lib/*\"
export CLASSPATH


PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin

export PATH
export JAVA_HOME
export HADOOP_HOME
export HADOOP_USER_CLASSPATH_FIRST

  这里需要找一台datanode的配置,这里通过配置文件我们可以了解我们需要配置的服务有jdk/hadoop/spark,这里先通过scp把配置同步到新增的节点上,然后创建好对应的各种服务的路径。

scp ~/.bash_profile hadoop@ip:/home/hadoop/
2.2 部署服务

  依据上一节最后所说,操作如下:

mkdir -p /home/hadoop/Application/enterprise/hadoop
mkdir -p /home/hadoop/local/jdk
mkdir -p /home/hadoop/Application/enterprise/spark

  先创建好服务部署路径,然后去随意一个节点拷贝:

#jdk
cd $JAVA_HOME
cd ..
tar -zxvf jdk.tar jdk1.7.0_65
scp jdk.tar hadoop@ip:/home/hadoop/local/jdk

# hadoop 
cd $HADOOP_HOME
cd ..
tar -zxvf hadoop.tar hadoop-1.5.1-bin-cdh5.4.1
scp hadoop.tar hadoop@ip:/home/hadoop/Application/enterprise/hadoop

#spark
cd $SPARK_HOME
cd ..
tar -zxvf spark.tar hadoop@ip:/home/hadoop/Application/enterprise/spark

  以上已经把所有文件拷贝到新增节点中,然后登录新增节点:

cd /home/hadoop/local/jdk
tar czvf jdk.tar

cd /home/hadoop/Application/enterprise/hadoop
tar czvf hadoop.tar

cd /home/hadoop/Application/enterprise/spark
tar czvf spark.tar

source ~/.bash_profile

  由于配置文件已经同步过,所以至此基本的安装已经搞定,不过需要注意的是有些配置依据服务器可能会有所改动,例如hdfs存储路径在不同的磁盘下,但是每台机器的磁盘数量可能不同,需要检查一下hdfs-site. 文件中的存储配置路径中所有的磁盘是否都存在,不存在需要进行对应的改动。
  配置搞定后启动服务:

cd $HADOOP_HOME/sbin
./hadoop-daemon.sh start datanode
./yarn-daemon.sh start nodemanager

  启动好后观察一下日志,并看一下yarn的web监控页面,看看资源是否已经增加了。

3. hdfs balancer

  到这里如果都没问题暂时是完成了新增节点,但是还有一点由于老的节点中hdfs已经在各个磁盘上已经存了许多数据,而新增节点中磁盘数据为空的,此时新老节点之间数据分布其实是十分不平衡的,这种数据不均衡对集群资源利用是十分不好的,所以需要对hdfs数据的分布进行一下重新分布,对应的就是启动Balancer
  启动脚本在$HADOOP_HOME/sbin路径下,最简单的启动为sh start-balancer.sh,但是Balancer其实是有一些运行参数可以修改的,主要有:

-threshold/-t  数据均衡的阀值,默认相差在10%以内说明数据就区域平衡

  执行Balancer的时候,默认是有带宽限制的,可以在hdfs-site. 中进行配置,不过这种配置需要在最开始配置集群的时候就配置,如果重新加入想生效需要重启集群。对此可以通过-setBalancerBandwidth参数来动态调整限制带宽,具体如下:

hdfs dfsadmin -fs hdfs://namenode1:8020 -setBalancerBandwidth 10485760
hdfs dfsadmin -fs hdfs://namenode2:8020 -setBalancerBandwidth 10485760

  执行以上命令就把带宽调整到了10M/s
  以上配置完成后,我们直接启动Balancer

./start-balancer.sh

  启动后可以看到一个Balancer进程,不过需要注意尽量不要在Namenode上启动Balancer,找一台较为空闲的节点启动,例如这里我们就可以直接在新增的节点上启动。
  本文是配置完毕后依据自己记忆进行的编写,所以某些地方操作可能写的有纰漏或者不尽详细,有问题可以私信。

收藏 打印