1.分布式运行Hadoop 案例
(1)YARN上运行MapReduce 程序
配置集群:
在etc/hadoop目录下
(a)配置yarn-env.sh 配置一下JAVA_HOME
(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>hadoop101</value>
</property>
(c)配置:mapred-env.sh 配置一下JAVA_HOME
(d)配置: (对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>
启动集群:
(a)启动前必须保证namenode和datanode已经启动 因为yarn是调度,要先启动任务
(b)启动resourcemanager
sbin/yarn-daemon.sh start resourcemanager
(c)启动nodemanager
sbin/yarn-daemon.sh start nodemanager
操作集群:
(a)yarn的浏览器页面查看
http://192.168.1.101:8088/ #主机号也行
(b)删除文件系统上的output文件 #一定要提前删除
hdfs dfs -rm -R /user/atguigu/output
(c)执行mapreduce程序
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input /user/atguigu/output
(d)查看运行结果
hdfs dfs -cat /user/master/output/p*
(2)修改本地临时文件存储目录
@在前面配置过了,这里其实可以省略的!
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)修改hadoop.tmp.dir
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
3)将/opt/module/hadoop-2.7.2路径中的logs文件夹删除掉
[atguigu@hadoop101 hadoop-2.7.2]$ rm -rf logs/
4)进入到tmp目录将tmp目录中hadoop-atguigu目录删除掉
[atguigu@hadoop101 /tmp]$ rm -rf hadoop-atguigu/
5)格式化NameNode
hadoop namenode -format
6)启动所有进程
sbin/yarn-daemon.sh start nodemanager
sbin/yarn-daemon.sh start resourcemanager
sbin/hadoop-daemon.sh start datanode
sbin/hadoop-daemon.sh start namenode
5)查看/opt/module/hadoop-2.7.2/data/tmp这个目录下的内容。
(3)历史服务配置启动查看
@在目录 etc/hadoop
@可以不停止掉进程
1)配置mapred-site.xml
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop101:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop101:19888</value>
</property>
2)启动历史服务器:
sbin/mr-jobhistory-daemon.sh start historyserver
3)查看历史服务器是否启动 jps
4)查看jobhistory
http://192.168.1.101:19888/jobhistory #主机名:端口号
(4)日志的聚集
日志聚集概念:应用运行完成以后,将日志信息上传到HDFS系统上。
@etc/hadoop目录下
(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)关闭namenode、datanode、nodemanager 、resourcemanager和historymanager
sbin/mr-jobhistory-daemon.sh stop historyserver
sbin/yarn-daemon.sh stop nodemanager
sbin/yarn-daemon.sh stop resourcemanager
sbin/hadoop-daemon.sh stop datanode
sbin/hadoop-daemon.sh stop namenode
(3)启动namenode、datanode、nodemanager 、resourcemanager和historymanager
sbin/mr-jobhistory-daemon.sh start historyserver
sbin/yarn-daemon.sh start nodemanager
sbin/yarn-daemon.sh start resourcemanager
sbin/hadoop-daemon.sh start datanode
sbin/hadoop-daemon.sh start namenode
(4)删除hdfs上已经存在的output文件
hdfs dfs -rm -r /user/atguigu/output
(5)执行wordcount程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input /user/atguigu/output
(5) Hadoop配置文件修改说明
Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
(1)默认配置文件:存放在.\share\hadoop相应的jar包中
[core-default.xml]
hadoop-common-2.7.2.jar/ core-default.xml
[hdfs-default.xml]
hadoop-hdfs-2.7.2.jar/ hdfs-default.xml
[yarn-default.xml]
hadoop-yarn-common-2.7.2.jar/ yarn-default.xml
[core-default.xml]
hadoop-mapreduce-client-core-2.7.2.jar/ core-default.xml
(2)自定义配置文件:存放在$HADOOP_HOME/etc/hadoop
core-site.xml hdfs-site.xml
yarn-site.xml mapred-site.xml
2.完全分布式部署Hadoop
扫描二维码关注公众号,回复:
6172519 查看本文章
linux命令:
sudo chmod 777 xsync #改为可读可写可执行
sudo chown pyvip:pyvip xsync #更改操作用户
basename /opt/tmp/test.txt 返回test.txt
dirname /opt/tmp/test.txt 返回/opt/tmp
whoami 返回用户
(1)虚拟机开启三台
(2)主机名设置,并且确保可以互相通信。
(3)scp可以实现服务器与服务器之间的数据完全的拷贝。
@坑:使用root用户时由于配置问题,权限错误
# 第一步: vim /etc/ssh/sshd_config
# 第二步: 注释这句话 PermitRootLogin prohibit-password
# 第三步: 新增加一条 PermitRootLogin yes
# 第四步重启服服:/etc/init.d/ssh restart
1)将hadoop101中/opt/module目录拷贝到hadoop102、hadoop103和hadoop104上。
scp -r /opt/module/ root@hadoop104:/opt
2)将hadoop101服务器上的/etc/profile文件拷贝到hadoop102、hadoop103和hadoop104上。
#要注意:source /etc/profile 重启环境变量
scp root@hadoop101:/etc/profile /etc/profile
3)在hadoop103上操作将hadoop101中/opt/software/目录拷贝到hadoop102的/opt目录上。
#注意这个:在加了免密登陆后正常,不加不论如何,搜遍帖子没解决掉!
scp -r root@hadoop101:/opt/software root@hadoop102:/opt/
(4)SSH无密码登录
1)基本语法
ssh 另一台电脑的ip地址/主机名 实现了远程登录 ssh master
2)无密钥配置
(1)进入到我的家目录,然后:cd .ssh/
(2)生成公钥和私钥:ssh-keygen -t rsa 加三次回车
(3)将公钥拷贝到要免密登录的目标机器上 ssh-copy-id hadoop103
注意:每个用户都要做相同的事,在master的普通用户和root用户都要做相同的事情
,一定注意还要在一个slave服务器节点也做相同的事,因为最后node和manager要分开放!
,而且不光要在其他服务器拷贝一次还要在本机进行一次拷贝!
(5)rsync远程同步工具,主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:
用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
把本机/opt/tmp目录同步到hadoop103服务器的root用户下的/opt/tmp目录
rsync -rvl /opt/tmp root@hadoop103:/opt/
(6)编写集群分发脚本xsync
1)需求分析:循环复制文件到所有节点的相同目录下。
(1)原始拷贝:rsync -rvl /opt/module root@hadoop103:/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 $user@hadoop$host:$pdir
echo --------------- hadoop$host ----------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
(2)修改脚本 xsync 具有执行权限 chown atguigu:atguigu xsync
(3)调用脚本形式:xsync 文件名称 xsync tmp/
#主义是在/opt目录下
(7)集群部署规划
hadoop102 hadoop103 hadoop104
HDFS 放:NameNode 放:SecondaryNameNode
DataNode //副本 DataNode//副本 DataNode//副本
YARN NodeManager//对应副本 NodeManager//对应副本 NodeManager//对应副本
放:ResourceManager
(8)配置集群
@etc/hadoop目录下
(1)core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master: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.8.0_144
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave1:50090</value>
</property>
</configuration>
slaves 文件
master
slave2
slave1
(3)yarn
yarn-env.sh :export JAVA_HOME=/opt/module/jdk1.8.0_144
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>slave2</value>
</property>
(4)mapreduce
mapred-env.sh :export JAVA_HOME=/opt/module/jdk1.8.0_144
mapred-site.xml
<!-- 指定mr运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
(9)在集群上分发以上所有文件
@在etc/目录下 xsync hadoop/
查看成功 cat hadoop/slaves
(10) 集群启动及测试
1)启动集群
(0)如果集群是第一次启动,需要格式化namenode
bin/hdfs namenode -format
(1)启动HDFS:
sbin/start-dfs.sh
(2)启动yarn
sbin/start-yarn.sh
2)集群基本测试
(1)上传文件到集群
hadoop fs -mkdir -p /user/atguigu/input
hadoop fs -lsr /
上传小文件 :hadoop fs -put wcinput/wc.input /user/atguigu/input
上传大文件 :hadoop fs -put /opt/software/hadoop-2.7.2.tar.gz /user/atguigu/input
(2)上传文件后查看文件存放在什么位置
/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-938951106-192.168.10.107-1495462844069/current/finalized/subdir0/subdir0
(3)拼接
cat blk_1073741836>>tmp.file #放到一个临时文件
cat blk_1073741837>>tmp.file
tar -zxvf tmp.file #解压到当前文件
(4)下载
bin/hadoop fs -get /user/atguigu/input/hadoop-2.7.2.tar.gz
(11) Hadoop启动停止方式
@etc/hadood目录下
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
(12) 集群时间同步(ubuntu不太一样)
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
@必须先切换到root用户 不然文件修改不了!
(1)修改ntp配置文件
修改内容如下
a)修改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
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
(2)修改/etc/sysconfig/ntpd 文件 (没找到,可能虚拟机问题,这个不管)
vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(3)重新启动ntp
service ntp status
service ntpd start
@最后这不太懂!!!
(4)在其他机器配置10分钟与时间服务器同步一次(编写脚本)
通过修改任意机器时间,进行比对