一:hadoop本地模式安装
1:创建输入文件夹
cd /opt/module/hadoop-3.1.3
mkdir wcinput
2:新增文本内容
hello.txt
t1 t1
t2 t2 t2
t3 t2 t3
atguigu
atguig
3:执行命令
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount ./wcinput ./wcoutput
4:查看数据
cd wcoutput/
cat part-r-00000
二:hadoop完全分布式集群安装
1:准备三台服务器节点
(1):克隆hadoop101
hadoop102,hadoop103,hadoop104,
(2):ip地址hostname准备
hadoop102:192.168.234.129
hadoop103:192.168.234.130
hadoop104:192.168.234.131
2:复制jdk,hadoop
(1):scp -r ./* atguigu@hadoop103:/opt/module
(2):scp -r ./* atguigu@hadoop104:/opt/module
3:分发jdk,hadoop
(1):scp -r ./my_env.sh root@hadoop103:/etc/profile.d/
(2):scp -r ./my_env.sh root@hadoop104:/etc/profile.d/
4:分发文件脚本
(1):hadoop102用atguigu登录密码123456,新建bin目录my_rsync.sh内容为:
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
5:环境变量
(1):hadoop103,104分别执行source /etc/profile
6:ssh免密登录
(1):原理
(2):生成公钥和私钥
hadoop102,hadoop103,hadoop104分别生成公钥和私钥
ssh-keygen -t rsa
(3):公钥拷贝钥免密登录的服务器上
hadoop102,hadoop103,hadoop104分别拷贝
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
(4):测试
在hadoop102上执行
ssh hadoop103
7:集群配置
注意机器把注释删掉,不然启动hdfs会报utf-8编码错误
(1):core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9820</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为atguigu -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>atguigu</value>
</property>
<!-- 配置该atguigu(superUser)允许通过代理访问的主机节点 -->
<property>
<name>hadoop.proxyuser.atguigu.hosts</name>
<value>*</value>
</property>
<!-- 配置该atguigu(superUser)允许通过代理用户所属组 -->
<property>
<name>hadoop.proxyuser.atguigu.groups</name>
<value>*</value>
</property>
<!-- 配置该atguigu(superUser)允许通过代理的用户-->
<property>
<name>hadoop.proxyuser.atguigu.groups</name>
<value>*</value>
</property>
</configuration>
(2):hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
(3):yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<!-- yarn容器允许分配的最大最小内存 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
<!-- yarn容器允许管理的物理内存大小 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<!-- 关闭yarn对物理内存和虚拟内存的限制检查 -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
(4):mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
8:配置分发
(1):分发
cd /opt/module/hadoop-3.1.3
my_rsync.sh etc/hadoop/
9:规划集群
hadoop102 namenode datanode nodemanager
hadoop103 resourcemanager datanode nodemanager
hadoop104 secondarynamenode datanode nodemanager
10:单个启动
(1)hadoop102
#首次启动HDFS需要对NameNode进行格式化操作
hdfs namenode -format
#hdfs启动namenode
hdfs --daemon start namenode
#hdfs启动datanode
hdfs --daemon start datanode
#yarn启动nodenodemanager
yarn --daemon start nodemanager
(2)hadoop103
#启动datanode
hdfs --daemon start datanode
#yarn启动resourcemanager
yarn --daemon start resourcemanager
#yarn启动nodenodemanager
yarn --daemon start nodemanager
(3)hadoop104
#启动datanode
hdfs --daemon start datanode
#启动secondarynamenode
hdfs --daemon start secondarynamenode
#yarn启动nodenodemanager
yarn --daemon start nodemanager
(4)web访问
I:hdfs
http://192.168.234.129:9870
II:yarn
http://192.168.234.130:8088
[
](http://192.168.234.130:8088)
11:单个关闭
(1)hadoop102
hdfs --daemon stop namenode
hdfs --daemon stop datanode
yarn --daemon stop nodemanager
(2)hadoop103
hdfs --daemon stop datanode
yarn --daemon stop resourcemanager
yarn --daemon stop nodemanager
(3)hadoop104
hdfs --daemon stop datanode
hdfs --daemon stop secondarynamenode
yarn --daemon stop nodemanager
12:群启/群停
前提:实现免密登录
(1):修改 hadoop安装目录下 etc/hadoop/workers 文件
原因:当执行群启/群停脚本的时候,首先会解析etc/hadoop/workers ,解析到的内容都是每一台机器的地址,脚本会自动执行在每一台机器上,启动 dn nm
workers内容为
hadoop102
hadoop103
hadoop104
(2):群启
start-dfs.sh
start-yarn.sh
(3):群停
stop-dfs.sh
stop-yarn.sh
(4):注意
启动hdfs的时候要在NameNode所在的机器执行脚本 启动yarn的时候要在resourcemanager所在的机器执行脚本
(5):自定义群启群停脚本
I:hadoop上新建my_cluster.sh
II:内容
#!/bin/bash
#参数校验
if [ $# -lt 1 ]
then
echo "参数不能为空!!!"
exit
fi
#根据参数的值进行 启停 操作
case $1 in
"start")
#启动操作
echo "===============start HDFS================="
ssh hadoop102 /opt/module/hadoop-3.1.3/sbin/start-dfs.sh
echo "===============start YARN================="
ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/start-yarn.sh
;;
"stop")
#停止操作
echo "===============stop HDFS================="
ssh hadoop102 /opt/module/hadoop-3.1.3/sbin/stop-dfs.sh
echo "===============stop YARN================="
ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/stop-yarn.sh
;;
*)
echo "ERROR!!!!"
;;
esac
(6):脚本启动,停止
my_cluster.sh start
my_cluster.sh stop
I:增加执行权限
chmod 777 my_cluster.sh
II:如果需要删除数据重新启动
#1:必须先清空各个节点的/data,/logs
#2:首次启动HDFS需要对NameNode进行格式化操作
hdfs namenode -format
13:测试集群
(1):web端上传下载
(2):api上传下载
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput
和本地不同,由于覆盖了core-site.xml的配置,所以上传到服务端
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9820</value>
</property>
(3):web端查看MR任务
(4):web端查看上传文件
I:查看
II:可下载
三:配置历史服务器
1:概念
历史服务器是针对MR执行历史记录
2:配置
vim mapred-site.xml
#进入到/opt/module/hadoop-3.1.3/etc/hadoop
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
3:启动历史服务器
mapred --daemon start historyserver
4:查看jobhistory
http://hadoop102:19888/jobhistory
5:web查看
四:日志聚集
查看MR日志
1:关闭hdfs,jobhistory
mapred --daemon stop historyserver
my_cluster.sh stop
2:配置yarn-site.xml
#进入到/opt/module/hadoop-3.1.3/etc/hadoop
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
3:分发配置
my_rsync.sh yarn-site.xml
4:启动hdfs,jobhistory
mapred --daemon start historyserver
my_cluster.sh start
5:重新执行WordCount程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput2
6:查看日志
五:集群时间同步
1:同步方式
找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间
2:时间服务器配置(必须root用户)
(1):查看所有节点ntpd服务状态和开机自启动状态
sudo systemctl status ntpd
sudo systemctl is-enabled ntpd
(2):在所有节点关闭ntpd服务和自启动
sudo systemctl stop ntpd
sudo systemctl disable ntpd
(3):修改hadoop102的ntp.conf配置文件(要将hadoop102作为时间服务器)
sudo vim /etc/ntp.conf
I:修改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
II:修改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
III:添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(4):修改hadoop102的/etc/sysconfig/ntpd
sudo vim /etc/sysconfig/ntpd
#增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(5):重新启动ntpd服务
sudo systemctl start ntpd
(6):设置ntpd服务开机启动
sudo systemctl enable ntpd
3:其他机器配置
(1):在其他机器配置10分钟与时间服务器同步一次
sudo crontab -e
#编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate hadoop102
(2):修改任意机器时间
sudo date -s "2017-9-11 11:11:11"
(3):一分钟后查看机器是否与时间服务器同步
sudo date