所需节点的域名映射 :
hadoop01:192.168.126.11
hadoop02:192.168.126.12
hadoop03:192.168.126.13
hadoop04:192.168.126.14
一:伪分布式
前提已经配置好jdk:
https://blog.csdn.net/qq_36297434/article/details/83928241
1:启动hdfs并运行MapReduce程序
(1):配置集群
(a):配置hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
(b):配置core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
(c):配置hdfs-site.xml
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
(2):启动集群
(a):格式化namenode/datenode(第一次启动时格式化)
bin/hdfs namenode -format
bin/hdfs datanode -format
(b):启动namenode
sbin/hadoop-daemon.sh start namenode
(c):启动datanode
sbin/hadoop-daemon.sh start datanode
(3):查看是否启动成功
(a):jps命令
NameNode
DataNode
Jps
(b):web端查看HDFS文件系统
http://hadoop01:50070/dfshealth.html#tab-overview
2:YARN上运行MapReduce程序
(1)配置集群
(a):配置yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
(b):配置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>hadoop01</value>
</property>
(c):配置mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
(d):配置mapred-site.xml
对mapred-site.xml.template重命名为mapred-site.xml
mv mapred-site.xml.template mapred-site.xml
<!-- 指定mr运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
(2):启动集群
(a)启动resourcemanager
sbin/yarn-daemon.sh start resourcemanager
启动nodemanager
sbin/yarn-daemon.sh start nodemanager
(3):集群操作
(a):jps命令
ResourceManager
NameNode
DataNode
Jps
NodeManager
SecondaryNameNode
(b):yarn的浏览器页面查看
http://hadoop01:8088/cluster
3:配置临时文件存储路径
(1):停止进程命令
sbin/yarn-daemon.sh stop nodemanager
sbin/yarn-daemon.sh stop resourcemanager
sbin/hadoop-daemon.sh stop datanode
sbin/hadoop-daemon.sh stop namenode
(2):配置core-site.xml
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
(3):格式化Namenode
hadoop namenode -format
(4):启动所有进程命令
sbin/hadoop-daemon.sh start namenode
sbin/hadoop-daemon.sh start datanode
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
4:配置历史服务器
(1):配置mapred-site.xml
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
(2)启动历史服务器,并用jps查看
sbin/mr-jobhistory-daemon.sh start historyserver
(3):web查看jobhistory
http://hadoop01:19888/jobhistory
5:配置日志的聚集
(1):配置yarn-site.xml
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
(2)关闭nodemanager 、resourcemanager和historymanager
sbin/yarn-daemon.sh stop resourcemanager
sbin/yarn-daemon.sh stop nodemanager
sbin/mr-jobhistory-daemon.sh stop historyserver
(3)启动nodemanager 、resourcemanager和historymanager
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
sbin/mr-jobhistory-daemon.sh start historyserver
二:完全分布式
1:准备三个虚拟机(都需要配置jdk)
hadoop02
hadoop03
hadoop04
2:ssh无密码登陆(在所有节点都要配置)
(1):ssh 另一台电脑ip
(2):无密钥配置
(a):进入ssh目录
命令:cd ~/.ssh
(b):生成公钥和私钥
命令:ssh-keygen -t rsa
然后敲三个回车,就会生成两个文件id_rsa(私钥),id_rsa.pub(公钥)
(c)将公钥拷贝到要免密登陆的目标机器上
命令:ssh-copy-id hadoop02
命令:ssh-copy-id hadoop03
命令:ssh-copy-id hadoop04
(d):更改.ssh文件夹权限
命令:chmod -R 700 ~/.ssh/
(3):.ssh文件夹下的文件功能解释
(a):~/.ssh/known_hosts 记录ssh访问过的计算机的的公钥
(b):id-rsa 生成的私钥
(c):id-rsa.pub 生成的公钥
(d):authorized_keys 存放授权过的无密登陆服务器公钥
3:配置集群(在hadoop02上)
(1)集群部署规划
hadoop02 | hadoop03 | hadoop04 | |
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
(2):配置文件
(a):core-site.xml
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop02:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
</configuration>
(b):hdfs
1):hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
2):hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop04:50090</value>
</property>
</configuration>
3):slaves
hadoop02
hadoop03
hadoop04
(c)yarn
1):yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
2):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>hadoop03</value>
</property>
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
(c):mapreduce
1):mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
2):mapred-site.xml
<configuration>
<!-- 指定mr运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 配置历史服务器 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop104:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop104:19888</value>
</property>
</configuration>
(3)同步hadoop配置信息
(a):编写同步脚本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=03; host<05; host++)); do
echo ------------------- hadoop$host --------------
rsync -av $pdir/$fname $user@hadoop$host:$pdir
done
(b):设置可执行权限
chmod 777 xsync
(c):调用脚本
./xsync /opt/module/hadoop-2.7.2/etc
4:集群启动与测试
(1):集群第一次启动,格式化namenode(在hadoop02上)
bin/hdfs namenode -format
bin/hdfs datanode -format
(2):启动HDFS(在hadoop02上)
sbin/start-dfs.sh
(3):jps命令查看进程
hadoop02
NameNode
Jps
DataNode
hadoop03
DataNode
Jps
hadoop04
DataNode
SecondaryNameNode
Jps
(4):启动yarn(在hadoop03上)
sbin/start-yarn.sh
(5):启动historyserver(在hadoop04上)
sbin/mr-jobhistory-daemon.sh start historyserver
5:hadoop启动停止方式
注意:Namenode和ResourceManger如果不是同一台机器,不能在NameNode上启动 yarn,应该在ResouceManager所在的机器上启动yarn。
(1):各个服务组件逐一启动
(a):分别启动/停止hdfs组件
hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
(b):启动/停止yarn
yarn-daemon.sh start|stop resourcemanager|nodemanager
(c):启动/停止historyserver
mr-jobhistory-daemon.sh start|stop historyserver
(2):各个模块分开启动(配置ssh是前提)
(a)整体启动/停止hdfs
start-dfs.sh
stop-dfs.sh
(b):整体启动/停止yarn(在hadoop03上)
start-yarn.sh
stop-yarn.sh
三:hadoop fs命令
1:常规命令
1.1:-cp:复制文件
1.2:-mv:剪切文件
1.3:-chown:更改文件拥有者
1.4:-chgrp:变更文件的所属群组
1.5:-rm:删除文件
1.6:-chmod:更改文件权限
1.7:-mkdir:创建文件夹
1.8:-du -h:每个文件夹占用空间大小
1.9:-df -h:查看空间情况
1.10:-cat:查看文件内容
1.11:-setrep n:设置文件有n个副本
2:本地到HDFS
2.1:-put:复制本地文件到HDFS
2.2:-copyFromLocal:复制本地文件到HDFS
2.4:-moveFromLocal:剪切本地文件到HDFS
2.4:-appendToFile:追加本地文件到HDFS
3:HDFS到本地
3.1:-get:复制HDFS文件到本地
3.2:-copyToLocal:复制HDFS文件到本地
3.3:-getmerge:追加HDFS到文件本地
四:集群时间同步
1:时间服务器配置(必须root用户)
(1):检查ntp是否安装
rpm -qa|grep ntp
如无ntp:yum -y install ntp
(2):修改ntp配置文件
hadoop02:vi /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 文件
hadoop02:vi /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(4):重新启动ntpd服务
hadoop02:systemctl restart ntpd.service
(5):设置ntpd服务开机启动
hadoop02:chkconfig ntpd on
hadoop02:systemctl disable chronyd.service
2:其他机器配置(必须root用户)
(1):在其他机器配置10分钟与时间服务器同步一次
hadoop03,04:crontab -e
编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop02
(2):修改任意机器时间
hadoop03,04:date -s "2017-9-11 11:11:11"
(3):十分钟后查看机器是否与时间服务器同步
hadoop03,04:date
五:Hadoop编译源码(面试重点)
注意:所有操作必须在root用户下完成
1 前期准备工作
1.1. CentOS联网
配置CentOS能连接外网。Linux虚拟机ping www.baidu.com 是畅通的
注意:采用root角色编译,减少文件夹权限出现问题
1.2. jar包准备(hadoop源码、JDK8、maven、ant 、protobuf)
(1)hadoop-2.7.2-src.tar.gz
(2)jdk-8u144-linux-x64.tar.gz
(3)apache-ant-1.9.9-bin.tar.gz(build工具,打包用的)
(4)apache-maven-3.0.5-bin.tar.gz
(5)protobuf-2.5.0.tar.gz(序列化的框架)
2:jar包安装
2.1:JDK解压、配置环境变量 JAVA_HOME和PATH
命令:tar -zxf jdk-8u144-linux-x64.tar.gz -C /opt/module/
命令:vi /etc/profile
profile增加如下配置:
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
命令source /etc/profile
验证命令:java -version
2.2:Maven解压、配置 MAVEN_HOME和PATH
tar -zxvf apache-maven-3.0.5-bin.tar.gz -C /opt/module/
vi conf/settings.xml
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
profile增加如下配置:
export MAVEN_HOME=/opt/module/apache-maven-3.0.5
export PATH=$PATH:$MAVEN_HOME/bin
命令:source /etc/profile
验证命令:mvn -version
2.3:ant解压、配置 ANT _HOME和PATH
命令:tar -zxvf apache-ant-1.9.9-bin.tar.gz -C /opt/module/
命令:vi /etc/profile
profile增加如下配置
export ANT_HOME=/opt/module/apache-ant-1.9.9
export PATH=$PATH:$ANT_HOME/bin
命令:source /etc/profile
验证命令:ant -version
2.4:安装 glibc-headers 和 g++ 命令如下
yum install glibc-headers
yum install gcc-c++
2.5:安装make和cmake
yum install make
yum install cmake
2.6:解压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
命令:vi /etc/profile
profile增加如下配置
export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0
export PATH=$PATH:$LD_LIBRARY_PATH
命令:source /etc/profile
验证命令:protoc --version
2.7. 安装openssl库
yum install openssl-devel
2.8. 安装 ncurses-devel库
yum install ncurses-devel
到此,编译工具安装基本完成。
3:编译源码
3.1. 解压源码到/opt/目录
tar -zxvf hadoop-2.7.2-src.tar.gz -C /opt/
3.2. 进入到hadoop源码主目录
命令:pwd
输出:/opt/hadoop-2.7.2-src
3.3. 通过maven执行编译命令
mvn package -Pdist,native -DskipTests -Dtar
等待时间30分钟左右,最终成功是全部SUCCESS,如图所示:
3.4:成功的64位hadoop包在/opt/hadoop-2.7.2-src/hadoop-dist/target下
3.5:编译源码过程中常见的问题及解决方案
(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等错误,插件下载未完整或者插件版本问题,最开始链接有较多特殊情况,同时推荐2.7.0版本的问题汇总帖子 :
http://www.tuicool.com/articles/IBn63qf