Hadoop集群搭建与添加结点

机器安排

ip 结点 作用
10.1.1.185 namenode master
10.1.1.111 datanode111 slave
10.1.1.196 datanode196 slave
10.1.1.197 datanode197 slave
10.1.1.198 datanode198 slave
10.1.1.199 datanode199 slave
10.1.1.200 datanode200 slave
10.1.1.201 datanode201 slave
10.1.1.202 datanode202 slave

添加测试账号与设置环境变量

1、添加hadoop账号

useradd hadoop;echo 密码|passwd --stdin hadoop

以下操作完全在hadoop用户下进行

2、设置环境变量

echo 'export HADOOP_HOME=/data/hadoop/hadoop-2.7.3' >> /home/hadoop/.bashrc  

如果只设置上面的变量,请务必在hadoop用户环境下运行程序

如果用root用户运行程序,即必须在conf/hadoop-env.sh中指定HADOOP_HOME

export JAVA_HOME=${JAVA_HOME}
export HADOOP_HOME=/data/hadoop/hadoop-2.7.3
export HADOOP_SSH_OPTS="-p 32200 -q "

配置

文件 参数 描述 1.x的参数值 备注
core-site.xml hadoop.tmp.dir /data/hadoop/hdfs NameNode持久存储名字空间及事务日志的本地文件系统路径 /data/hadoop/tmp
core-site.xml fs.defaultFS hdfs://namenode:9100 你的namenode配置,ip加端口 hdfs://namenode:9000 fs.default.name是旧版用的参数名
hdfs-site.xml dfs.replication 2 hdfs数据块的复制份数,默认3,理论上份数越多跑数速度越快,但是需要的存储空间也更多。 3
hdfs-site.xml dfs.permissions.enabled false 在HDFS中启用权限检查 参数名为dfs.permissions,设置为false
hdfs-site.xml dfs.namenode.name.dir /data/hadoop/hdfs/dfs/name 默认为file://${hadoop.tmp.dir}/dfs/name 使用默认值,/data/hadoop/tmp/dfs/name
hdfs-site.xml dfs.datanode.address 0.0.0.0:50110 DN的服务监听端口,端口为0的话会随机监听端口,通过心跳通知NN :::50010
hdfs-site.xml dfs.namenode.http-address 0.0.0.0:50070 the address and the base port where the dfs namenode web ui :::50175
hdfs-site.xml dfs.datanode.http.address 0.0.0.0:50175 DN的tracker页面监听地址和端口 :::50075
hdfs-site.xml dfs.datanode.ipc.address 0.0.0.0:50120 datanode ipc server address and port :::50020
hdfs-site.xml dfs.namenode.handler.count 40 number of server threads for the namenode 10 集群大小的自然对数乘以20,即20logN,N为集群大小
hdfs-site.xml dfs.datanode.handler.count 11 number of server threads for the datanode 10
hdfs-site.xml dfs.namenode.secondary.http-address 0.0.0.0:50190 SecondaryNameNode所在的机器与端口 datanode196:50090
hdfs-site.xml dfs.namenode.secondary.https-address 0.0.0.0:50191 https的所在的机器与端口 没有配置,有的话是datanode196:50091
hdfs-site.xml dfs.namenode.data.dir /data/hadoop/hdfs/dfs/data 默认为file://${hadoop.tmp.dir}/dfs/data 使用默认值,/data/hadoop/tmp/dfs/data
hdfs-site.xml dfs.data.dir /data1/hdfs/data/,/data2/hdfs/data/...到11 真正的datanode数据保存路径,可以写多块硬盘,逗号分隔 /data1/hadoop/data/,...到11
mapred-site.xml mapreduce.jobtracker.http.address 0.0.0.0:50130 job tracker http server address and port :::50030
mapred-site.xml mapreduce.tasktracker.http.address 0.0.0.0:50160 task tracker http server address and port :::50060
mapred-site.xml mapred.job.tracker http://namenode:9101 JobTracker的地址 http://namenode:9001 未清楚2.0.x以上版本是否还使用该参数
mapred-site.xml mapred.child.java.opts -Xmx256m 每个子任务线程分配最多内存, 见下面详细说明 原来分两参数 mapred.map.child.java.opts/mapred.reduce.child.java.opts
mapred-site.xml mapred.tasktracker.map.tasks.maximum 12 任务跟踪器同时运行的 map/reduce 任务的最大数量 12 根据cpu个数添加而添加,更好利用CPU
mapred-site.xml mapred.tasktracker.reduce.tasks.maximum 12 任务跟踪器同时运行的 map/reduce 任务的最大数量 12 根据cpu个数添加而添加,更好利用CPU

看不全,可以点击这里看图片:

请参考:

core-default.xml -- core-default.xml详细说明

hdfs-default.xml -- hdfs-site.xml详细参数说明

yarn-default.xml -- yarn-site.xml详细参数说明

mapred-default.xml -- mapred-site.xml详细参数说明

性能与优化

mapred.tasktracker.map.tasks.maximum + mapred.tasktracker.reduce.tasks.maximum

这两个参数与 CPU 利用率最相关, 根据集群的具体情况适当地增加它们的值,可提高 CPU 利用率、提高性能。

例如,假设集群中的每个节点有 4 个 CPU,支持并发多线程,每个 CPU 有两个核;那么守护进程的总数不应该超过 4x2x2=16 个。

考虑到 DN 和 TT 要占用两个,map/reduce 任务最多可以占用 14 个,所以这两个参数最合适的值是 7。

mapred.child.java.opts -- 参数详细说明:

参数用于 JVM 调优的主要参数。如果值为-Xmx200m, 这给每个子任务线程分配最多 200 MB 内存。

如果作业很大,可以增加这个值,但是应该确保这不会造成交换,交换会严重降低性能。

假设 map/reduce 任务的最大数量设置为 7,mapred.child.java.opts 保持默认值。那么,正在运行的任务的内存开销为 2x7x200 MB =2800 MB。

如果每个工作者节点都有 DN 和 TT 守护进程,每个守护进程在默认情况下占用 1 GB 内存,那么分配的总内存大约为 4.8 GB。

问题: 该值设置的过大时,导致了tasktracker上内存资源耗尽,进而开始不断swap磁盘上数据,load飙升。如果不设置可能会有可能导致OutOfMemory, 所以设置要合理。

同步配置

scp -r -p -P32200 conf/* 10.1.1.111:/data/hadoop/hadoop-2.7.3/conf/
scp -r -p -P32200 conf/* 10.1.1.196:/data/hadoop/hadoop-2.7.3/conf/
scp -r -p -P32200 conf/* 10.1.1.197:/data/hadoop/hadoop-2.7.3/conf/
scp -r -p -P32200 conf/* 10.1.1.198:/data/hadoop/hadoop-2.7.3/conf/
scp -r -p -P32200 conf/* 10.1.1.199:/data/hadoop/hadoop-2.7.3/conf/
scp -r -p -P32200 conf/* 10.1.1.200:/data/hadoop/hadoop-2.7.3/conf/
scp -r -p -P32200 conf/* 10.1.1.201:/data/hadoop/hadoop-2.7.3/conf/
scp -r -p -P32200 conf/* 10.1.1.202:/data/hadoop/hadoop-2.7.3/conf/

启动

脚本运行流程图

免密码登录

1、在各个master中的hadoop用户home下: ssh-keygen -t rsa - 回车,回车

2、.ssh目录下得到id_rsa/id_rsa.pub, 把id_rsa.pub的内容复制到各个slave下的相同目录下的authorized_keys中,注意authorized_keys必须是600权限

比如KEY内容为$KEY, 在各slave中执行

mkdir -p /home/hadoop/.ssh ;chmod 700 /home/hadoop/.ssh;echo $A > /home/hadoop/.ssh/authorized_keys ;chmod 600 /home/hadoop/.ssh/authorized_keys

3、执行./sbin/start-all.sh

手动执行命令

根据配置master在namenode;

./sbin/hadoop-daemon.sh --config ./conf --script ./sbin/hdfs start namenode

SecondaryNameNode 在也在namenode,

./sbin/hadoop-daemon.sh --config ./conf --script ./sbin/hdfs start secondarynamenode

其他都是 datanode, 分别执行:

./sbin/hadoop-daemon.sh --config ./conf --script ./sbin/hdfs start datanode

进程分布

进程 ip
NameNode 10.1.1.185
JobTracker 10.1.1.185
SecondaryNameNode 10.1.1.185
SecondaryNameNode 10.1.1.196
SecondaryNameNode 10.1.1.197
TaskTracker 10.1.1.111
TaskTracker 10.1.1.196
TaskTracker 10.1.1.198
TaskTracker 10.1.1.199
TaskTracker 10.1.1.200
TaskTracker 10.1.1.201
TaskTracker 10.1.1.202

测试添加datanode结点

涉及命令:

hadoop-daemon.sh start namenode  
hadoop-daemon.sh start datanode  

yarn-daemon.sh start resourcemanager  
yarn-daemon.sh start nodemanager  
yarn node -list  

./hdfs dfsadmin -refreshNodes  
./hdfs dfsadmin -report  

 hadoop job -list   
 hadoop job -kill jobid //停止一个正在运行的job  

启动数据负载均衡  
/start-balancer.sh -threshold 5  
ip 结点 作用
10.1.1.81 datanode81 slave

布置好环境:

1、如上面执行一样,添加基本环境

这是台新机器得添加其他结点的hosts

cat > /etc/hosts << EOF
10.1.1.185      namenode
10.1.1.111      datanode111
10.1.1.196      datanode196
10.1.1.197      datanode197
10.1.1.198      datanode198
10.1.1.199      datanode199
10.1.1.200      datanode200
10.1.1.201      datanode201
10.1.1.202      datanode202
EOF

2、本服务器没有data2 - data3分区,这里只做模拟添加

su hadoop

mkdir -p /data/hadoop;chown -R hadoop.hadoop /data/hadoop
mkdir -p /data1/hdfs/;chown -R hadoop.hadoop /data1/hdfs/
mkdir -p /data2/hdfs/;chown -R hadoop.hadoop /data2/hdfs/
mkdir -p /data3/hdfs/;chown -R hadoop.hadoop /data3/hdfs/
mkdir -p /data4/hdfs/;chown -R hadoop.hadoop /data4/hdfs/
mkdir -p /data5/hdfs/;chown -R hadoop.hadoop /data5/hdfs/
mkdir -p /data6/hdfs/;chown -R hadoop.hadoop /data6/hdfs/
mkdir -p /data7/hdfs/;chown -R hadoop.hadoop /data7/hdfs/
mkdir -p /data8/hdfs/;chown -R hadoop.hadoop /data8/hdfs/
mkdir -p /data9/hdfs/;chown -R hadoop.hadoop /data9/hdfs/
mkdir -p /data10/hdfs/;chown -R hadoop.hadoop /data10/hdfs/
mkdir -p /data11/hdfs/;chown -R hadoop.hadoop /data11/hdfs/

# 修改hostname为dataname81
hostname datanode
# 给所有的结点(nodename及dataname) 的/etc/hosts添加名称与地址绑定
echo '10.1.1.81      datanode81' >> /etc/hosts

3、修改conf/slaves添加datanode81这个结点,同步配置文件

由于10.1.1.81配置不允许免密码登录,所以这里管理起来会有些麻烦;如果是正式服务器会配置允许

启动

请到datanode81上面下执行:

# sbin/hadoop-daemon.sh start datanode
./sbin/hadoop-daemon.sh --config ./conf --script ./bin/hdfs start datanode

# 查看log是否启动成功,有报错即解决报错
# 我就忘记在namenode中添加datanode的host了 

测试是否正常

启动成功后,到namenode中执行

hdfs dfsadmin -report 发现已经成功添加

Live datanodes (9):
#
Name: 10.1.1.81:50110 (datanode81)
Hostname: datanode81
Decommission Status : Normal
Configured Capacity: 475469025280 (442.82 GB)
DFS Used: 315392 (308 KB)
Non DFS Used: 209614516224 (195.22 GB)
DFS Remaining: 265854193664 (247.60 GB)
DFS Used%: 0.00%
DFS Remaining%: 55.91%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Mon Jan 16 16:50:09 CST 2017
## datanode81上执行
[hadoop@datanode81 hadoop-2.7.3]$ ./bin/hadoop fs -put test.txt /testdir/
[hadoop@datanode81 hadoop-2.7.3]$ ./bin/hadoop fs -ls /testdir/
Found 2 items
-rw-r--r--   2 hadoop supergroup       5841 2016-12-22 17:28 /testdir/115.231.37.18.txt
-rw-r--r--   2 hadoop supergroup        611 2017-01-16 16:57 /testdir/test.txt
## namenode上查看
[hadoop@datanode81 hadoop-2.7.3]$ ./bin/hadoop fs -ls /testdir/
Found 2 items
-rw-r--r--   2 hadoop supergroup       5841 2016-12-22 17:28 /testdir/115.231.37.18.txt
-rw-r--r--   2 hadoop supergroup        611 2017-01-16 16:57 /testdir/test.txt

即进一步证明已经成功

添加Nodemanager

使用jps查看,只有datanode进程;而查看其他的datanode发现都存在Nodemanager

这是由于:

Hadoop 2.X引入了YARN框架,所以对于每个计算节点都可以通过NodeManager进行管理,同理启动NodeManager进程后,即可将其加入集群

于是我们手动启动:

sbin/yarn-daemon.sh start nodemanager  
[hadoop@datanode81 hadoop-2.7.3]$ jps
62910 DataNode
2623 NodeManager
2790 Jps

查看log与进程都正常了, OK到此完结。

删除datanode结点

1、确认

这里需要删除datanode81, 确认剩余的dataNode的数量小于备份数,需要减少备份数。

<property>
    <name>dfs.replication</name>
    <value>2</value>
    <description>该值需要小于DataNode的个数</description>
 </property>

2、添加配置

1)在conf/hdfs-site.xml

    <property>
        <name>dfs.hosts.exclude</name>
        <value>/data/hadoop/hadoop-2.7.3/conf/exclude</value>
        <description>Names a file that contains a list of hosts that are not permitted to connect to the namenode. The full pathname of the file must be specified. If
 the value is empty, no hosts are excluded.</description>
    </property>

exclude 文件是要删除的结点名,一行一个

2)在conf/yarn-site.xml,添加配置

<property>
  <name>yarn.resourcemanager.nodes.exclude-path</name>
  <value>/data/hadoop/hadoop-2.7.3/conf/exclude</value>
  <description>Path to file with nodes to exclude.</description>
</property>

该配置是告诉ResourceManager这个NodeManager不需要再去关注了

3)同步配置

4)动态更新这些配置文件

#更新HDFS的配置文件hdfs-site.xml
hdfs dfsadmin -refreshNodes  
#更新YARN的配置文件yarn-site.xml
yarn rmadmin -refreshNodes  

我们编写脚本批量执行

lang=bash,lines=22,name=remote_fresh_config.sh
#!/bin/bash

home=$( env|grep HADOOP_HOME|head -n1|awk -F'=' '{print $2}')
if [ "$hbase_h" = "" ];then
    home=/data/hadoop/hadoop-2.7.3
fi
HOSTS="datanode111 datanode196 datanode197 datanode198 datanode199 datanode200 datanode201 datanode202"

for host in $HOSTS
do

#echo "rsynct $host"

ssh -p32200 $host "/bin/bash $home/bin/hdfs dfsadmin -refreshNodes;/bin/bash $home/bin/yarn rmadmin -refreshNodes;"

done

5)在执行完刷新配置后,查看

./bin/ hadoop dfsadmin -report

正在执行Decommission,会显示: 
Decommission Status : Decommission in progress  

执行完毕后,会显示: 
Decommission Status : Decommissioned

查看具体,当DataNode的状态变为Decommissioned了说明该DataNode已被删除。

Name: 10.1.1.81:50110 (datanode81)
Hostname: datanode81
Decommission Status : Decommissioned  # 正常的话是Normal
Configured Capacity: 475469025280 (442.82 GB)
DFS Used: 385024 (376 KB)
Non DFS Used: 209670438829 (195.27 GB)
DFS Remaining: 265798201427 (247.54 GB)
DFS Used%: 0.00%
DFS Remaining%: 55.90%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 3
Last contact: Mon Jan 16 17:46:27 CST 2017

6)检查进程

datanode81:

DataNode进程还在 手动关闭, NodeManager已经关闭

修改vim conf/exclude 删除datanode81,

修改vim conf/slaves 删除datanode81,

同步配置即可