准备、过程
虚拟机:VMware Workstation 12 Pro
操作系统:CentOS Linux release 7.2.1511 (Core)
控制终端:Secure CRT
Hadoop版本:Hadoop-2.7.3
JDk版本:jdk1.8.0_40
1)准备3台虚拟机(关闭防火墙、静态ip、主机名称)
2)安装JDK
3)配置环境变量
4)安装Hadoop
5)配置环境变量
6)配置集群
7)单点启动
8)配置ssh
9)群起并测试集群
常见错误及解决方案
虚拟机准备
请参考文章:
Cent OS 7系统的安装、VMware Tools安装及设置共享文件夹
虚拟机中克隆虚拟机的步骤
编写集群分发脚本xsync
-
1.scp(secure copy)安全拷贝
-
(1)scp定义:
scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)
-
(2)基本语法
scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
-
(3)案例实操
-
(a)在hadoop101上,将hadoop101中/opt/module目录下的软件拷贝到hadoop102上。
[hadoop@hadoop101 /]$scp -r /opt/module root@hadoop102:/opt/module
-
(b)在hadoop103上,将hadoop101服务器上的/opt/module目录下的软件拷贝到hadoop103上。
[hadoop@hadoop103 opt]$sudo scp -r hadoop@hadoop101:/opt/module root@hadoop103:/opt/module
-
(c)在hadoop103上操作将hadoop101中/opt/module目录下的软件拷贝到hadoop104上。
[hadoop@在hadoop103 opt]$scp -r hadoop@hadoop101:/opt/module root@hadoop104:/opt/module
注意:拷贝过来的/opt/module目录,别忘了在hadoop102、hadoop103、hadoop104上修改所有文件的,所有者和所有者组。
sudo chown hadoop:hadoop -R /opt/module
-
(d)将hadoop101中/etc/profile文件拷贝到hadoop102的/etc/profile上。
[hadoop@hadoop101 ~]$sudo scp /etc/profile root@hadoop102:/etc/profile
-
(e)将hadoop101中/etc/profile文件拷贝到hadoop103的/etc/profile上。
[hadoop@hadoop101 ~]$sudo scp /etc/profile root@hadoop103:/etc/profile
-
(f)将hadoop101中/etc/profile文件拷贝到hadoop104的/etc/profile上。
[hadoop@hadoop101 ~]$sudo scp /etc/profile root@hadoop104:/etc/profile
注意:拷贝过来的配置文件别忘了source一下/etc/profile。
-
-
-
2.rsync远程同步工具
-
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
-
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
-
(1)基本语法
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
选项参数:
-
-
3.xsync集群分发脚本
-
(1)需求:循环复制文件到所有节点的相同目录下
-
(2)需求分析:
- (a)rsync命令原始拷贝:
rsync -rvl /opt/module root@hadoop103:/opt/
- (b)期望脚本:
xsync要同步的文件名称
- (a)rsync命令原始拷贝:
- (c)说明:在/home/hadoop/bin这个目录下存放的脚本,hadoop用户可以在系统任何地方直接执行。
-
在该文件中编写如下代码
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4获取当前用户名称
user=`whoami`
#5循环
for((host=103;host<105;host++)); do
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
- (b)修改脚本xsync具有执行权限
[hadoop@hadoop102 bin]$chmod 777 xsync
- (c)调用脚本形式:xsync文件名称
[hadoop@hadoop102 bin]$xsync /home/hadoop/bin
注意:如果将xsync放到/home/hadoop/bin目录下仍然不能实现全局使用,可以将xsync移动到/usr/local/bin目录下。
集群配置
-
1.集群部署规划
-
2.配置集群
-
(1)核心配置文件
配置core-site.xml:
[hadoop@hadoop102 hadoop]$vi core-site.xml
在该文件中编写如下配置:<!--指定HDFS中NameNode的地址--> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop102:9000</value> </property> <!--指定Hadoop运行时产生文件的存储目录--> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp</value> </property>
-
(2)HDFS配置文件
配置hadoop-env.sh
[hadoop@hadoop102 hadoop]$vi hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置hdfs-site.xml
[hadoop@hadoop102 hadoop]$vi hdfs-site.xml
在该文件中编写如下配置
dfs.replication副本数的配置默认为3,也可把这个配置删除,直接用默认的<property> <name>dfs.replication</name> <value>3</value> </property> <!--指定Hadoop辅助名称节点主机配置--> <property> <name>dfs.namenode.secondary.http- address</name> <value>hadoop104:50090</value> </property>
-
(3)YARN配置文件
配置yarn-env.sh
[hadoop@hadoop102 hadoop]$vi yarn-env.sh
exportJAVA_HOME=/opt/module/jdk1.8.0_144
配置yarn-site.xml
[hadoop@hadoop102 hadoop]$vi yarn-site.xml
在该文件中增加如下配置<!--Reducer获取数据的方式--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!--指定YARN的ResourceManager的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop103</value> </property>
-
(4)MapReduce配置文件
配置mapred-env.sh
[hadoop@hadoop102 hadoop]$vi mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置mapred-site.xml
[hadoop@hadoop102hadoop]$cpmapred-site.xml.template mapred-site.xml
[hadoop@hadoop102hadoop]$vimapred-site.xml
在该文件中增加如下配置<!--指定MR运行在Yarn上--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
-
-
3.在集群上分发配置好的Hadoop配置文件
[hadoop@hadoop102 hadoop]$xsync /opt/module/hadoop-2.7.2/
-
4.查看文件分发情况
[hadoop@hadoop103 hadoop]$cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
集群单节点启动
-
1.如果集群是第一次启动,需要格式化NameNode
[hadoop@hadoop102 hadoop2.7.2]$hadoop namenode -format
如果是第N此格式化,需要先把hadoop2.7.2目录下的data和logs文件夹删除,然后在执行命令,且格式化过程中不能出现选项,要一直顺利的下来。这样才能格式化成功。
-
2.在hadoop102上启动NameNode
[hadoop@hadoop102 hadoop2.7.2]$hadoop-daemon.sh start namenode
[hadoop@hadoop102 hadoop2.7.2]$jps
3461 NameNode
-
3.在hadoop102、hadoop103以及hadoop104上分别启动DataNode
[hadoop@hadoop102 hadoop2.7.2]$hadoop-daemon.sh start datanode
[hadoop@hadoop102 hadoop-2.7.2]$jps
3461 NameNode
3608 Jps
3561 DataNode
[hadoop@hadoop103 hadoop-2.7.2]$hadoop-daemon.sh start datanode
[hadoop@hadoop103 hadoop-2.7.2]$jps
3190 DataNode
3279 Jps
[hadoop@hadoop104 hadoop-2.7.2]$hadoop-daemon.sh start datanode
[hadoop@hadoop104 hadoop-2.7.2]$jps
3237 Jps
3163 DataNode
SSH无密登录配置
-
1.配置ssh
-
(1)基本语法
ssh 另一台电脑的ip地址
-
(2)ssh连接时出现Hostkeyverificationfailed的解决方法
[hadoop@hadoop102 opt]$ssh 192.168.1.103 Theauthenticityofhost'192.168.1.103(192.168.1.103)'can't be established. RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd:ae:b1:2d:ad:06. Are you sure you want to continue connecting (yes/no) ? Host key verification failed.
-
(3)解决方案如下:直接输入yes
-
-
2.无密钥配置
-
(1)免密登录原理,如图所示
免密登陆原理
每发送一条报文,都要加密两次、解密两次。(发送方用发送方私钥加密一次,接收方公钥加密一次。接收方用接收方私钥解密一次,发送方公钥解密一次。) -
(2)生成公钥和私钥:
[hadoop@hadoop102 .ssh]$ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥) -
(3)将公钥拷贝到要免密登录的目标机器上
[hadoop@hadoop102 .ssh]$ssh-copy-id hadoop102
[hadoop@hadoop102 .ssh]$ssh-copy-id hadoop103
[hadoop@hadoop102 .ssh]$ssh-copy-id hadoop104
注意:
还需要在hadoop102上采用root账号,配置一下无密登录到hadoop102、hadoop103、hadoop104;
还需要在hadoop103上采用hadoop账号配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。
-
-
3. .ssh文件夹下(~/.ssh)的文件功能解释
在这里有些人使用的是dsa加密,个人感觉都差不多。关于dsa和rsa的大致区别,请看文章:
DSA和RSA加密算法的区别
群启集群
-
1. 配置slaves
cd /opt/module/hadoop-2.7.2/etc/hadoop/
[hadoop@hadoop102 hadoop]$vi slaves
在该文件中增加如下内容:hadoop102 hadoop103 hadoop104
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件
[hadoop@hadoop102 hadoop]$xsync slaves
-
2. 启动集群
-
(1)如果集群是第一次启动,需要格式化NameNode (注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)
[hadoop@hadoop102 hadoop-2.7.2]$bin/hdfs namenode -format
-
(2)启动HDFS
[hadoop@hadoop102 hadoop-2.7.2]$sbin/start-dfs.sh [hadoop@hadoop102 hadoop-2.7.2]$jps 4166 NameNode 4482 Jps 4263 DataNode [hadoop@hadoop103 hadoop-2.7.2]$jps 3218 DataNode 3288 Jps
[hadoop@hadoop104 hadoop-2.7.2]$jps 3221 DataNode 3283 SecondaryNameNode 3364 Jps
-
(3)启动YARN
[hadoop@hadoop103 hadoop-2.7.2]$sbin/start-yarn.sh
注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启
动YARN,应该在ResouceManager所在的机器上启动YARN。 -
(4)Web端查看 SecondaryNameNode
(a)浏览器中输入:http://hadoop104:50090/status.html
(b)查看SecondaryNameNode信息
-
-
3.集群基本测试
-
(1)上传文件到集群
上传小文件
[hadoop@hadoop102 hadoop-2.7.2]$hdfs dfs -mkdir -p /user/hadoop/input
[hadoop@hadoop102 hadoop-2.7.2]$hdfs dfs -put wcinput/wc.input /user/hadoop/input
上传大文件
[hadoop@hadoop102 hadoop-2.7.2]$bin/hadoop fs -put /opt/software/hadoop-2.7.2.tar.gz /user/hadoop/input
-
(2)上传文件后查看文件存放在什么位置
- (a)查看HDFS文件存储路径
[hadoop@hadoop102 subdir0]$pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-938951106-192.168.10.107-1495462844069/current/finalized/subdir0/subdir0
- (b)查看HDFS在磁盘存储文件内容
[hadoop@hadoop102 subdir0]$cat blk_1083626111
- (a)查看HDFS文件存储路径
-
(3)拼接
[hadoop@hadoop102 subdir0]$cat blk_1083626114>>tmp.file
[hadoop@hadoop102 subdir0]$cat blk_1083626115>>tmp.file
[hadoop@hadoop102 subdir0]$tar -zxvf tmp.file
-
(4)下载
[hadoop@hadoop102 hadoop-2.7.2]$bin/hadoop fs -get /user/hadoop/input/hadoop-2.7.2.tar.gz./
-
集群启动/停止方式总结
不建议使用start-all.sh / stop-all.sh,因为通常namenode和resourcemanager不配置在同一个机器上,所以,用all容易出错(就连hadoop官方也不建议用)
常见错误及解决方案
-
1)防火墙没关闭、或者没有启动YARN
INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
-
2)主机名称配置错误
-
3)IP地址配置错误
-
4)ssh没有配置好
-
5)root用户和atguigu两个用户启动集群不统一
-
6)配置文件修改不细心
-
7)未编译源码
Unabletoloadnative-hadooplibraryforyourplatform...usingbuiltin-javaclasseswhere applicable
17/05/22 15:38:58 INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
-
8)不识别主机名称
java.net.UnknownHostException: hadoop102: hadoop102 at java.net.InetAddress.getLocalHost(InetAddress.java:1475) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:146) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287) at java.security.AccessController.doPrivileged(NativeMethod) at javax.security.auth.Subject.doAs(Subject.java:415)
解决办法:
(1)在/etc/hosts 文件中添加192.168.1.102 hadoop102
(2)主机名称不要起hadoop hadoop000等特殊名称 -
9)DataNode和NameNode进程同时只能工作一个。
(1)NameNode再format初始化之后
(2)DataNode在启动之后也会生成和NameNode一样的clusterId(集群id)
(3)再次格式化NameNode,生成新的clusterid,与未删除DataNode的clusterid不一致
(4)解决办法:在格式化之前,先删除DataNode里面的信息(默认在/tmp,如果配置了该目录,那就去你配置的目录下删除数据) -
10)jps发现进程已经没有,但是重新启动集群,提示进程已经开启。原因是在linux的根目
录下/tmp目录中存在启动的进程临时文件,将集群相关进程删除掉,再重新启动集群。
-
11)jps不生效。
原因:全局变量hadoopjava没有生效。解决办法:需要source /etc/profile文件。
-
12)8088端口连接不上
[hadoop@hadoop102 桌面]$cat /etc/hosts
注释掉如下代码
#127.0.0.1 localhost localhost.localdomainlocalhost4localhost4.localdomain4
#::1 hadoop102