目录 :
1)准备3
台客户机(关闭防火墙、静态ip
、主机名称)
2)安装JDK
3)配置环境变量
4)安装Hadoop
5)配置环境变量
6)配置集群
7)单点启动
8)配置ssh
9)群起并测试集群
一 虚拟机准备
#!/bin/bash
#环境初始化脚本V1.0
#V2.0待优化项:
# 1. 增加下载相关软件操作:例如下载JDK mysql等 ----> 相关命令wget Curl Axel
# 2. 完成下载软件的配置修改操作:例如修改mysql hadoop配置等 ----> sed
# 3. 读取用户输入指令交互优化:在合适的地方提示用户输入相关内容 ----> 参考VMTools安装交互过程
# 4. 加入检查机制:例如判断文件是否存在,用户是否已经被创建等操作 ----> if
# 5. 加入容错机制:执行过程中发生Error以后的处理逻辑 ---->
# 6. 增加下载前软件安装情况检查等 ----> 待考虑点是否需要增加用户选择逻辑
# 7. 难点 :
# 1. 下载过程中网络波动问题导致文件下载失败;
# 2. 部分软件需要登录才能下载例如JDK,实现方式选择 : 携带签名访问或者通过三方资源站点下载
#读取用户输入
read -t 10 -p "Enter your user name in 10 seconds " username
read -t 10 -p "Enter your folder name in 10 seconds " foldernameone
read -t 10 -p "Enter your folder name in 10 seconds " foldernametwo
read -t 10 -p "Enter your starting value in 10 seconds " minvalue
read -t 10 -p "Enter your end value in 10 seconds " maxvalue
read -t 10 -p "Enter your ip number in 10 seconds " ip
#关闭防火墙
echo "关闭防火墙"
service iptables stop
chkconfig iptables off
#创建一个一般用户
echo "创建一般用户"
useradd $username
echo "123456" | passwd $username --stdin
#创建目录
echo "创建目录"
mkdir /opt/$foldernameone /opt/$foldernametwo
chown $username:$username /opt/$foldernameone /opt/$foldernametwo
#加入Sudoers
echo "加入Sudoers"
sed -i "/^root/a $username ALL=(ALL) NOPASSWD: ALL" /etc/sudoers
lan=`ifconfig | grep Bcast | cut -d . -f 3`
#改Host
echo "修改hosts"
for ((i=$minvalue;i<$maxvalue;i++))
do
echo "192.168.$lan.$i hadoop$i" >> /etc/hosts
done
#改网卡
echo "修改网卡"
cat <<EOF >/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.$lan.$ip
PREFIX=24
GATEWAY=192.168.$lan.2
DNS1=192.168.$lan.2
NAME=eth0
EOF
#改主机名
echo "修改主机"
sed -i "s/HOSTNAME=.*/HOSTNAME=hadoop$ip/g" /etc/sysconfig/network
#改网卡脚本
echo "修改网卡"
sed -i '/eth0/d' /etc/udev/rules.d/70-persistent-net.rules
sed -i 's/eth1/eth0/g' /etc/udev/rules.d/70-persistent-net.rules
#重启使配置生效
reboot
二 编写集群分发脚本xsync
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
上 :scp -r /opt/module root@hadoop102:/opt/module
(b)在hadoop103
上,将hadoop101
服务器上的/opt/module
目录下的软件拷贝到hadoop103
上.
(c)在hadoop103
上操作将hadoop101
中/opt/module
目录下的软件拷贝到hadoop104
上 :scp -r root@hadoop101:/opt/module root@hadoop104:/opt/module
注意:拷贝过来的/opt/module目录,别忘了在hadoop102、hadoop103、hadoop104上修改所有文件的,所有者和所有者组。sudo chown xxx:xxx -R /opt/module
(d)将hadoop101
中/etc/profile
文件拷贝到hadoop102
的/etc/profile
上 :sudo scp /etc/profile root@hadoop102:/etc/profile
(e)将hadoop101
中/etc/profile
文件拷贝到hadoop103
的/etc/profile
上 :sudo scp /etc/profile root@hadoop103:/etc/profile
(f)将hadoop101
中/etc/profile
文件拷贝到hadoop104
的/etc/profile
上
注意:拷贝过来的配置文件别忘了source一下/etc/profile
rsync
远程同步工具
rsync
主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync
和scp
区别:用rsync
做文件的复制要比scp
的速度快,rsync
只对差异文件做更新。scp
是把所有文件都复制过去(1)基本语法
rsync -av $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
选项参数说明(2)案例实操
(a)把hadoop101
机器上的/opt/software
目录同步到hadoop102
服务器的root
用户下的/opt/
目录 :rsync -av /opt/software/ hadoop102:/opt/software
xsync
集群分发脚本(1)需求:循环复制文件到所有节点的相同目录下
(2)需求分析:
(a)rsync
命令原始拷贝:rsync -av /opt/module root@hadoop103:/opt/
(b)期望脚本:xsync
要同步的文件名称
(c)说明:在/home/xxx/bin
这个目录下存放的脚本,xxx
用户可以在系统任何地方直接执行。
(3)脚本实现
(a)在/home/xxx
目录下创建bin目录,并在bin
目录下xsync
创建文件,文件内容如下#!/bin/bash # mkdir bin # cd bin/ # touch xsync # vi xsync # 在该文件中编写如下代码 #1. 判断参数个数 if [ $# -lt 1 ] then echo Not Enough Arguement! exit; fi #2. 遍历所有目录,挨个发送 for file in $@ do #4.5 判断文件是否存在 if [ -e $file ] then #3. 获取父目录 pdir=$(cd -P $(dirname $file); pwd) #4. 获取当前文件的名称 fname=$(basename $file) #5. 遍历集群所有机器,拷贝 for host in hadoop102 hadoop103 hadoop104 do echo ==================== $host ==================== rsync -av $pdir/$fname $USER@$host:$pdir done else echo $file does not exists! fi done
(b)修改脚本
xsync
具有执行权限 :chmod 777 xsync
(c)调用脚本形式:xsync
文件名称
注意:如果将xsync放到/home/xxx/bin目录下仍然不能实现全局使用,可以将xsync移动到/usr/local/bin目录下
SSH
无密登录配置
- 配置
ssh
(1)基本语法 :ssh
另一台电脑的ip
地址;
(2)ssh
连接时出现Host key verification failed
的解决方法
(3)解决方案如下:直接输入yes
- 无密钥配置
(1)免密登录原理
(2)生成公钥和私钥 :ssh-keygen -t rsa
(3)将公钥拷贝到要免密登录的目标机器上ssh-copy-id hadoop102 ssh-copy-id hadoop103 ssh-copy-id hadoop104
注意:
还需要在hadoop102上采用root账号,配置一下无密登录到hadoop102、hadoop103、hadoop104;  还需要在hadoop103上采用xxx账号配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。
.ssh
文件夹下(~/.ssh)
的文件功能解释
三 集群配置
- 集群部署规划
- 配置集群
(1)核心配置文件->配置
core-site.xml
:vim 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
:vim hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置hdfs-site.xml
:vim 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>
(3)
YARN
配置文件
配置yarn-env.sh
:vim yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置yarn-site.xml
:vim 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
:vim mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置mapred-site.xml
:cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
<!-- 指定MR运行在Yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
- 在集群上分发配置好的
Hadoop
配置文件 :xsync /opt/module/hadoop-2.7.2/
- 查看文件分发情况 :
cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
四 集群单点启动
(1)如果集群是第一次启动,需要格式化
NameNode
:hdfs namenode -format
(2)在hadoop102
上启动NameNode
:hadoop-daemon.sh start namenode
jps
(3)在hadoop102
、hadoop103
以及hadoop104
上分别启动DataNode
hadoop-daemon.sh start datanode jps
(4)思考:每次都一个一个节点启动,如果节点数增加到1000个怎么办?
五 集群群起
- 配置
slaves
:vim /opt/module/hadoop-2.7.2/etc/hadoop/slaves
hadoop102 hadoop103 hadoop104 # 注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行
同步所有节点配置文件 :
xsync slaves
- 启动集群
(1)如果集群是第一次启动,需要格式化
NameNode
(注意格式化之前,一定要先停止上次启动的所有namenode
和datanode
进程,然后再删除data
和log
数据):bin/hdfs namenode -format
(2)启动HDFS
:sbin/start-dfs.sh
(3)启动YARN
:sbin/start-yarn.sh
注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN
(4)Web
端查看SecondaryNameNode
(a)浏览器中输入:http://hadoop104:50090/status.html
(b)查看SecondaryNameNode
信息
- 集群基本测试
(1)上传文件到集群
hdfs dfs -mkdir -p /user/xxx/input
hdfs dfs -put wcinput/wc.input /user/xxx/input
(2)上传文件后查看文件存放在什么位置
(a)查看HDFS
文件存储路径 :pwd
(b)查看HDFS
在磁盘存储文件内容 :cat blk_1073741825
(3)拼接cat blk_1073741836>>tmp.file
(4)打包tar -zxvf tmp.file
(5)下载bin/hadoop fs -get /user/xxx/input/hadoop-2.7.2.tar.gz ./
六 集群启动/停止方式总结
1.各个服务组件逐一启动/停止
(1)分别启动/停止HDFS
组件: hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode
(2)启动/停止YARN
:yarn-daemon.sh start / stop resourcemanager / nodemanager
- 各个模块分开启动/停止(配置
ssh
是前提)常用
(1)整体启动/停止HDFS
:start-dfs.sh
/stop-dfs.sh
(2)整体启动/停止YARN
:start-yarn.sh
/stop-yarn.sh
七 集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间
配置时间同步具体操作 :
- 时间服务器配置(必须
root
用户)
(1)检查ntp
是否安装 :rpm -qa|grep ntp
(2)修改ntp
配置文件 :vim /etc/ntp.conf
a)修改1(授权192.168.1.0-192.168.1.255网段上的所有机器可以从这>>台机器上查询和同步时间) #restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap为 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap b)修改2(集群在局域网中,不使用其他互联网上的时间) 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为 #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.0 stratum 10
(3)修改
/etc/sysconfig/ntpd
文件 :vim /etc/sysconfig/ntpd
# 增加内容如下(让硬件时间与系统时间一起同步) SYNC_HWCLOCK=yes
(4)重新启动
ntpd
服务 :service ntpd status
ntpd 已停
service ntpd start
正在启动 ntpd: [确定]
(5)设置ntpd
服务开机启动 :chkconfig ntpd on
- 其他机器配置(必须
root
用户)
(1)在其他机器配置10分钟与时间服务器同步一次 :crontab -e
*/10 * * * * /usr/sbin/ntpdate hadoop102
(2)修改任意机器时间 :date -s "2017-9-11 11:11:11"
(3)十分钟后查看机器是否与时间服务器同步date
八 Hadoop
编译源码
1️⃣前期准备工作
CentOS
联网
配置CentOS
能连接外网。Linux
虚拟机ping www.baidu.com
是畅通的
注意:采用root
角色编译,减少文件夹权限出现问题jar
包准备(hadoop
源码、JDK8
、maven
、ant
、protobuf
)2️⃣
jar
包安装 :注意:所有操作必须在root用户下完成
JDK
解压、配置环境变量JAVA_HOME
和PATH
,验证java -version
(如下都需要验证是否配置成功)tar -zxf jdk-8u144-linux-x64.tar.gz -C /opt/module/ vim /etc/profile #JAVA_HOME: export JAVA_HOME=/opt/module/jdk1.8.0_144 export PATH=$PATH:$JAVA_HOME/bin source /etc/profile
Maven
解压、配置MAVEN_HOME
和PATH
tar -zxvf apache-maven-3.0.5-bin.tar.gz -C /opt/module/ vim conf/settings.xml
<mirrors> <!-- mirror | Specifies a repository mirror site to use instead of a given >>repository. The repository that | this mirror serves has an ID that matches the mirrorOf element of >>this mirror. IDs are used | for inheritance and direct lookup purposes, and must be unique >>across the set of mirrors. | <mirror> <id>mirrorId</id> <mirrorOf>repositoryId</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://my.repository.com/repo/path</url> </mirror> --> <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> </mirrors>
vi /etc/profile #MAVEN_HOME export MAVEN_HOME=/opt/module/apache-maven-3.0.5 export PATH=$PATH:$MAVEN_HOME/bin source /etc/profile mvn -version
ant
解压、配置ANT _HOME
和PATH
tar -zxvf apache-ant-1.9.9-bin.tar.gz -C /opt/module/ vim /etc/profile #ANT_HOME export ANT_HOME=/opt/module/apache-ant-1.9.9 export PATH=$PATH:$ANT_HOME/bin source /etc/profile ant -version
- 安装
glibc-headers
和g++
命令如下yum install glibc-headers yum install gcc-c++
- 安装
make
和cmake
yum install make yum install cmake
- 解压
protobuf
,进入到解压后protobuf
主目录,/opt/module/protobuf-2.5.0
,然后相继执行命令tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/ cd /opt/module/protobuf-2.5.0/ ./configure make make check make install ldconfig vim /etc/profile #LD_LIBRARY_PATH export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0 export PATH=$PATH:$LD_LIBRARY_PATH source /etc/profile 验证命令:protoc --version
- 安装
openssl
库yum install openssl-devel
- 安装
ncurses-devel
库yum install ncurses-devel
到此,编译工具安装基本完成
3️⃣编译源码
- 解压源码到
/opt/
目录 :tar -zxvf hadoop-2.7.2-src.tar.gz -C /opt/
;- 进入到
hadoop
源码主目录 :pwd
;- 通过
maven
执行编译命令 :mvn package -Pdist,native -DskipTests -Dtar
等待时间30分钟左右,最终成功是全部SUCCESS
,如下图所示 :- 成功的64位
hadoop
包在/opt/hadoop-2.7.2-src/hadoop-dist/target
下- 编译源码过程中常见的问题及解决方案
(1)MAVEN install
时候JVM
内存溢出
处理方式:在环境配置文件和maven
的执行文件均可调整MAVEN_OPT
的heap
大小。(详情查阅MAVEN
编译JVM
调优问题,如:http://outofmemory.cn/code-snippet/12652/maven-outofmemoryerror-method
)
(2)编译期间maven
报错。可能网络阻塞问题导致依赖库下载不完整导致,多次执行命令(一次通过比较难):mvn package -Pdist,nativeN -DskipTests -Dtar
(3)报ant、protobuf
等错误,插件下载未完整或者插件版本问题,最开始链接有较多特殊情况,同时推荐
(4)2.7.0版本的问题汇总帖子 http://www.tuicool.com/articles/IBn63qf
九 常见错误及解决方案
1)防火墙没关闭、或者没有启动
YARN
:INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
2)主机名称配置错误
3)IP
地址配置错误
4)ssh
没有配置好
5)root
用户和xxx
两个用户启动集群不统一
6)配置文件修改不细心
7)未编译源码Unable to load native-hadoop library for your platform... using builtin-java classes where 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(JobSubmitte>>r.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
等特殊名称9)
DataNode
和NameNode
进程同时只能工作一个10)执行命令不生效,粘贴word
中命令时,遇到-和长–没区分开。导致命令失效
解决办法:尽量不要粘贴word
中代码
11)
jps
发现进程已经没有,但是重新启动集群,提示进程已经开启。原因是在linux
的根目录下/tmp
目录中存在启动的进程临时文件,将集群相关进程删除掉,再重新启动集群。
12)jps
不生效。
原因:全局变量hadoop java
没有生效。解决办法:需要source /etc/profile
文件。
13)8088
端口连接不上cat /etc/hosts 注释掉如下代码 #127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 #::1 hadoop102