完全分布式部署hadoop
3.3 完全分布式部署Hadoop
分析:
1)准备3台客户机(关闭防火墙、静态ip、主机名称)
2)安装jdk
3)配置环境变量
4)安装hadoop
5)配置环境变量
6)安装ssh
7)配置集群
8)启动测试集群
3.3.1 虚拟机准备
详见2.2-2.3章。
3.3.2 主机名设置
详见2.4章。
3.3.3 scp
1)scp可以实现服务器与服务器之间的数据拷贝。
2)案例实操
(1)将hadoop101中/opt/module和/opt/software文件拷贝到hadoop102、hadoop103和hadoop104上。
[[email protected]/]# scp -r /opt/module/ [email protected]:/opt
[[email protected]/]# scp -r /opt/software/ [email protected]:/opt
[[email protected]/]# scp -r /opt/module/ [email protected]:/opt
[[email protected]/]# scp -r /opt/software/ [email protected]:/opt
[[email protected]/]# scp -r /opt/module/ [email protected]:/opt
[[email protected]/]# scp -r /opt/software/ [email protected]:/opt
(2)将192.168.1.102服务器上的文件拷贝到当前用户下。
[[email protected]]# scp [email protected]:/etc/profile /opt/tmp/
(3)实现两台远程机器之间的文件传输(hadoop103主机文件拷贝到hadoop104主机上)
[[email protected]]$ scp [email protected]:/opt/test/haha [email protected]:/opt/test/
3.3.4 SSH无密码登录
1)配置ssh
(1)基本语法
ssh 另一台电脑的ip地址
(2)ssh连接时出现Host keyverification failed的解决方法
[[email protected] opt]#ssh 192.168.1.103
The authenticity of host '192.168.1.103(192.168.1.103)' can't be established.
RSA key fingerprint iscf: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)进入到我的home目录
cd ~/.ssh
(2)生成公钥和私钥:
ssh-****** -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
(3)将公钥拷贝到要免密登录的目标机器上
ssh-copy-id hadoop103
ssh-copy-id hadoop104
3).ssh文件夹下的文件功能解释
(1)~/.ssh/known_hosts :记录ssh访问过计算机的公钥(publickey)
(2)id_rsa :生成的私钥
(3)id_rsa.pub :生成的公钥
(4)authorized_keys :存放授权过得无秘登录服务器公钥
3.3.5 rsync
rsync远程同步工具,主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(1)查看rsync使用说明
man rsync | more
(2)基本语法
rsync -rvl $pdir/$fname [email protected]$host:$pdir
命令命令参数要拷贝的文件路径/名称 目的用户@主机:目的路径
选项
-r 递归
-v 显示复制过程
-l 拷贝符号连接
(3)案例实操
把本机/opt/tmp目录同步到hadoop103服务器的root用户下的/opt/tmp目录
rsync -rvl/opt/tmp/* [email protected]:/opt/tmp
3.3.6 编写集群分发脚本xsync
1)需求分析:循环复制文件到所有节点的相同目录下。
(1)原始拷贝:
rsync -rvl /opt/module [email protected]:/opt/
(2)期望脚本:
xsync 要同步的文件名称
(3)在/usr/local/bin这个目录下存放的脚本,可以在系统任何地方直接执行。
2)案例实操:
(1)在/usr/local/bin目录下创建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 $pdir/$fname [email protected]$host:$pdir echo --------------- hadoop$host ---------------- rsync -rvl $pdir/$fname [email protected]$host:$pdir done |
(2)修改脚本 xsync 具有执行权限
[[email protected]]# chmod a+x xsync
(3)调用脚本形式:xsync 文件名称
3.3.7 编写分发脚本xcall
1)需求分析:在所有主机上同时执行相同的命令
xcall +命令
2)具体实现
(1)在/usr/local/bin目录下创建xcall文件,文件内容如下:
#!/bin/bash pcount=$# if((pcount==0));then echo no args; exit; fi
echo -------------localhost---------- for((host=101; host<=108; host++)); do echo ----------hadoop$host--------- ssh hadoop$host [email protected] done |
(2)修改脚本 xcall 具有执行权限
[[email protected]]# chmod a+x xcall
(3)调用脚本形式: xcall 操作命令
[[email protected]~]# xcall rm -rf /opt/tmp/profile
3.3.8 配置集群
1)集群部署规划
| hadoop102 | hadoop103 | hadoop104 |
HDFS
|
NameNode DataNode |
DataNode |
SecondaryNameNode DataNode |
YARN |
NodeManager |
ResourceManager NodeManager |
NodeManager |
2)配置文件
(1)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
export JAVA_HOME=/opt/module/jdk1.7.0_79 |
hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property>
<property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop104:50090</value> </property> </configuration> |
slaves
hadoop102 hadoop103 hadoop104 |
(3)yarn
yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.7.0_79 |
yarn-site.xml
<configuration>
<!-- 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> </configuration> |
(4)mapreduce
mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.7.0_79 |
mapred-site.xml
<configuration> <!-- 指定mr运行在yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> |
3)在集群上分发以上所有文件
cd/opt/module/hadoop-2.7.2/etc/hadoop
xsync/opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
xsync/opt/module/hadoop-2.7.2/etc/hadoop/yarn-site.xml
xsync/opt/module/hadoop-2.7.2/etc/hadoop/slaves
4)查看文件分发情况
xcallcat /opt/module/hadoop-2.7.2/etc/hadoop/slaves
3.3.9 集群启动及测试
1)启动集群
(0)如果集群是第一次启动,需要格式化namenode
[[email protected]]#bin/hdfsnamenode -format
(1)启动HDFS:
[[email protected]]#sbin/start-dfs.sh
[[email protected]]# jps
4166 NameNode
4482 Jps
4263 DataNode
[[email protected] 桌面]#jps
3218 DataNode
3288 Jps
[[email protected] 桌面]#jps
3221 DataNode
3283 SecondaryNameNode
3364 Jps
(2)启动yarn
sbin/start-yarn.sh
注意:Namenode和ResourceManger如果不是同一台机器,不能在NameNode上启动 yarn,应该在ResouceManager所在的机器上启动yarn。
2)集群基本测试
(1)上传文件到集群
上传小文件
bin/hdfs dfs -mkdir -p /user/jduser/tmp/conf
bin/hdfs dfs -put etc/hadoop/*-site.xml/user/jduser/tmp/conf
上传大文件
[[email protected]]$ bin/hadoop fs -put /opt/software/hadoop-2.7.2.tar.gz /user/jduser/input
(2)上传文件后查看文件存放在什么位置
文件存储路径
[[email protected] subdir0]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-938951106-192.168.10.107-1495462844069/current/finalized/subdir0/subdir0
查看文件内容
[[email protected]]$ cat blk_1073741825
hadoop
jduser
jduser
(3)拼接
-rw-rw-r--. 1 jduser jduser 134217728 5月 23 16:01 blk_1073741836
-rw-rw-r--. 1 jduser jduser 1048583 5月 23 16:01blk_1073741836_1012.meta
-rw-rw-r--. 1 jduser jduser 63439959 5月 23 16:01 blk_1073741837
-rw-rw-r--. 1 jduser jduser 495635 5月 23 16:01 blk_1073741837_1013.meta
[[email protected]]$ cat blk_1073741836>>tmp.file
[[email protected]]$ cat blk_1073741837>>tmp.file
[[email protected]]$ tar -zxvf tmp.file
(4)下载
[[email protected]]$ bin/hadoop fs -get /user/jduser/input/hadoop-2.7.2.tar.gz
3)性能测试集群
写海量数据
读海量数据
3.3.10 Hadoop启动停止方式
1)各个服务组件逐一启动
(1)分别启动hdfs组件
hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
(2)启动yarn
yarn-daemon.sh start|stop resourcemanager|nodemanager
2)各个模块分开启动(配置ssh是前提)常用
(1)整体启动/停止hdfs
start-dfs.sh
stop-dfs.sh
(2)整体启动/停止yarn
start-yarn.sh
stop-yarn.sh
3)全部启动(不建议使用)
start-all.sh
stop-all.sh
3.3.11 集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
配置时间同步实操:
1)时间服务器配置(必须root用户)
(1)检查ntp是否安装
[[email protected]桌面]# rpm -qa|grep ntp
ntp-4.2.6p5-10.el6.centos.x86_64
fontpackages-filesystem-1.41-1.1.el6.noarch
ntpdate-4.2.6p5-10.el6.centos.x86_64
(2)修改ntp配置文件
[[email protected]桌面]# vi/etc/ntp.conf
修改内容如下
a)修改1
#restrict192.168.1.0 mask 255.255.255.0 nomodify notrap为
restrict192.168.1.0 mask 255.255.255.0 nomodify notrap
b)修改2
server0.centos.pool.ntp.org iburst
server1.centos.pool.ntp.org iburst
server2.centos.pool.ntp.org iburst
server3.centos.pool.ntp.org iburst为
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
c)添加3
server 127.127.1.0
fudge 127.127.1.0stratum 10
(3)修改/etc/sysconfig/ntpd 文件
[[email protected] 桌面]#vim /etc/sysconfig/ntpd
增加内容如下
SYNC_HWCLOCK=yes
(4)重新启动ntpd
[[email protected]桌面]# service ntpd status
ntpd 已停
[[email protected]桌面]# service ntpd start
正在启动 ntpd: [确定]
(5)执行:
[[email protected]桌面]# chkconfig ntpd on
2)其他机器配置(必须root用户)
(1)在其他机器配置10分钟与时间服务器同步一次
[[email protected]3 hadoop-2.7.2]# crontab -e
编写脚本
*/10 * * * */usr/sbin/ntpdate hadoop102
(2)修改任意机器时间
[[email protected]3 hadoop]# date -s "2017-9-1111:11:11"
(3)十分钟后查看机器是否与时间服务器同步
[[email protected]3 hadoop]# date
3.3.12 配置集群常见问题
1)防火墙没关闭、或者没有启动yarn
INFO client.RMProxy:Connecting to ResourceManager at hadoop108/192.168.10.108:8032
2)主机名称配置错误
3)ip地址配置错误
4)ssh没有配置好
5)root用户和jduser两个用户启动集群不统一
6)配置文件修改不细心
7)未编译源码
Unableto load native-hadoop library for your platform... using builtin-java classeswhere applicable
17/05/2215:38:58 INFO client.RMProxy: Connecting to ResourceManager athadoop108/192.168.10.108:8032
8)datanode不被namenode识别问题
Namenode在format初始化的时候会形成两个标识,blockPoolId和clusterId。新的datanode加入时,会获取这两个标识作为自己工作目录中的标识。
一旦namenode重新format后,namenode的身份标识已变,而datanode如果依然持有原来的id,就不会被namenode识别。
解决办法,删除datanode节点中的数据后,再次重新格式化namenode。
9)不识别主机名称
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(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) |
解决办法:
(1)在/etc/hosts文件中添加192.168.1.102 hadoop102
(2)主机名称不要起hadoop hadoop000等特殊名称
10)datanode和namenode进程同时只能工作一个。
11)执行命令 不生效,粘贴word中命令时,遇到-和长–没区分开。导致命令失效
解决办法:尽量不要粘贴word中代码。
12)jps发现进程已经没有,但是重新启动集群,提示进程已经开启。原因是在linux的根目录下/tmp目录中存在启动的进程临时文件,将集群相关进程删除掉,再重新启动集群。
13)jps不生效。
原因:全局变量hadoop java没有生效,需要source /etc/profile文件。
14)8088端口连接不上
[[email protected] 桌面]$ cat /etc/hosts
注释掉如下代码
#127.0.0.1 localhost localhost.localdomain localhost4localhost4.localdomain4
#::1 hadoop102
四 Hadoop编译源码
4.1 前期准备工作
1)CentOS联网
配置CentOS能连接外网。Linux虚拟机ping www.baidu.com 是畅通的
注意:采用root角色编译,减少文件夹权限出现问题
2)jar包准备(hadoop源码、JDK7 、 maven、 ant 、protobuf)
(1)hadoop-2.7.2-src.tar.gz
(2)jdk-7u79-linux-x64.gz
(3)apache-ant-1.9.9-bin.tar.gz
(4)apache-maven-3.0.5-bin.tar.gz
(5)protobuf-2.5.0.tar.gz
4.2 jar包安装
0)注意:所有操作必须在root用户下完成
1)JDK解压、配置环境变量 JAVA_HOME和PATH,验证java-version(如下都需要验证是否配置成功)
[[email protected] software] # tar -zxf jdk-7u79-linux-x64.gz-C /opt/module/
[[email protected] software]# vi /etc/profile
#JAVA_HOME export JAVA_HOME=/opt/module/jdk1.7.0_79 export PATH=$PATH:$JAVA_HOME/bin |
[[email protected] software]#source /etc/profile
验证命令:java -version
2)Maven解压、配置 MAVEN_HOME和PATH。
[[email protected] software]# tar -zxvfapache-maven-3.0.5-bin.tar.gz -C /opt/module/
[[email protected] apache-maven-3.0.5]# vi /etc/profile
#MAVEN_HOME export MAVEN_HOME=/opt/module/apache-maven-3.0.5 export PATH=$PATH:$MAVEN_HOME/bin |
[[email protected] software]#source /etc/profile
验证命令:mvn -version
3)ant解压、配置 ANT _HOME和PATH。
[[email protected] software]# tar -zxvfapache-ant-1.9.9-bin.tar.gz -C /opt/module/
[[email protected] apache-ant-1.9.9]# vi/etc/profile
#ANT_HOME export ANT_HOME=/opt/module/apache-ant-1.9.9 export PATH=$PATH:$ANT_HOME/bin |
[[email protected] software]#source /etc/profile
验证命令:ant -version
4)安装 glibc-headers 和 g++ 命令如下:
[[email protected] apache-ant-1.9.9]# yum installglibc-headers
[[email protected] apache-ant-1.9.9]# yuminstall gcc-c++
5)安装make和cmake
[[email protected] apache-ant-1.9.9]# yum installmake
[[email protected] apache-ant-1.9.9]# yum installcmake
6)解压protobuf ,进入到解压后protobuf主目录,/opt/module/protobuf-2.5.0
然后相继执行命令:
[[email protected] software]# tar -zxvfprotobuf-2.5.0.tar.gz -C /opt/module/
[[email protected] opt]# cd/opt/module/protobuf-2.5.0/
[[email protected]]#./configure
[[email protected] protobuf-2.5.0]# make
[[email protected] protobuf-2.5.0]# makecheck
[[email protected] protobuf-2.5.0]# makeinstall
[[email protected] protobuf-2.5.0]#ldconfig
[[email protected] hadoop-dist]# vi /etc/profile
#LD_LIBRARY_PATH export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0 export PATH=$PATH:$LD_LIBRARY_PATH |
[[email protected] software]#source /etc/profile
验证命令:protoc --version
7)安装openssl库
[[email protected] software]#yum installopenssl-devel
8)安装 ncurses-devel库:
[[email protected] software]#yum installncurses-devel
到此,编译工具安装基本完成。
4.3 编译源码
1)解压源码到/opt/tools目录
[[email protected] software]# tar -zxvfhadoop-2.7.2-src.tar.gz -C /opt/
2)进入到hadoop源码主目录
[[email protected] hadoop-2.7.2-src]# pwd
/opt/hadoop-2.7.2-src
3)通过maven执行编译命令
[[email protected] hadoop-2.7.2-src]#mvn package-Pdist,native -DskipTests -Dtar
等待时间30分钟左右,最终成功是全部SUCCESS。
4)成功的64位hadoop包在/opt/hadoop-2.7.2-src/hadoop-dist/target下。
[[email protected] target]# pwd
/opt/hadoop-2.7.2-src/hadoop-dist/target
4.4 常见的问题及解决方案
1)MAVEN install时候JVM内存溢出
处理方式:在环境配置文件和maven的执行文件均可调整MAVEN_OPT的heap大小。(详情查阅MAVEN 编译 JVM调优问题,如:http://outofmemory.cn/code-snippet/12652/maven-outofmemoryerror-method)
2)编译期间maven报错。可能网络阻塞问题导致依赖库下载不完整导致,多次执行命令(一次通过比较难):
[[email protected] hadoop-2.7.2-src]#mvn package-Pdist,native -DskipTests -Dtar
3)报ant、protobuf等错误,插件下载未完整或者插件版本问题,最开始链接有较多特殊情况,同时推荐
2.7.0版本的问题汇总帖子 http://www.tuicool.com/articles/IBn63qf