hadoop运行模式介绍
hadoop有三种运行模式
- 本地模式(默认模式):
不需要启用单独进程,直接可以运行,测试和开发时使用。 - 伪分布式模式:
等同于完全分布式,只有一个节点。 - 完全分布式模式:
多个节点一起运行。
本地模式运行Hadoop案例
本地运行官方grep案例
- 在hadoop-2.8.3文件夹下面创建一个input文件夹
mkdir input - 将hadoop的xml配置文件复制到input
cp etc/hadoop/*.xml input - 执行share目录下的mapreduce程序
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.3.jar grep input output 'dfs[a-z.]+' - 查看输出结果
本地运行官方wordcount案例
- 在hadoop-2.8.3文件夹下面创建一个wcinput文件夹
mkdir wcinput - 在wcinput文件下创建一个wc.input文件,并输入以下内容
hello hadoop
hello mapreduce
hello yarn - 回到hadoop-2.8.3文件夹下,执行程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.3.jar wordcount wcinput wcoutput - 查看结果
伪分布式运行
启动HDFS并运行MapReduce程序
- 配置
1.1. 配置hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_181
1.2. 配置core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-00:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.8.3/data/tmp</value>
</property>
1.3. 配置hdfs-site.xml
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
- 启动
2.1. 格式化namenode
第一次启动时格式化,以后就不要总格式化
hdfs namenode -format
2.2. 启动namenode
hadoop-daemon.sh start namenode
2.3. 启动datanode
hadoop-daemon.sh start datanode - 查看集群
3.1. 查看是否启动成功
使用jps命令hdfs单机是否启动成功.png
3.2. 查看产生的log日志
hadoop-2.8.3/logs下是相关日志hadoop相关日志.png
3.3. web端查看hdfs文件系统
http://hadoop-00:50070/dfshealth.html#tab-overview - 操作集群
4.1. 在hdfs文件系统上创建一个input文件夹
hdfs dfs -mkdir -p /user/hadoop/input
4.2. 将测试文件上传到文件系统上
hdfs dfs -put hello.txt /user/hadoop/input
4.3. 查看上传文件是否正确
hdfs dfs -ls /user/hadoop/input
hdfs dfs -cat /user/hadoop/input/hello.txt
4.4. 运行mapreduce程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.3.jar wordcount /user/hadoop/input /user/hadoop/output
4.5. 查看输出结果
hdfs dfs -ls /user/hadoop/output
hdfs dfs -cat /user/hadoop/output/part-r-00000
4.6. 将输出结果下载到本地
hdfs dfs -get /user/hadoop/output output
4.8 删除输出结果文件夹
hdfs dfs -rm -r /user/hadoop/output
YARN上运行MapReduce程序
- 配置
1.1. 配置yarn-env.sh
JAVA_HOME=/opt/module/jdk1.8.0_181
1.2. 配置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>hadoop-00</value>
</property>
1.3. 配置mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_181
1.4. 配置mapred-site.xml
对mapred-site.xml.template重新命名为mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
<!-- 指定mr运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
- 启动
2.1. 启动resourcemanager
yarn-daemon.sh start resourcemanager
2.2. 启动nodemanager
yarn-daemon.sh start nodemanager - 操作
3.1. yarn的浏览器页面查看
http://hadoop-00:8088/clusteryarn1.png
3.2. 执行mapreduce程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.3.jar wordcount /user/hadoop/input /user/hadoop/output
3.3. 查看运行结果
hdfs dfs -ls /user/hadoop/output
hdfs dfs -cat /user/hadoop/output/part-r-00000yarn2.png
配置历史服务器
引入历史服务器.png
点上图的history是点不开的,需要配置历史服务器
- 配置mapred-site.xml
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop-00:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop-00:19888</value>
</property>
- 启动历史服务器
/mr-jobhistory-daemon.sh start historyserver - 查看是否启动
使用jps 或者访问http://hadoop-00:19888/jobhistory
日志的聚集
日志聚集概念:应用运行完成以后,将日志信息上传到HDFS系统上。
jobHistory.png
logs.png
点击上图的logs,访问不到,开启日志聚集
步骤如下
- 配置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>
- 把正在运行的相关进程停止
yarn-daemon.sh stop resourcemanager
yarn-daemon.sh stop nodemanager
hadoop-daemon.sh stop namenode
hadoop-daemon.sh stop datanode
mr-jobhistory-daemon.sh stop historyserver - 启动相关进程
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
mr-jobhistory-daemon.sh start historyserver - 删除已经存在的文件并执行wordcount案例
hdfs dfs -rm -r /user/hadoop/output
分布式部署运行
准备三台虚拟机,ip,主机名,防火墙关闭,安装好jdk和hadoop
scp命令
scp可以实现服务器与服务器之间的数据拷贝
具体使用
- 将hadoop-100 的/home/hadoop/test 文件复制到hadoop-101上
scp -r /home/hadoop/test hadoop@hadoop-101:/home/hadoop - 将服务器/etc/profile 文件复制到hadoop-101上
scp /etc/profile hadoop@hadoop-101:/etc/profile - hadoop-100上实现hadoop-101和hadoop-102的数据传输
scp hadoop@hadoop-101:/etc/profile hadoop@hadoop-102:/etc/profile
SSH无密码登录
免密登录原理
免密登录原理.png
.ssh文件夹下文件功能解释
- known_hosts,记录ssh访问过计算机的公钥(public key)
- id_rsa,生成的私钥
- id_rsa.pub,生成的公钥
- authorized_keys,存放授权过得无秘登录服务器公钥
具体步骤
- 进入到我的home目录下的.ssh目录
cd ~
cd .ssh - 生成公钥和私钥
ssh-keygen -t rsa
敲三个回车,会生成两个文件 - 将公钥拷贝到要免密登录的目标服务器上
ssh-copy-id hadoop-101
ssh-copy-id hadoop-102
rsync
rsync远程同步工具,主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
命令安装
yum -y install rsync
命令解释
rsync -rvl fname host:$pdir
命令 命令参数 要拷贝的文件路径/名称 目的用户@主机:目的路径
选项解释
-r 递归
-v 显示复制过程
-l 拷贝符号连接
案例
把本机/opt/tmp目录同步到hadoop-102服务器的root用户下的/opt/tmp目录
rsync -rvl /opt/tmp root@hadoop-102:/opt
编写集群分发脚本xsync
需求分析
循环复制文件到所有节点的相同目录下。
原始拷贝:rsync -rvl /opt/module root@hadoop103:/opt/
期望脚本:xsync 要同步的文件名称
在/usr/local/bin这个目录下存放的脚本,可以在系统任何地方直接执行。
实现
在hadoop-100上操作
- 在/usr/local/bin目录下创建xsync文件
vim xsync - 使该文件成可执行文件
chmod 777 xsync - 改变拥有者为hadoop
chown hadoop:hadoop 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=101;host<103;host++));do
echo $pdir/$fname $user@hadoop-$host:$pdir
rsync -rvl $pdir/$fname $user@hadoop-$host:$pdir
done
配置集群
集群部署规划
hadoop-100 | hadoop-101 | hadoop-102 | |
---|---|---|---|
HDFS | NameNode DateNode | DateNode | SecondaryNameNode DateNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
配置文件修改
- core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-100:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.8.3/data/tmp</value>
</property>
- hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_181
- hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop-102:50090</value>
</property>
- slaves
hadoop-100
hadoop-101
hadoop-102
- yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_181
- 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>hadoop101</value>
</property>
- mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_181
- mapred-site.xml
<!-- 指定mr运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
在集群上分发以上所有文件
进入etc目录
xsync hadoop/
查看分发情况
到hadoop-101 和 hadoop-102
cat slaves
集群启动及测试
启动集群
- 如果集群是第一次启动,需要格式化namenode,在namenode上格式化
/hdfs namenode -format - 启动hdfs,在namenode上启动hdfs
start-dfs.sh - 启动yarn,在ResourceManager所在的机器启动yarn
同样需要配置ssh无密登录
start-yarn.sh
集群基本测试
- 上传文件到集群
hdfs dfs -mkdir -p /user/hadoop
上传小文件
hdfs dfs -put /home/hadoop/hello.txt /user/hadoop/
上传大文件
hdfs dfs -put hadoop-2.8.3.tar.gz /user/hadoop/
hdfs dfs -put jdk-8u181-linux-x64.tar.gz /user/hadoop -
上传文件后文件存放在什么位置
/opt/module/hadoop-2.8.3/data/tmp/dfs/data/current/BP-922234044-192.168.114.100-1535772143813/current/finalized/subdir0/subdir0
可以查看下该路径下一个文件内容
cat blk_1073741825路径及内容.png
-
对大文件进行拼接
cat blk_1073741826>>test.file
cat blk_1073741827>>test.file
tar -zxvf test.file对大文件进行拼接.png
- 下载
hdfs dfs -get /user/hadoop/hadoop-2.8.3.tar.gz hadoop-2.8.3.tar.gz
Hadoop启动停止方式
- 各个服务组件逐一启动
启动hdfs组件
hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
启动yarn
yarn-daemon.sh start|stop resourcemanager|nodemanager - 各个模块分开启动(配置ssh是前提)
整体启动/停止hdfs
start-dfs.sh
stop-dfs.sh
整体启动/停止yarn
start-yarn.sh
stop-yarn.sh - 全部启动(不建议使用)
start-all.sh
stop-all.sh
集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
时间服务器操作步骤
使用root用户进行如下操作
-
检查ntp是否安装
rpm -qa|grep ntp是否安装ntp.png
没有安装的话,执行下yum -y install ntp
- 修改ntp配置文件
vi /etc/ntp.conf
分别做如下修改
修改1
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap为
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
修改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
添加3
server 127.127.1.0
fudge 127.127.1.0 stratum 10 - 修改/etc/sysconfig/ntpd 文件
vim /etc/sysconfig/ntpd
添加如下内容
SYNC_HWCLOCK=yes - 启动ntpd
service ntpd restart - 执行
chkconfig ntpd on
其他机器配置
必须是root用户
- 在其他机器配置10分钟与时间服务器同步一次
crontab -e
0-59/10 * * * * /usr/sbin/ntpdate hadoop-100 - 修改任意机器时间
date -s "2018-9-5 11:11:11" - 十分钟后查看机器是否与时间服务器同步
date