虚拟机: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安装及设置共享文件夹
虚拟机中克隆虚拟机的步骤
scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)
scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
(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。
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
[hadoop@hadoop101 opt]$rsync -rvl /opt/software/ root@hadoop102:/opt/software
rsync -rvl /opt/module root@hadoop103:/opt/
[hadoop@hadoop102 ~]$mkdir bin
[hadoop@hadoop102~]$cd bin/
[hadoop@hadoop102 bin]$touch xsync
[hadoop@hadoop102 bin]$vi xsync
在该文件中编写如下代码
#!/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
[hadoop@hadoop102 bin]$chmod 777 xsync
[hadoop@hadoop102 bin]$xsync /home/hadoop/bin
注意:如果将xsync放到/home/atguigu/bin目录下仍然不能实现全局使用,可以将xsync移动到/usr/local/bin目录下。
[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>
[hadoop@hadoop102 hadoop]$vi hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
[hadoop@hadoop102 hadoop]$vi hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--指定Hadoop辅助名称节点主机配置-->
<property>
<name>dfs.namenode.secondary.http- address</name>
<value>hadoop104:50090</value>
</property>
dfs.replication副本数的配置默认为3,也可把这个配置删除,直接用默认的[hadoop@hadoop102 hadoop]$vi yarn-env.sh
exportJAVA_HOME=/opt/module/jdk1.8.0_144
[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>
[hadoop@hadoop102 hadoop]$vi mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
[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>
[hadoop@hadoop102 hadoop]$xsync /opt/module/hadoop-2.7.2/
[hadoop@hadoop103 hadoop]$cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
[hadoop@hadoop102 hadoop2.7.2]$hadoop namenode -format
如果是第N此格式化,需要先把hadoop2.7.2目录下的data和logs文件夹删除,然后在执行命令,且格式化过程中不能出现选项,要一直顺利的下来。这样才能格式化成功。
[hadoop@hadoop102 hadoop2.7.2]$hadoop-daemon.sh start namenode
[hadoop@hadoop102 hadoop2.7.2]$jps
3461 NameNode
[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 另一台电脑的ip地址
[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.
免密登陆原理
每发送一条报文,都要加密两次、解密两次。(发送方用发送方私钥加密一次,接收方公钥加密一次。接收方用接收方私钥解密一次,发送方公钥解密一次。)
[hadoop@hadoop102 .ssh]$ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
[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服务器上。
在这里有些人使用的是dsa加密,个人感觉都差不多。关于dsa和rsa的大致区别,请看文章:
DSA和RSA加密算法的区别
cd /opt/module/hadoop-2.7.2/etc/hadoop/
[hadoop@hadoop102 hadoop]$vi slaves
在该文件中增加如下内容:
hadoop102
hadoop103
hadoop104
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件
[hadoop@hadoop102 hadoop]$xsync slaves
[hadoop@hadoop102 hadoop-2.7.2]$bin/hdfs namenode -format
[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
[hadoop@hadoop103 hadoop-2.7.2]$sbin/start-yarn.sh
注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启
动YARN,应该在ResouceManager所在的机器上启动YARN。
(a)浏览器中输入:http://hadoop104:50090/status.html
(b)查看SecondaryNameNode信息
[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
[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
[hadoop@hadoop102 subdir0]$cat blk_1083626111
[hadoop@hadoop102 subdir0]$cat blk_1083626114>>tmp.file
[hadoop@hadoop102 subdir0]$cat blk_1083626115>>tmp.file
[hadoop@hadoop102 subdir0]$tar -zxvf tmp.file
[hadoop@hadoop102 hadoop-2.7.2]$bin/hadoop fs -get /user/hadoop/input/hadoop-2.7.2.tar.gz./
hadoopdaemon.sh start/stop namenode/datanode/secondarynamenode
yarndaemon.sh start/stop resourcemanager/nodemanager
start-dfs.sh / stop-dfs.sh
start-yarn.sh / stop-yarn.sh
INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
Unabletoloadnative-hadooplibraryforyourplatform...usingbuiltin-javaclasseswhere applicable
17/05/22 15:38:58 INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
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等特殊名称
(1)NameNode再format初始化之后
(2)DataNode在启动之后也会生成和NameNode一样的clusterId(集群id)
(3)再次格式化NameNode,生成新的clusterid,与未删除DataNode的clusterid不一致
(4)解决办法:在格式化之前,先删除DataNode里面的信息(默认在/tmp,如果配置了该目录,那就去你配置的目录下删除数据)
录下/tmp目录中存在启动的进程临时文件,将集群相关进程删除掉,再重新启动集群。
原因:全局变量hadoopjava没有生效。解决办法:需要source /etc/profile文件。
[hadoop@hadoop102 桌面]$cat /etc/hosts
注释掉如下代码
#127.0.0.1 localhost localhost.localdomainlocalhost4localhost4.localdomain4
#::1 hadoop102