01 hadoop入门
1 大数据概念
1.1 大数据概念
大数据(Big Data)
● 指无法在一定时间范围内用常规工具捕捉、管理、处理的数据集合。
● 需要新处理模式才能具有鞥讫那个的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
主要解决
● 海量数据的存储、分析计算问题。
1.2 大数据特点
4V
● Volume(大量)
● Velocity(高速)
● variety(多样)
● value(低价值密度)
2 从Hadoop框架讨论大数据生态
2.1 Hadoop是什么
Hadoop
● Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
● 主要解决,海量数据的存储和海量数据的分析计算问题。
● 广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈。
2.2 Hadoop的优势
Hadoop的优势(4高)
● 高可靠性:Hadoop底层维护多个数据副本,即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。
● 高扩展性:在集群间分配任务数据,可方便的扩展数以千计的结点
● 高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。
● 高容错性:能够自动将失败的任务重新分配。
2.3 Hadoop组成(面试重点)
Hadoop 1.x 和 Hadoop 2.x 区别
● Hadoop 1.x:Mapreduce同时处理业务逻辑运算和资源调度,耦合性较大
● Hadoop 2.x:增加了Yarn,此时Mapreduce负责运算,Yarn负责资源调度
2.3.1 HDFS架构概述
NameNode(nn):
● 存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。
DataNode(dn):
● 在本地文件系统中存储文件块数据,以及块数据的校验和。
Secondary NameNode(2nn):
● 每隔一段时间对NameNode元数据备份。
2.3.2 YARN架构概述
执行流程
① client提交Job给ResourceManager,ResourceManager在启动ApplicationMaster(任务老大,项目组长)
② ApplicationMaster向ResourceManager申请资源(给我办公室,给我人,给我电脑)
③ ResourceManager就给ApplicationMaster资源,给的就是Container(相当于一个资源容器)
Resource Manager(RM)作用:
● 整个集群资源(内存、CPU等)的老大。(管理所有的NodeManager)
NodeManager(MM)作用:
● 单个节点服务器资源老大。(管理单个节点上的资源)
ApplicationMaster(Am)作用:
● 单个任务运行的老大。
Container
● 容器,相当一台独立的服务器,里面封装了任务运行所需的资源,如:内存、磁盘、网络等。
说明
● Job就是任务(程序),有几个Job就有几个ApplicationMaster
● 客户端可以有多个。
● 集群上可以运行多个ApplicationMaster。
● 每个NodeManager上可以有多个Countainer。
2.3.3 MapReduce架构概述
MapReduce将计算过程分为两个阶段:
● Map阶段并行处理输入数据。
● Reduce阶段对Map结果进行汇总。
2.3.4 HDFS、YARN、MapReduce三者关系
2.4 大数据技术生态体系
2.5 推荐系统框架图
3 Hadoop运行环境搭建(开发重点)
3.1 虚拟机环境准备
3.2 在102安装JDk
3.3 在102安装Hadoop
3.4 Hadoop目录结构
1)查看Hadoop目录结构
2)重要目录
● bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本。
● etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件。
● lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)。
● sbin目录:存放启动或停止Hadoop相关服务的脚本。
● share目录:存放Hadoop的依赖jar包、文档、和官方案例。
4 Hadoop运行模式
Hadoop运行模式
● 本地模式
● 伪分布模式
● 完全分布模式
4.1 本地运行模式(官方wordcount)
【案例】
(1) 在hadoop-3.1.3文件下面创建一个wcinput文件夹
# mkdir wcinput
(2) 在 wcinput 文件下创建一个 wc.input 文件,并使用 vim 进行编辑
# cd wcinput
# vim wc.input
hadoop yarn
hadoop mapreduce
atguigu
atguigu
(3) 回到Hadoop目录/opt/module/hadoop-3.1.3
(4) 执行程序
# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput wcoutput
(5) 查看结果
# cat wcoutput/part-r-00000
运行结果:
atguigu 2
hadoop 2
mapreduce 1
yarn 1
4.2 完全分布式运行模式(开发重点)
4.2.1 虚拟机准备
4.2.2 编写集群分发脚本 xsync
1)scp(secury copy)安全拷贝
scp定义:
scp可以实现服务器与服务器之间的数据拷贝。
基本语法:
scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 用户名@主机:目的路径/名称
【案例】
(1) 在hadoop102上,将hadoop102中/opt/software目录下的所有文件 拷贝到hadoop103上。
[atguigu@hadoop102 software]$ scp -r atguigu@hadoop103:/opt/software/* atguigu@hadoop104:/opt/software/
(2) 在hadoop103上,将hadoop102中/opt/software目录下的所有文件拷贝到hadoop103上。
[atguigu@hadoop103 software]$ scp -r atguigu@hadoop102:/opt/software/* /opt/software/
(3) 在hadoop102上,将hadoop103中/opt/software目录下的所有文件 拷贝到hadoop104上。
[atguigu@hadoop102 software]$ scp -r atguigu@hadoop103:/opt/software/* atguigu@hadoop104:/opt/software/
2)rsync远程同步工具
● rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:
● rsync做文件的复制要比scp的速度快。
● rsync只对差异文件做更新。
● scp是把所有文件都复制过去。
基本语法
rsync -av $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选型 要拷贝的文件路径/名称 用户名@主机:目的路径/名称
【案例】
(1) 把hadoop102机器上的/opt/software目录同步到hadoop103服务器的/opt/software目录
[atguigu@hadoop102 software]$ rsync -av /opt/software/ hadoop103:/opt/software/
3)xsync集群分发脚本
(1) 需求:循环复制文件到所有结点的相同目录下
(2) 需求分析:使用 rsync
(3) 脚本:xsync 要同步的文件名称
注意:
把脚本存放在 /home/atguigu/bin 目录下,atguigu用户可在任何地方使用。
(4) 脚本实现
在 /home/atguigu 目录下创建 hadoopshell 目录,然后在里面创建 xsync 文件, 再完成脚本。
# cd /home/atguigu
# mkdir hadoopshell
# cd hadoopshell
# vim xsync
xsync脚本
#!/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
● 修改脚本 xsync 具有执行权限
# chmod u+x xsync
● 将脚本移动到 /bin 中,以便全局调用
# sudo mv xsync /bin/
4.2.3 SSH无密登录配置
1)配置ssh
● 基本语法:
ssh 另一台电脑的ip (功能:远程登陆)
2)无密钥配置
(1) 免登录原理
(2) 生成公钥和私钥
# ssh-keygen -t rsa
后敲(三个回车),就会生成两个文件 id_rsa(私钥)、id_rsa.pub(公钥)。
(3) 将公钥拷贝到要免登录的目标机器上
# ssh-copy-id hadoop102
# ssh-copy-id hadoop103
# ssh-copy-id hadoop104
注意:
在 hadoop102 用 root 账号,配置一下无密登录到 hadoop102、hadoop103、hadoop104。
在 hadoop103 用 atguigu 账号,配置一下无密登录到 hadoop102、hadoop103、hadoop104。
3).ssh文件下(~/.ssh)的文件功能解释
known_hosts | 记录ssh访问过计算机的公钥(public key) |
id_rsa | 私钥 |
id_rsa.pub | 公钥 |
authorized_keys | 存放授权过的无密登录服务器公钥 |
4.2.4 集群配置
1) 集群部署规划
说明:
● NameNode和SecondaryNameNode不安装再同一服务器。
● ResourceManager很耗内存,不要和NameNode、SecondarNameNode配置在同一机器上。
● SecondaryNameNode可以对NameNode进行数据备份,当然不可以放一起咯,一个没了,另一个还在哦。
Hadoop102 | Hadoop103 | Hadoop104 | |
HDFS | NameNode | SecondaryNameNode | |
DataNode | DataNode | DataNode | |
YARN | ResourceManager | ||
NodeManager | NodeManager | NodeManager |
2) 配置集群
(1) 核心配置文件
● 在 /opt/module/hadoop-3.1.3/etc/hadoop/ 目录下,配置 core-site.xml。
# cd $HADOOP_HOME/etc/hadoop
# vim core-site.xml
文件内容
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!--指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 通过web界面操作hdfs的权限 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>atguigu</value>
</property>
<!-- 后面hive的兼容性配置 -->
<property>
<name>hadoop.proxyuser.atguigu.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.atguigu.groups</name>
<value>*</value>
</property>
</configuration>
(2) HDFS配置文件
● 在 /opt/module/hadoop-3.1.3/etc/hadoop/ 目录下,配置 hdfs-site.xml。
# vim hdfs-site.xml
文件内容
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
(3) YARN配置文件
● 在 /opt/module/hadoop-3.1.3/etc/hadoop/ 目录下,配置 yarn-site.xml。
# vim yarn-site.xml
文件内容
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 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>
<!-- 环境变量通过从NodeManagers的容器继承的环境属性,对于mapreduce应用程序,除了默认值 hadoop op_mapred_home应该被添加外。属性值 还有如下-->
<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在执行程序遇到超出虚拟内存限制,Container被kill -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 后面hive的兼容性配置 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
</configuration>
(4) MapReduce配置文件
● 在 /opt/module/hadoop-3.1.3/etc/hadoop/ 目录下,配置 mapred-site.xml。
# vim mapred-site.xml
文件内容
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
3)在集群上使用 xsync 分发配置好的Hadoop配置文件给Hadoop103,Hadoop104
# xsync /opt/module/hadoop-3.1.3/etc/hadoop/
4.2.5 群起集群
1)配置 workers
# vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
hadoop102
hadoop103
hadoop104
同步所有结点配置文件
# xsync /opt/module/hadoop-3.1.3/etc
2)启动集群
(1) 如果集群是第一次启动,需要在 hadoop102节点 格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)
# hdfs namenode -format
(2) 启动HDFS。 (由sbin目录中的start-dfs.sh进行启动)
# sbin/start-dfs.sh
(3) 在配置了ResourceManager的节点(hadoop103)启动YARN
# sbin/start-yarn.sh
(4) Web端查看SecondaryNameNode
浏览器中输入:http://hadoop104:9868/status.html
查看SecondaryNameNode信息
4.2.6 集群启动/停止方式总结
1)各个服务组件逐一启动/停止
● 分别启动/停止HDFS组件
# hdfs --daemon start/stop namenode/datanode/secondarynamenode
● 启动/停止YARN
# yarn --daemon start/stop resourcemanager/nodemanager
2)各个模块分开启动/停止(配置ssh是前提)常用
● 整体启动/停止HDFS
# start-dfs.sh / stop-dfs.sh
● 整体启动/停止YARN
# start-yarn.sh / stop-yarn.sh
4.2.7 配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
1)配置mapred-site.xml
# vi mapred-site.xml
文件内容
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>ha
2)分发配置
# xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
3)在Hadoop102启动历史服务器
# mapred --daemon start historyserver
4)查看历史服务器是否启动
# jps
5)查看JobHistory
http://hadoop102:19888/jobhistory
4.2.8 配置日志聚集功步骤如下
● 日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
● 日志聚集功能好处:可以方便的查看程序运行详情。
注意:
● 开启日志聚集功能,需要重启NodeManager、ResourceManager和HistoryManager。
1)配置 yarn-site.xml
# vim yarn-site.xml
文件内容
<!-- 开启日志聚集 -->
<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>
2)分发配置
# xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
3) 关闭NodeManager、ResourceManager和HistoryServer
在103上执行:stop-yarn.sh
在102上执行:mapred --daemon stop historyserver
4) 启动NodeManager、ResourceManager、Timelineserver和HistoryServer
在103上执行:start-yarn.sh
在103上执行:yarn --daemon start timelineserver
在102上执行:mapred --daemon start historyserver
5) 删除HDFS上已经存在的输出文件
# hdfs dfs -rm -R /user/atguigu/output
6) 执行 WordCount 程序
7) 查看日志
http://hadoop102:19888/jobhistory
4.2.9 集群时间同步
NTP(Network Time Protocol):网络时间协议,使用来使计算机时间同步化的一种协议。
1)时间服务器配置(必须root用户)
(1) 在102上关闭ntp服务和自启动。
# sudo systemctl stop ntpd
# sudo systemctl disable ntpd
(2) 修改ntp配置文件
# sudo vim /etc/ntp.conf
修改内容如下:
修改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
修改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
(3) 修改 /etc/sysconfig/ntpd 文件
# sudo vim /etc/sysconfig/ntpd
增加内容(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(4) 重启ntpd服务
# systemctl start ntpd
(5) 设置ntpd服务开机启动
# systemctl enable ntpd
2) 其他机器配置(必须root用户)
(1) 在其他机器配置10min与时间服务器同步一次
crontab -e
编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop102
(2) 修改任意机器时间
date -s "2011-11-11 11:11:11"
(3) 10min后查看机器是否与时间服务器同步
date