Hadoop集群的搭建
#===========================================================================#
ALL 表示所有主机
NODE 表示 node1 node2 node3
NN1: 表示 namenode
ALL:所有节点能相互ping 通(配置/etc/hosts)
ALL:安装java-1.8.0-openjdk-devel
NN1:能ssh免密登录所有集群主机,包括自己(不能提示输入yes),ssh 免密登录,修改 /etc/ssh/ssh_config 下
添加设置:StrictHostKeyChecking no
#===========================================================================#
192.168.1.10 nn01 namenode,secondary,ResourceManager
192.168.1.11 node1 datanode,NodeManager
192.168.1.12 node2 datanode,NodeManager
192.168.1.13 node3 datanode,NodeManager
#===========================================================================#
[root@roompc901 ~]#cd /var/lib/libvirt/images/
[root@roompc901 images]# qemu-img create -b demo.img -f qcow2 node1.img 16G
[root@roompc901 images]# qemu-img create -b demo.img -f qcow2 node2.img 16G
[root@roompc901 images]# qemu-img create -b demo.img -f qcow2 node3.img 16G
[root@roompc901 images]# qemu-img create -b demo.img -f qcow2 nn01.img 16G
[root@roompc901 ~]# cd /etc/libvirt/qemu/
[root@roompc901 qemu]# sed 's/node/node1/' node.xml > /etc/libvirt/qemu/node1.xml
[root@roompc901 qemu]# sed 's/node/node2/' node.xml > /etc/libvirt/qemu/node2.xml
[root@roompc901 qemu]# sed 's/node/node3/' node.xml > /etc/libvirt/qemu/node3.xml
[root@roompc901 qemu]# sed 's/node/nn01/' node.xml > /etc/libvirt/qemu/nodenn01.xml
[root@roompc901 qemu]# virsh define node1.xml
[root@roompc901 qemu]# virsh define node2.xml
[root@roompc901 qemu]# virsh define node3.xml
[root@roompc901 qemu]# virsh define nn01.xml
[root@roompc901 qemu]# virsh start node1
[root@roompc901 qemu]# virsh start node2
[root@roompc901 qemu]# virsh start node3
[root@roompc901 qemu]# virsh start nn01
[root@roompc901 qemu]# virsh console nn01
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
[root@localhost ~]# systemctl restart network
[root@localhost ~]# hostnamectl set-hostname nn01
......
#===========================================================================#
[root@nn01 hadoop]# ssh-keygen
[root@nn01 hadoop]# for i in {0..3}; do ssh-copy-id 192.168.1.1$i; done
[root@nn01 hadoop]# vim /etc/hosts
192.168.1.10 nn01
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3
[root@nn01 hadoop]# for i in {0..3}; do scp /etc/hosts 192.168.1.1$i:/etc/; done
#===========================================================================#
安装java环境
[root@nn01 ~]# yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
[root@roompc901 arthitecture 05]# scp hadoop/ 192.168.1.10:/root/
[root@nn01 ~]# cd hadoop/
[root@nn01 hadoop]# tar -zvxf hadoop-2.7.6.tar.gz
[root@nn01 hadoop-2.7.6]# cd hadoop-2.7.6/
• HDFS 完全分布式系统配置
– 配置 hadoop-env.sh
– 配置 core-site.xml
– 配置 hdfs-site.xml
Hadoop 单机模式安装配置
1 hadoop 单机配置
[root@nn01 ~]# mkdir /usr/local/hadoop/
[root@nn01 ~]# cp -r /hadoop/hadoop-2.7.6/* /usr/local/hadoop
[root@nn01 hadoop]# which java
/usr/bin/java
[root@nn01 hadoop]# readlink -f $(which java)
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre/bin/java
[root@nn01 ~]# /usr/local/hadoop/etc/hadoop/hadoop-env.sh
修改以下两行:
......
export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre"
export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"
......
分析单词出现的次数
./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount oo xx
[root@nn01 hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount oo xx
[root@nn01 ~]# cd /usr/local/hadoop
[root@nn01 hadoop]# mkdir input
[root@nn01 hadoop]# cp *.txt input/
[root@nn01 hadoop]# ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount input output
#===========================================================================#
官方网址:
http://hadoop.apache.org
找到指导文档:
Documentation===>Release 2.7.6(找到对应的版本2.7.6)===>Configuration(配置)
[root@nn01 ~]# cd /usr/local/hadoop/etc/hadoop/
#=============================================#
NN1: 配置 core-site.xml
#=============================================#
[root@nn01 hadoop]# vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://nn01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value>
</property>
</configuration>
ALL: 创建文件夹 /var/hadoop
[root@nn01 hadoop]# mkdir /var/hadoop
[root@nn01 hadoop]# ssh node1 mkdir /var/hadoop
[root@nn01 hadoop]# ssh node2 mkdir /var/hadoop
[root@nn01 hadoop]# ssh node3 mkdir /var/hadoop
#=============================================#
NN1: 配置 hdfs-site.xml
#=============================================#
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>nn01:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>nn01:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
ALL:
[root@nn01 hadoop]# jps
13207 Jps
[root@nn01 hadoop]# ssh node2 jps
10270 Jps
[root@nn01 hadoop]# ssh node3 jps
10268 Jps slaves
NODE:
NN1: 配置slaves (节点)
root@nn01 ~]# vim /usr/local/hadoop/etc/hadoop/slaves
node1
node2
node3
ALL: 同步配置到所有主机
root@nn01 ~]# for i in {1..3}; do scp -r /usr/local/hadoop/ 192.168.1.1$i:/usr/local/ ; done
NN01: 格式化 namenode
./bin/hdfs namenode -format
[root@nn01 hadoop]# ./bin/hdfs namenode -format
NN01: 启动集群
[root@nn01 ~]# cd /usr/local/hadoop/
[root@nn01 hadoop]# ./sbin/start-dfs.sh
./sbin/start-dfs.sh
停止集群可以使用 ./sbin/stop-dfs.sh
ALL: 验证角色 jps
NN01: 验证集群是否组建成功
./bin/hdfs dfsadmin -report
服务启动日志路径 /usr/local/hadoop/logs
#=============================================#
配置完全分布式hadoop集群:
#=============================================#
mapred-site.xml 配置
#=============================================#
#复制模板文件并更名:
[root@nn01 hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@nn01 ~]# vim /usr/local/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
#=============================================#
yarn-site.xml 配置
#=============================================#
[root@nn01 ~]# vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>nn01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
ALL: 同步配置到主机
[root@nn01 ~]# for i in {1..3}; do scp -r /usr/local/hadoop/ 192.168.1.1$i:/usr/local/; done
NN1: 启动服务 ./sbin/start-yarn.sh
[root@nn01 hadoop]# ./sbin/start-yarn.sh
ALL: 验证角色 jps
[root@nn01 hadoop]# for i in nn01 node{1..3}; do echo "#---------------------$i-------------------#" && ssh $i jps; done;
[root@nn01 hadoop]# jps
2230 NodeManager
1959 ResourceManager
1001 NameNode
1289 SecondaryNameNode
2345 Jps
NN1: 验证节点状态 ./bin/yarn node -list
[root@nn01 hadoop]# ./bin/yarn node -list
namenode web 地址 http://192.168.1.10:50070
sedondary namenode web 地址 http://192.168.1.10:50090
yarn resourcemanager 管理地址 http://192.168.1.10:8088
datanode web 地址 http://192.168.1.11:50075
nodemanager web 地址 http://192.168.1.11:8042
#===========================================================================#
增加修复节点
按照单机方法安装一台机器,部署运行的 java 环境
拷贝 namenode 的文件到本机
启动 datanode
./sbin/hadoop-daemons.sh start datanode
设置同步带宽
./bin/hdfs dfsadmin -setBalancerBandwidth 60000000
./sbin/start-balancer.sh
– 1、启动一个新的系统,禁用 selinux、禁用 firewalld
– 2、设置 ssh 免密码登录
– 3、在所有节点增加新新节点的主机信息 /etc/hosts
– 4、安装 java openjdk 运行环境
– 5、拷贝namnode的 /usr/local/hadoop 到本机
– 6、修改namenode的slaves文件增加该节点
– 7、在该节点启动datanode
./sbin/hadoop-daemon.sh start datanode
– 增加节点 续 ... ...
– 8、设置同步带宽,并同步数据
./bin/hdfs dfsadmin -setBalancerBandwidth 67108864
./sbin/start-balancer.sh
– 9、查看集群状态
./bin/hdfs dfsadmin -report
HDFS 修复节点
– 修复节点比较简单,不增加节点基本一致
– 需要注意新节点的 ip 不 主机名 要不损坏节点一致
– 启动服务
./sbin/hadoop-daemon.sh start datanode
– 数据恢复是自动的
– 我们上线以后会自动恢复数据,如果数据量非常巨大,可能需要一定的时间
#===========================================================================#
恢复数据需注意:新添加节点后,不能立即下线要修复的节点。要等到数据更新完成才能下线。
• HDFS 删除节点
– 配置NameNode的 hdfs-site.xml
– 增加 dfs.hosts.exclude 配置
[root@nn01 hadoop]# vim hdfs-site.xml
<property>
<name>dfs.hosts.exclude</name>
<value>/usr/local/hadoop/etc/hadoop/exclude</value>
</property>
– 增加 exclude 配置文件,写入要删除的节点 主机名
[root@nn01 hadoop]# cat /usr/local/hadoop/etc/hadoop/exclude
node4
– 更新数据
./bin/hdfs dfsadmin -refreshNodes
[root@nn01 hadoop]# ./bin/hdfs dfsadmin -refreshNodes
Refresh nodes successful
• HDFS 删除节点状态
– 查看状态 ./bin/hdfs dfsadmin -report
– Normal 正常状态
– Decommissioned in Program 数据正在迁移(此时千万不能动机器)
– Decommissioned 数据迁移完成
– 注意:只有当状态变成 Decommissioned 才能 down
机下线。
#=================================================#
NFS网关
#=================================================#
• 调试不日志排错
– 在配置 NFS 网关过程中经常会碰到各种各样的错误,
如果出现了错误,打开调试日志是一个不错的选择
• log4j.property
– log4j.logger.org.apache.hadoop.hdfs.nfs=DEBUG
– log4j.logger.org.apache.hadoop.oncrpc=DEBUG
• 配置代理用户
– 在 namenode 和 nfsgw 上添加代理用户
– 代理用户的 uid gid 用户名 必须完全相同
– 如果因特殊原因客户端的用户和NFS网关的用户 uid
丌能保持一致需要我们配置 nfs.map 的静态映射关系
– nfs.map
NFS 网关
1 配置 /etc/hosts (NFSGW)
192.168.1.10 nn01
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3
192.168.1.15 nfsgw
[root@nfswg ~]# cat /etc/hosts
192.168.1.10 nn01
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3
192.168.1.14 nfsgw
2 添加用户(nfsgw, nn01)
[root@nn01 hadoop]# groupadd -g 500 nsd1804
[root@nn01 hadoop]# useradd -u 500 -g 500 nsd1804
[root@nfswg ~]# groupadd -g 500 nsd1804
[root@nfswg ~]# adduser -u 500 -g 500 nsd1804
NN01: 3 停止集群
[root@nn01 hadoop]#./sbin/stop-all.sh
NN01: 4 增加配置 core-site.xml
<property>
<name>hadoop.proxyuser.nsd1804.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.nsd1804.hosts</name>
<value>*</value>
</property>
NN01: 5 同步配置到 node1 node2 node3
NN01: 6 启动集群 ./sbin/start-dfs.sh
NN01: 7 查看状态
[root@nn01 hadoop]#./bin/hdfs dfsadmin -report
#===========================================================================#
--------------------------------------------------------------------------------------------------------------------------
• 配置步骤(nfsgw)
– 1、启动一个新的系统,禁用 selinux、禁用 firewalld
– 2、卸载 rpcbind 、nfs-utils
– 3、配置 /etc/hosts,添加所有 namenode 和
datanode 的主机名不 ip 对应关系
– 4、安装 java openjdk 的运行环境
NFSGW: 安装 java-1.8.0-openjdk-devel
NFSGW: 同步 nn01 的 /usr/local/hadoop 到NFSGW的相同目录下
NFSGW: hdfs-site.xml 增加配置
– 5、同步 namenode 的 /usr/local/hadoop 到本机
– 6、配置 hdfs-site.xml
– 7、启动服务
• 配置文件 hdfs-site.xml
• nfs.exports.allowed.hosts
– 默认情况下,export可以被任何客户端挂载。为了更好的控制访问,可以设置属性。值字符串为机器名和访问策略,通过空格来分割。机器名的格式可以是单一的主机,Java的正则表达式或者IPv4地址。访问权限使用rw或ro来挃定导出目录的读/写或机器只读访问。如果访问策略没被提供,默认为只读的。每个条目使用“;”来分割。
– nfs.exports.allowed.hosts
– 配置 * rw
... ...
<property>
<name>nfs.exports.allowed.hosts</name>
<value>* rw</value>
</property>
... ...
• nfs.dump.dir
– 用户需要更新文件转储目录参数。NFS客户端经常重新安排写操作,顺序的写操作会以随机到达NFS网关。这个目录常用于临时存储无序的写操作。对于每个文件,无序的写操作会在他们积累在内存中超过一定阈值(如。1 mb)被转储。需要确保有足够的空间的目录。例如,如果应用上传10个100M,那么这个转储目录推荐有1GB左右的空间,以便每个文件都发生最坏的情况。只有NFS网关需要在设置该属性后重启。
• 配置文件 hdfs-site.xml
– nfs.dump.dir
... ...
<property>
<name>nfs.dump.dir</name>
<value>/var/nfstmp</value>
</property>
... ...
– 配置完该属性后要创建 /var/nfstmp 文件夹
mkdir /var/nfstmp
– 并且把该文件夹的属组改成 代理用户
--------------------------------------------------------------------------------------------------------------------------
#===========================================================================#
[root@nsfgw hadoop]# vim hdfs-site.xml
......
<property>
<name>nfs.exports.allowed.hosts</name>
<value>* rw</value>
</property>
<property>
<name>nfs.dump.dir</name>
<value>/var/nfstmp</value>
</property>
.......
– 配置完该属性后要创建 /var/nfstmp 文件夹
NFSGW: 创建转储目录,并给用户 nsd1804 赋权
[root@nsfgw hadoop]# mkdir /var/nfstmp
[root@nsfgw hadoop]# chown nsd1804:nsd1804 /var/nfstmp
NFSGW: 给 /usr/local/hadoop/logs 赋权
[root@nsfgw hadoop]# setfacl -m u:nsd1804:rwx /usr/local/hadoop/logs
创建数据根目录 /var/hadoop
[root@nsfgw hadoop]# mkdir /var/hadoop
#===========================================================================#
---------------------------------------------------------------------------------------------------------------------------
启动不挂载
– 设置 /usr/local/hadoop/logs 权限,为代理用户赋予
读写执行的权限
setfacl -m user:proxyuser:rwx /usr/local/hadoop/logs
– 必须使用(root)用户启动 portmap 服务
./sbin/hadoop-daemon.sh --script ./bin/hdfs start portmap
[root@nsfgw hadoop]# ./sbin/hadoop-daemon.sh --script ./bin/hdfs start portmap
– 必须使用代理用户(nsd1804)启动 nfs3
./sbin/hadoop-daemon.sh --script ./bin/hdfs start nfs3
[root@nsfgw hadoop]# su - nsd1804
[nsd1804@nsfgw ~]$ cd /usr/local/hadoop/
[nsd1804@nsfgw hadoop]$ ./sbin/hadoop-daemon.sh --script ./bin/hdfs start nfs3
这里要特别注意:
– 启动 portmap 需要使用 root 用户
– 启动 nfs3 需要使用 core-site 里面设置的代理用户
– 必须先启动 portmap 之后再启动 nfs3
– 如果 portmap 重启了,在重启之后 nfs3 也需要重启
• 启动不挂载
– 强烈建议使用安装选项“sync”,因为它可以最小化
戒避免重新排序写入,这将导致更可预测的吞吏量。
未挃定同步选项可能会导致上传大文件时出现丌可靠
的行为
– 启动一台机器安装 nfs-utils
Client: 安装 nfs-utils
yum install nfs-utils
– 挂载 nfs
mount -t nfs -o vers=3,proto=tcp,noatime,nolock,sync,noacl 192.168.1.15:/ /mnt/
查看注册服务
rpcinfo -p 192.168.1.15
查看共享目录
showmount -e 192.168.1.15