大数据 - Hadoop

Apache Hadoop概述

介绍

1、Apache软件基金会的一款开源软件

JAVA语言实现
允许用户使用简单的编程模型实现跨机器集群对海量数据进行分布式计算处理

2、Hadoop核心组件

Hadoop HDFS(分布式文件存储系统):解决海量数据存储
Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度
Hadoop MapReduce(分布式计算框架):解决海量数据计算

3、广义上Hadoop指的是围绕Hadoop打造的大数据生态圈

在这里插入图片描述

4、官网

点击进入

现状

HDFS作为分布式文件存储系统,处在生态圈的底层与核心地位;
YARN作为分布式通用的集群资源管理系统和任务调度平台,支撑各种计算引擎运行,保证Hadoop地址;
MapReduce作为大数据生态圈第一代分布式计算引擎,由于自身设计的模型所产生的弊端,导致企业一线几乎不再直接使用MapReduce进行编程,但是很多软件的底层依然在使用MapReduce引擎来处理数据。

特性优点

在这里插入图片描述

架构变迁

(1.0 - 2.0)

在这里插入图片描述

3.0架构组件和2.0类似,3.0更加着重于性能优化。

集群整体概括

Hadoop集群包括两个集群:HDFS集群YARN集群
两个集群逻辑上分离、通常物理上在一起
两个集群都是标准的主从架构集群

在这里插入图片描述

集群简介

在这里插入图片描述

理解

逻辑上分离:两个集群互相没有依赖、互不影响
物理上在一起:某些角色进程往往部署在同一台物理服务器上
MapReduce集群?MapReduce是计算框架、代码层面的组件 没有集群一说

Apache Hadoop安装部署

基础环境准备

FinalShell同时操作n台虚拟机

![

1、主机名(3台机器)

vim /etc/hostname

在这里插入图片描述

2、Hosts映射(3台机器)

vim /etc/hosts

在这里插入图片描述

3、防火墙关闭(3台机器)

systemctl stop firewalld.service # 关闭防火墙
systemctl disable firewalld.service # 禁止访问防火墙

4、ssh免密登录(node1执行 -> node1 | node2 | node3)

ssh-keygen # 4个回车 生成公钥、私钥
ssh-copy-id node1、ssh-copy-id node2、ssh-copy-id node3 # 连接

5、集群时间同步(3台机器)

yum -y install ntpdate
ntpdate ntp4.aliyun.com

在这里插入图片描述

6、创建统一工作目录(3台机器)

mkdir -p /export/server/ # 软件安装路径
mkdir -p /export/data/ # 数据存储路径
mkdir -p /export/software/ # 安装包存放路径

在这里插入图片描述

传统安装

1、JDK 1.8安装(3台机器)

(1)下载

网址:https://www.oracle.com/java/technologies/downloads

(2)上传、解压
tar -zxvf xxx.tar.gz

在这里插入图片描述

(3)配置JDK软连接
ln -s /export/server/jdk1.8.0_411 /export/server/jdk
(4)配置环境变量
# 1.进入
vim /etc/profile
# 2.在最后填入jdk配置
export JAVA_HOME=/export/server/jdk
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 3.重新加载环境变量文件
source /etc/profile

在这里插入图片描述

(5)远程拷贝到其他两台机器
# 拷贝jdk
scp -r /export/server/jdk1.8.0_411 root@node2:/export/server/
# 拷贝配置文件
scp -r /etc/profile root@node2:/etc/

2、上传、解压Hadoop安装包(node1)

网址:https://hadoop.apache.org/releases.html

在这里插入图片描述

在这里插入图片描述

cd /export/server
tar -zxvf xxx.tar.gz

在这里插入图片描述

3、配置文件概括

官方文档:https://hadoop.apache.org/docs/r3.3.0/
第一类1个:hadoop-env.sh
第二类4个:xxxx-site.xml,site表示的是用户定义的配置,会覆盖default中默认配置。

core-site.xml 核心模块配置
hdfs-site.xml hdfs文件系统模块配置
mapred-site.xml MapReduce模块配置
yarn-site.xml yarn模块配置

第三类1个:workers
所有的配置文件目录:/export/server/%HADOOP_HOME%/etc/hadoop

4、修改配置文件

(1)hadoop-env.sh
# 文件最后添加
export JAVA_HOME=/export/server/jdk
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
(2)core-site.xml
<!-- 设置默认使用的文件系统Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系统 -->
<property>
	<name>fs.defaultFS</name>
	<value>hdfs://node1:8020</value>
</property>

<!-- 设置Hadoop本地保存数据路径 -->
<property>
	<name>hadoop.tmp.dir</name>
	<value>/export/data/hadoop-3.3.6</value>
</property>

<!-- 设置HDFS web UI用户身份 -->
<property>
	<name>hadoop.http.staticuser.user</name>
	<value>root</value>
</property>

<!-- 整合hive 用户代理设置 -->
<property>
	<name>hadoop.proxyuser.root.hosts</name>
	<value>*</value>
</property>

<property>
	<name>hadoop.proxyuser.root.groups</name>
	<value>*</value>
</property>

<!-- 文件系统垃圾桶保存时间 -->
<property>
	<name>fs.trash.interval</name>
	<value>1440</value>
</property>
(3)hdfs-site.xml
<!-- 设置SNN进程运行机器位置信息 -->
<property>
	<name>dfs.namenode.secondary.http-address</name>
	<value>node2:9868</value>
</property>
(4)mapred-site.xml
<!-- 设置MR程序默认运行模式:yarn集群模式 local本地模式 -->
<property>
	<name>mapreduce.framework.name</name>
	<value>yarn</value>
</property>

<!-- MR程序历史服务地址 -->
<property>
	<name>mapreduce.jobhistory.address</name>
	<value>node1:10020</value>
</property>

<!-- MR程序历史服务器web端地址 -->
<property>
	<name>mapreduce.jobhistory.webapp.address</name>
	<value>node1:19888</value>
</property>

<property>
	<name>yarn.app.mapreduce.am.env</name>
	<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

<property>
	<name>mapreduce.map.env</name>
	<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

<property>
	<name>mapreduce.reduce.env</name>
	<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
(5)yarn-site.xml

yarn.resourcemanager.address不行就改为yarn.resourcemanager.hostname

<!-- MR程序历史服务器web端地址 -->
<property>
	<name>yarn.resourcemanager.address</name>
	<value>node1</value>
</property>

<property>
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle</value>
</property>

<!-- 是否将对容器实施物理内存限制 -->
<property>
	<name>yarn.nodemanager.pmem-check-enabled</name>
	<value>false</value>
</property>

<!-- 是否将对容器实施虚拟内存限制 -->
<property>
	<name>yarn.nodemanager.vmem-check-enabled</name>
	<value>false</value>
</property>

<!-- 开启日志聚集 -->
<property>
	<name>yarn.log-aggregation-enable</name>
	<value>true</value>
</property>

<!-- 设置yarn历史服务器地址 -->
<property>
	<name>yarn.log.server.url</name>
	<value>http://node1:19888/jobhistory/logs</value>
</property>

<!-- 历史日志保存的时间 7天 -->
<property>
	<name>yarn.log-aggregation.retain-seconds</name>
	<value>604800</value>
</property>
(6)workers
node1.itcast.cn
node2.itcast.cn
node3.itcast.cn

5、分发同步hadoop安装包

cd /export/server

scp -r hadoop-3.3.6 root@node2:$PWD
scp -r hadoop-3.3.6 root@node3:$PWD

6、将hadoop添加到环境变量(3台机器)

# 1.进入
vim /etc/profile
# 2.在配置文件中写入
export HADOOP_HOME=/export/server/hadoop-3.3.6
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 3.重启
source /etc/profile
# 4.scp给其他两台机器

7、Hadoop集群启动

(1)(首次启动)格式化namenode

只需要在node1执行

hdfs namenode -format

在这里插入图片描述

(2)shell脚本一键启动

在node1上,使用软件自带的shell脚本一键启动。前提:配置好机器之间的SSH免密登录和workers文件。
HDFS集群

start-dfs.sh
stop-dfs.sh

YARN集群

start-yarn.sh
stop-yarn.sh

Hadoop集群(使用这个上面俩就不需要了

start-all.sh
stop-all.sh

(3)查看hadoop进程
jps

在这里插入图片描述

8、查看

(1)HDFS

地址:http://namenode_host:9870

其中name_host是namenode运行所在机器的主机名或者ip
如果使用主机名访问,别忘了在windows配置hosts

在这里插入图片描述
查看小弟
在这里插入图片描述
在这里插入图片描述

HDFS重要的地方
在这里插入图片描述

在这里插入图片描述

(2)YARN集群

地址:http://resourcemanager_host:8088

其中resourcemanager_host是resourcemanager运行所在机器的主机名或者ip

在这里插入图片描述

9、初体验

HDFS

shell命令操作

hadoop fs -mkdir /itcast # 在HDFS中创建一个文件夹,名叫itcast
hadoop fs -put zookeeper.out /itcast # 把本地文件(zookeeper.out)上传到itcast文件夹内
hadoop fs -ls / # 查看HDFS中所有文件
在这里插入图片描述

Web UI 页面操作

在这里插入图片描述

MapReduce + YARN 初体验

执行Hadoop官方自带的MapReduce案例,评估圆周率Π的值。

cd /export/server/hadoop-3.3.6/share/hadoop/mapreduce/
hadoop jar hadoop-mapreduce-example-3.3.6.jar pi 2 4

在这里插入图片描述
在这里插入图片描述

HDFS精讲

HDFS介绍

简介

HDFS(Hadoop Distributed File System),意为:Hadoop分布式文件系统
HDFS是Apache Hadoop的核心组件之一,作为大数据生态圈最底层的分布式存储服务而存在。也可以说大数据首先要解决的问题就是海量数据的存储问题。
HDFS主要是解决大数据如何存储问题的。分布式意味着HDFS是横跨在多台计算机上的存储系统。
HDFS是一种能够在普通硬件上运行的分布式文件系统,它是高度容错的,适应于具有大数据集的应用程序,它非常适于存储大型数据(比如TB和PB)。
HDFS使用多台计算机存储文件,并且提供统一的访问接口,像是访问一个普通文件系统一样使用分布式文件系统。
在这里插入图片描述

设计目标

硬件故障(Hardware Failure)是常态,HDFS可能有成百上千的服务器组成,每一个组件都有可能出现故障。因此故障检测和自动快速恢复是HDFS的核心架构目标。
HDFS上的应用主要是以流式读取数据(Streaming Data Access)。HDFS被设计成用于批处理,而不是用户交互式的。相较于数据访问的反应时间,更注重数据访问的高吞吐量
典型的HDFS文件大小是GB到TB级别的。所以,HDFS被调整成支持大文件(Large Data Sets)。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。
大部分HDFS应用对文件要求的是write-one-read-many访问模型。一个文件一旦创建、写入、关闭之后就不需要修改了。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。
移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效。将计算移动到数据附近,比之将数据移动到应用所在显然更好。
HDFS被设计为可从一个平台轻松移植到另一个平台。这有助于将HDFS广泛用作大量应用程序的首选平台。

应用场景

在这里插入图片描述

重要特性

(1)主从架构

HDFS集群是标准的master/slave主从架构集群。
一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成。
Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
官方架构图是一主五从模式,其中五个从角色位于两个机架(Rack)的不同服务器上。
在这里插入图片描述

(2)分块存储

HDFS中的文件在物理上是分块存储(blok)的,默认大小是128M(134217728),不足128M则本身就是一块。
块的大小可以通过配置参数来规划,参数位于hdfs-default.xml中:dfs.blocksize。
在这里插入图片描述

(3)副本机制

文件的所有block都会有副本。副本系数可以在文件创建的时候指定,也可以在之后通过命令改变。
副本数由参数dfs.replication控制,默认是3,也就是会额外再复制2份,连同本身总共3份副本。

(4)元数据(记录数据的数据)管理

在HDFS中,Namenode管理的元数据具有两种类型:

文件自身属性信息

文件名称、权限、修改时间、文件大小、复制因子、数据块大小。
在这里插入图片描述

文件块位置映射信息

记录文件快和DataNode之间的映射信息,即哪个块位于哪个节点上。在这里插入图片描述

(5)namespace(命名空间)

HDFS支持传统的层次型文件组织结构。用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
Namenode负责维护文件系统的namespace命名空间,任何对文件系统名称空间或属性的修改都将被Namenode记录下来。(Namenode的Name就是namespace的缩写)
HDFS会给客户提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。

(6)数据块存储

文件的各个block的具体存储管理由DataNode节点承担
每一个block都可以在多个DataNode上存储。

HDFS Shell命令

官方指导文档:点击跳转

介绍

命令行界面(英语:command-line interface,缩写:CLI),是指用户通过键盘输入指令,计算机接收到指令后,予以执行一种人际交互方式。
Hadoop提供了文件系统的shell命令行客户端:hadoop fs [generic options]

文件系统协议

HDFS Shell CLI 支持操作多种文件系统,包括本地文件系统(file:///)、分布式文件系统(hdfs://node1:8020)等
具体操作的是什么文件系统取决于命令中文件路径URL中的前缀协议
如果没有指定前缀,则将会读取环境变量中的fs.defaultFS属性,以该属性值作为默认文件系统。
在这里插入图片描述

1、创建文件夹

hadoop fs -mkdir [-p] <path> ...

path为待创建目录
-p 选项的行为与Unix mkdir -p 非常相似,它会沿着路径创建父目录

2、查看指定目录下内容

hadoop fs -ls [-h] [-R] [<path> ...]

path 指定目录路径
-h 人性化显示文件size
-R 递归查看指定目录及其子目录

3、上传文件到HDFS指定目录下

hadoop fs -put [-f] [-p] <localsrc> ... <dst>

-f 覆盖目标文件(已存在下)
-p 保留访问和修改时间,所有权和权限
localsrc 本地文件系统(客户端所在机器)
dst 目标文件系统(HDFS)

hadoop fs -put zookeeper.out /itcast

hadoop fs -put file:///etc/profile hdfs://node1:8020/itcast

4、查看HDFS文件内容

hadoop fs -cat <src> ...

读取指定文件全部内容,显示在标准输出控制台
注意:对于大文件内容读取,慎重

5、下载HDFS文件

hadoop fs -get [-f] [-p] <src> ... <localdst>

下载文件到本地文件系统指定目录,localdst必须是目录
-f 覆盖目标文件(已存在下)
-p 保留访问和修改时间,所有权和权限

# 下载itcast文件夹下的1.txt到当前文件夹内,并改名为666.txt
hadoop fs -get /itcast/1.txt ./666.txt

6、拷贝HDFS文件

hadoop fs -cp [-f] <src> ... <dst>

-f 覆盖目标文件(已存在下)

7、追加数据到HDFS文件中

hadoop fs -appendToFile <localsrc> ... <dst>

将所有给定本地文件的内容追加到给定dst文件
dst如果文件不存在,将创建该文件
如果为 - ,则输入为从标准输入中读取

hadoop fs -appendToFile 2.txt 3.txt /itcast/1.txt

8、HDFS数据移动操作

hadoop fs -mv <src> ... <dst>

移动文件到指定文件夹下
可以使用该命令移动数据,重命名文件的名称

HDFS工作流程与机制

HDFS集群角色与职责

主角色:namenode (需要大内存)

NameNode是Hadoop分布式文件系统的核心,架构中的主角色。
NameNode维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息。
基于此,NameNode成为了访问HDFS的唯一入口
NameNode内部通过内存磁盘文件两种方式管理元数据。
其中磁盘上的元数据文件包括Fsimage内存元数据镜像文件和edits log(Journal)编辑日志。
在这里插入图片描述

从角色:datanode(需要大磁盘)

DataNode是Hadoop HDFS中的从角色,负责具体的数据块存储
DataNode的数量决定了HDFS集群的整体数据存储能力。通过NameNode配合维护着数据块。
在这里插入图片描述

主角色辅助角色:secondarynamenode

Secondary NameNode 充当NameNode的辅助节点,但不能替代NameNode。
主要是帮助主角色进行元数据文件的合并动作。可以通俗的理解为主角色的"秘书"。
在这里插入图片描述

MapReduce

MapReduce的来世今生

理解MapReduce思想

MapReduce 的思想核心是先分再合,分而治之
所谓"分而治之"就是把一个复杂的问题,按照一定的"分解"方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的结果,然后把各部分的结果组成整个问题的最终结果
这种思想来源于日常生活与工作时的经验。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想,而不是自己原创。

Map表示第一阶段,负责"拆分":即把复杂的任务分解为若干个"简单的子任务"来并行处理。可以进行拆分的前提式这些小任务可以并行计算,彼此间几乎没有依赖关系
Reduce表示第二阶段,负责"合并":即对map阶段的结果进行全局汇总。
这两个阶段合起来正是MapReduce思想的体现。
在这里插入图片描述

分布式计算概念

分布式计算是一种计算方法,和集中式计算是相对的。
随着计算技术的发展,有些应用需要非常巨大的计算能力才能完成,如果采用集中式计算,需要耗费相当长的时间来完成。
分布式计算将该应用分解成许多小部分,分配给多台计算机进行处理。这样可以节约整体计算时间,大大提高计算效率。
在这里插入图片描述

MapReduce介绍

Hadoop MapReduce是一个分布式计算框架,用于轻松编写分布式应用程序,这些应用程序以可靠,容错的方式并行处理大型硬件集群(数千个节点)上的大量数据(多TB数据集)。
MapReduce是一种面向海量数据处理的一种指导思想,也是一种用于对大规模数据进行分布式计算的编程模型。

MapReduce特点

高容错性

Hadoop集群是分布式搭建和部署的,任何单一机器节点宕机了,它可以把上面的计算任务转移到另一个节点上运行,不影响整个作业任务的完成,过程完全是由Hadoop内完成的。

适合海量数据的离线处理

可以处理GB、TB和PB级别的数据量

MapReduce实例进程

一个完整的MapReduce程序在分布式运行时有三类

MRAppMaster:负责整个MR程序的过程调度及状态协调
MapTask:负责map阶段的整个数据处理流程
ReduceTask:负责reduce阶段的整个数据处理流程

阶段组成

一个MapReduce编程模型中只能包含一个Map阶段和一个Reduce阶段,或者只有Map阶段
不能有诸如多个map阶段、多个reduce阶段的情景出现
如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序串行运行
在这里插入图片描述

MapReduce官当示例

评估圆周率Π(PI)的值

运行MapReduce程序评估一下圆周率的值,执行中可以去YARN页面上观察程序的执行的情况

第一个参数:pi表示MapReduce程序执行圆周率计算任务
第二个参数:用于指定map阶段运行的任务task次数,并发度,这里是10
第三个参数:用于指定每个map任务取样的个数,这里是50

hadoop jar hadoop-mapreduce-examples-3.3.6.jar pi 10 50

wordcount单词词频统计

WordCount算是大数据计算领域经典的入门案例,相当于Hello World
虽然WorldCount业务及其简单,但是希望能够通过案例感受背后MapReduce的执行流程和默认的行为机制,这才是关键
在这里插入图片描述

编程实现思路

map阶段的核心:把输入的数据经过切割,全部标记1,因此输出就是<单词,1>
shuffle阶段核心:经过MR程序内部自带默认的排序分组等功能,把key相同的单词会作为一组数据构成新的kv对
reduce阶段核心:处理shuffle完的一组数据,该组数据就是该单词所有的键值对。对所有的1进行累加求和,就是单词的总次数。
在这里插入图片描述

整体执行流程图

在这里插入图片描述

Map阶段执行过程

第一阶段:把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切片规划

默认Split size = Block size(128M),每一个切片由一个MapTask处理(getSplits)

第二阶段:对切片中的数据按照一定的规则读取解析返回<key, value>对

默认是按行读取数据。key是每一行的起始位置偏移量,value是本行的文本内容。(TextInputFormat)

第三阶段:调用Mapper类中的map方法处理数据

每读取解析出来一个<key,value>,调用一次map方法

第四阶段:按照一定的规则对Map输出的键值对进行分区partition

默认不分区,因为只有一个reducetask。分区的数量就是reducetask运行的数量

第五阶段:Map输出数据写入内存缓冲区,达到比例溢出到磁盘上。

溢出spill的时候根据key进行排序sort>。默认根据key字典序排序

第六阶段:对所有溢出文件进行最终的merge合并,成为一个文件
·

在这里插入图片描述

Reduce阶段执行过程

第一阶段:ReduceTask会主动从MapTask复制拉取属于需要自己处理的数据。
第二阶段:把拉取来数据,全部进行合并merge,即把分散的数据合并成一个大的数据。再对合并后的数据排序
第三阶段是对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法。最后把这些输出的键值对
写入到HDFS文件中。
在这里插入图片描述

shuffle概念

Shuffle的本意是洗牌、混洗的意思,把一组有规则的数据尽量打乱成无规则的数据。
而在MapReduce中,Shuffle更像是洗牌的逆过程,指的是将map端的无规则输出按指定的规则“打乱”成具有一 定规则的数据,以便reduce端接收处理
一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle
在这里插入图片描述

Map端Shuffle

Collect阶段:将MapTask的结果收集输出到默认大小为100M的环形缓冲区,保存之前会对key进行分区的计算,
默认Hash分区。
Spill阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序。
Merge阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。
在这里插入图片描述

Reduce端的shuffle

Copy阶段: ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据。
Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。
Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,
ReduceTask只需保证Copy的数据的最终整体有效性即可。
在这里插入图片描述

shuffle机制弊端

Shuffle是MapReduce程序的核心与精髓,是MapReduce的灵魂所在。
Shuffle也是MapReduce被诟病最多的地方所在。MapReduce相比较于Spark、Flink计算引擎慢的原因,跟
Shuffle机制有很大的关系。
Shuffle中频繁涉及到数据在内存、磁盘之间的多次往复

YARN

YARN介绍

YARN简介

Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的Hadoop资源管
理器。
YARN是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度。
它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
在这里插入图片描述

YARN功能说明

资源管理系统:集群的硬件资源,和程序运行相关,比如内存CPU等。
调度平台:多个程序同时申请计算资源如何分配,调度的规则(算法)。
通用:不仅仅支持MapReduce程序,理论上支持各种计算程序。YARN不关心你干什么,只关心你要资源,在有的情况下给你,用完之后还我。

YRAN概括

可以把Hadoop YARN理解为相当于一个分布式的操作系统平台,而MapReduce等计算程序则相当于运行于操作
系统之上的应用程序,YARN为这些程序提供运算所需的资源(内存、CPU等)。
Hadoop能有今天这个地位,YARN可以说是功不可没。因为有了YARN ,更多计算框架可以接入到 HDFS中,而不单单是 MapReduce,正是因为YARN的包容,使得其他计算框架能专注于计算性能的提升
HDFS可能不是最优秀的大数据存储系统,但却是应用最广泛的大数据存储系统, YARN功不可没。

Hadood YRAN 架构、组件

官方架构图中出现的概念

在这里插入图片描述

在这里插入图片描述

YARN3大组件

ResourceManager(RM)

YARN集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者
接收用户的作业提交,并通过NM分配、管理各个机器上的计算资源。

NodeManager(NM)

YARN中的从角色,一台机器上一个,负责管理本机器上的计算资源
根据RM命令,启动Container容器、监视容器的资源使用情况。并且向RM主角色汇报资源使用情况。

ApplicationMaster(AM)

用户提交的每个应用程序均包含一个AM。
应用程序内的“老大” n,负责程序内部各阶段的资源申请,监督程序的执行情况。

程序提交YARN交互流程

MR作业提交 Client–>RM
资源的申请 MrAppMaster–>RM
MR作业状态汇报 Container(Map|Reduce Task)–>Container(MrAppMaster)
节点的状态汇报 NM–>RM

整体概括

当用户向YARN中提交一个应用程序后,YARN将分成两个阶段运行该应用程序。

第一阶段是客户端申请资源启动运行本次程序的ApplicationMaster
第二个阶段是由Application根据本次程序内部具体情况,为它申请资源,并监控它的整个运动过程,直到运行完成。

在这里插入图片描述

第一步、 用户通过客户端向YARN中ResourceManager提交应用程序(比如:hadoop jar 提交MR程序);
第二步、 ResourceManager为该应用程序分配第一个Container(容器),并与对应的NodeManager通信,要求它在这个Container中启动这个应用程序的ApplicationMaster。
第三步、 ApplicationMaster启动成功之后,首先向ResourceManager注册并保持通信,这样用户可以直接通过ResourceManager查看应用程序的运行状态(处理了百分之几);
第四步、 AM为本次程序内部的各个Task任务向RM申请资源,并监控它的运行状态;
第五步、一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求它启动任务;
第六步、 NodeManager 为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务;
第七步、各个任务通过某个 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,以让 ApplicationMaster 随
时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过
RPC 向 ApplicationMaster 查询应用程序的当前运行状态
第8步、应用程序运行完成后,ApplicationMaster 向 ResourceManager 注销并关闭自己。

数据仓库基础与Apache Hive入门

数据仓库

数仓概念

数据仓库(英语:Data Warehouse,简称数仓DW),是一个用于存储、分析、报告的数据系统
数据仓库的的目的是构建面向分析的集成化数据环境,分析结果为企业提供决策支持(Decision Support)

数仓专注分析

数据仓库本身并不"生产"任何数据,其数据来源于不同外部系统;
同时数据仓库自身也不需要"消费"任何的数据,其结果开放给各个外部应用使用;
这也是为什么叫“仓库“,而不叫”工厂“的原因
在这里插入图片描述

数据仓库主要特征

在这里插入图片描述

集成性

主题相关的数据通常会分布在多个操作型系统中,彼此分散、独立、异构
因此在数据进行数据仓库之前,必然要经过统一与综合,对数据进行抽取、清理、转换和汇总,这一步是数据仓库建设中最关键、最复杂的一步,所要完成的工作有:

统一数据中所有矛盾之处

如字段的同名异义、异名同义、单位不统一、字长不一致等等。

进行数据综合和计算

数据仓库中的数据综合工作可以在原有

Apache Hive简介

概述

Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL),用于访问和分析存储在Hadoop文件中的大型数据集。
Hive核心是将HQL转换为MapReduce程序,然后将程序提交到Hadoop集群执行。
Hive由Facebook实现并开源。
在这里插入图片描述

为什么使用Hive

使用Hadoop MapReduce直接处理数据所面临的问题

人员学习成本太高 需要掌握java语言
MapReduce实现复杂查询逻辑开发难度太大

使用Hive处理数据的好处

操作接口采用类SQL的语法,提供快速开发的能力(简单、容易上手
避免直接写MapReduce,减少开发人员的学习成本
支持自定义函数,功能扩展很方便
背靠Hadoop,擅长存储分析海量数据集

Hive和Hadoop的关系

从功能来说,数据仓库软件,至少需要具备下述两种能力:

存储数据的能力、分析数据的能力

Apache Hive作为一款大数据时代的数据仓库软件,当然也具备上述两种能力。只不过Hive并不是自己实现了上述两种能力,而是借助Hadoop

Hive利用HDFS存储数据,利用MapReduce查询分析数据

这样突然发现Hive没啥用,不过是套壳Hadoop罢了。其实不然,Hive的最大魅力在于用户专注于编写HQL,Hive帮您转换成为MapReduce程序完成对数据的分析

Hive架构图

用户接口

包括CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议。WebGUI是通过浏览器访问Hive。
在这里插入图片描述

元数据存储

通常是存储在关系数据库如mysql/derby中。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性,表的数据所在目录等。
在这里插入图片描述

Driver驱动程序,包括语法解析器、计划编译器、优化器、执行器

完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有执行引擎调用执行。
在这里插入图片描述

执行引擎

Hive本身并不直接处理数据文件。而是通过执行引擎处理。当下Hive支持MapReduce、Tez、Spark3种执行引擎。
在这里插入图片描述

Hive元数据

简介

元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
在这里插入图片描述

Hive Metadata

Hive Metadata即Hive的元数据
包含用Hive创建的database、table、表的位置、类型、属性,字段顺序类型等元信息。
元数据存储在关系型数据库中。如hive内置Derby、或者第三方如MySQL等

Hive Metastore

Metastore即元数据服务。Metastore服务的作用是管理metadata元数据,对外暴露服务地址,让各种客户端通过连接metastore服务,由metastore再去连接MySQL数据库来存取元数据。
有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore服务即可。某种程度上也保证了hive元数据的安全。
在这里插入图片描述

metastore配置方式

metastore服务配置有3种模式:内嵌模式、本地模式、远程模式
区分3种配置方式的关键是弄清楚两个问题:

Metastore服务是否需要单独配置、单独启动?
Metadata是存储在内置的derby中,还是第三方RDBMS,比如MySQL。

本文使用企业推荐模式--远程模式部署
在这里插入图片描述

metastore远程模式

在生产环境中,建议用远程模式来配置Hive Metastore。在这种情况下,其他依赖Hive的软件都可以通过Metastore访问hive。由于还可以完全屏蔽数据库层,因此这也带来了更好的可管理性/安全性。
在这里插入图片描述

Hive安装部署

安装前准备

由于Apache Hive是一款基于Hadoop的数据仓库软件,通常部署运行在Linux系统之上。因此不管使用何种方式配置Hive Metastore,必须要先保证服务器的基础环境正常,Hadoop集群健康可用。
服务器基础环境

集群时间同步、防火墙关闭、主机Host映射、免密登录、JDK安装

Hadoop集群健康可用

启动Hive之前必须先启动Hadoop集群。特别要注意,需等待HDFS安全模式关闭之后再启动运行Hive
Hive不是分布式安装运行的软件,其分布式的特性主要借由Hadoop完成。包括分布式存储、分布式计算。

Hadoop与Hive整合

因为Hive需要把数据存储在HDFS上,并且通过MapReduce作为执行引擎处理数据;
因此需要在Hadoop种添加相关配置属性,以满足Hive在Hadoop上运行。
修改Hadoop中core-site.xml,并且Hadoop集群同步配置文件,重启生效。
在这里插入图片描述

一、MySQL安装

MySQL只需要在一台机器安装并且需要授权远程访问。
本文使用docker安装

1、docker下载

yum install -y docker

2、开启服务

systemctl start docker.service

3、配置下载加速

## 编辑文件
vim /etc/docker/daemon.json
## 填写内容,[]里的内容为阿里云容器中的,一个人有一个,这是我自己的
{
  "registry-mirrors": ["xxx"]
}
## 重启
sudo systemctl daemon-reload
sudo systemctl restart docker

4、拉取

docker pull mysql:5.7

5、查看本地镜像

docker images

6、新建mysql容器实例

docker run -d \
-p 3306:3306 \
--privileged=true \
-v /export/data/mysql/log:/var/log/mysql \
-v /export/data/mysql/data:/var/lib/mysql \
-v /export/data/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql \
mysql:5.7

7、新建my.cnf

## 进入宿主机配置文件地
cd /export/data/mysql/conf/

## 新建文件
vim my.cnf

## 添加内容
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8

## 查看
cat my.cnf

8、重启mysql

docker restart mysql

9、进入容器内部查看字符集

## 进入容器
docker exec -it mysql /bin/bash

## 进入mysql, 密码为123456
mysql -u root -p

## 查看字符集
SHOW VARIABLES LIKE 'character%';

二、Hive安装部署(noed1安装即可)

1、下载安装包

点击打开官网
点击下载

2、上传压缩包 - 解压

tar -zxvf apache-hive-3.1.3-bin.tar.gz

3、解决Hive与Hadoop之间guava版本差异

## 进入
cd /export/server/apache-hive-3.1.3-bin

## 删除
rm -rf lib/guava-19.0.jar

## 把hadoop的复制过来
cp /export/server/hadoop-3.3.6/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/

4、修改配置文件

hive-env.sh
## 进入conf
cd /export/server/apache-hive-3.1.3-bin/conf
## 改名
mv hive-env.sh.template hive-env.sh

## 进入hive-env.sh
vim hive-env.sh
## 添加以下内容
export HADOOP_HOME=/export/server/hadoop-3.3.6
export HIVE_CONF_DIR=/export/server/apache-hive-3.1.3-bin/conf
export HIVE_AUX_JARS_PATH=/export/server/apache-hive-3.1.3-bin/lib
hive-site.xml
vim hive-site.xml
<configuration>
<!-- 存储元数据mysql相关配置 -->
<property>
	<name>javax.jdo.option.ConnectionURL</name>
	<value>jdbc:mysql://node1:3306/hive3?createDatabaseIfNotExist=true&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
</property>

<property>
	<name>javax.jdo.option.ConnectionDriverName</name>
	<value>com.mysql.jdbc.Driver</value>
</property>

<property>
	<name>javax.jdo.option.ConnectionUserName</name>
	<value>root</value>
</property>

<property>
	<name>javax.jdo.option.ConnectionPassword</name>
	<value>123456</value>
</property>

<!-- H2S运行绑定host -->
<property>
	<name>hive.server2.thrift.bind.host</name>
	<value>node1</value>
</property>

<!-- 远程模式部署metastore metastore地址 -->
<property>
	<name>hive.metastore.uris</name>
	<value>thrift://node1:9083</value>
</property>

<!-- 关闭元数据存储授权 -->
<property>
	<name>hive.metastore.event.db.notification.api.auth</name>
	<value>false</value>
</property>
</configuration>
5、上传mysql jdbc驱动到hive安装包lib下
mysql-connection-java-5.1.32.jar
6、初始化元数据
cd /export/server/apache-hive-3.1.3-bin/

bin/schematool -initSchema -dbType mysql -verbos
# 初始化成功会在mysql中创建74张表
7、在hdfs创建hive存储目录(如存在则不用操作)
hadoop fs -mkdir /tmp
hadoop fs -mkdir -p /user/hive/warehouse
hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /user/hive/warehouse
8、metastore服务启动方式
(1)前台启动,进程会一直占据终端(不建议使用),ctrl+c结束进程,服务关闭。

可以根据需求添加参数开启debug日志,获取详细日志信息,便于排错

## 前台启动 关闭ctrl+c
/export/server/apache-hive-3.1.3-bin/bin/hive --service metastore

## 前台启动开启debug日志
/export/server/apache-hive-3.1.3-bin/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console

## 后台启动 进程挂起 关闭使用(1)jps (2)kill -9 [PID]
(2)后台启动,输出日志信息在/root目录下nohup.out
nohup /export/server/apache-hive-3.1.3-bin/bin/hive --service metastore &

# 后台挂起启动 结束进程
使用jps查看进程, 使用kill -9 [PID] 杀死进程

# nohup 命令,在默认情况下(非重定向时),会输出一个名叫nohup.out的文件到当前目录下

# 动态查看日志
tail -f nohup.out

在这里插入图片描述

三、客户端

(1)Hive自带客户端

bin/hive、bin/beeline
Hive发展至今,总共经历了两代客户端工具。

第一代客户端(deprecated不推荐使用):$HIVE_HOME/bin/hive,是一个shellUtil。主要功能:一是可用于以交互或批处理模式运行Hive查询;二是用于Hive相关服务的启动,比如metastore服务。

第二代客户端(recommended推荐使用):$HIVE_HOME/bin/beeline,是一个JDBC客户端,是官方强烈推荐使用的Hive命令行工具,和第一代客户端相比,性能加强安全性提高。
在这里插入图片描述

HiveServer2服务介绍

远程模式下beeline通过Thrift连接到单独的HiveServer2服务上,这也数是官方推荐在生产环境中使用的模式。
HiveServer2支持多客户端的并发和身份认证,旨在为开放API客户端如JDBC、ODBC提供更好的支持。

关系梳理

HiveServer2通过Metastore服务解读元数据。所以在远程模式下,启动HiveServer2之前必须先启动metastore服务。
特别注意:远程模式下,Beeline客户端只能通过HiveServer2服务访问Hive。而bin/hive是通过Metastore服务访问的。
在这里插入图片描述

bin/beeline客户端使用

在hive安装的服务器上,首先启动metastore服务,然后启动hiveserver2服务

# 如果bin目录下有nohup.out,则删除
rm -rf nohup.out

# 启动元数据
nohup /export/server/apache-hive-3.1.3-bin/bin/hive --service metastore &

# 启动hiveserver2
nohup /export/server/apache-hive-3.1.3-bin/bin/hive --service hiveserver2 &

# jps查看进程,应该有两个RunJar(一个是元数据metastore, 一个是hiveserver2)
# 如果有三个RunJar,则kill -9 [PID]都删除,然后重新启动metastore和hiveserver2
jps
模拟远程连接
  • 首先把node1的hive文件夹复制到node3上
scp -r /export/server/apache-hive-3.1.3-bin root@node3:/export/server/
  • 切换到node3上
  • 连接第一代服务端
/export/server/apache-hive-3.1.3-bin/bin/hive

在这里插入图片描述

  • 连接第二代服务端
# 打开
/export/server/apache-hive-3.1.3-bin/bin/beeline

# 输入地址
! connect jdbc:hive2://node1:10000
# 输入账号root
# 不需要输入密码,回车

在这里插入图片描述

(2)Hive可视化客户端

DataGrip、Dbeaver、SQuirrel SQL Clinet等
可以在Windows、MAC平台中通过JDBC连接HiveServer2的图形界面工具
这类工具往往专门准对SQL类软件进行开发优化、页面美观大方,操作简洁,更重要的是SQL编辑环境优雅;SQL语法智能提示补全、关键字高亮、查询结果智能显示、按钮操作大于命令操作;

Hive可视化工具客户端
  • DataGrip

DataGrip是由JetBrains公司推出的数据库管理软件,DataGrip支持几乎所有主流的关系数据库产品,如DB2、Derby、MySQL、Oracle、SQL Server等,也支持几乎所有主流的大数据生态圈SQL软件,并且提供了简单易用的界面,开发者上手几乎不会遇到任何困难。

下载地址

使用

  • 新建一个文件夹
    在这里插入图片描述

  • 显示工具列
    在这里插入图片描述

  • 关联目录到工程中
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 新建sql文件
    在这里插入图片描述
    在这里插入图片描述

  • 连接数据源
    在这里插入图片描述

  • 添加驱动
    在这里插入图片描述
    在这里插入图片描述

  • 填写连接信息
    在这里插入图片描述

  • 展示
    在这里插入图片描述

Hive SQL语言

数据库与建库

Hive数据模型总览

在这里插入图片描述

create database

create database 用于创建新的数据库
COMMENT:数据库的注释说明语句
LOCATION:指定数据库在HDFS存储位置,默认/user/hive/warehouse/dbname.db
WITH DBPROPERTIES:用于指定一些数据库的属性配置

create (database|schema) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];

在这里插入图片描述
在这里插入图片描述

use database

选择特定的数据库
切换当前会话使用哪一个数据库进行操作

drop database

删除数据库
默认行为是RESTRICT,这意味着仅在数据库为空时才删除它
要删除带有表的数据库(不为空的数据库),我们可以使用CASCADE

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

建表语法树(基础)

HIVE DDL CREATE TABLE

CREATE TABLE [IF NOT EXISTS] [db_name].table_name
(col_name data_type [COMMENT col_comment], ...)
[COMMENT table_comment]
[ROW FORMAT DELIMITED ...];

最低限度必须包括的语法为

CREATE TABLE table_name (col_name data_type);

(1)数据类型

Hive数据类型指的是表中列的字段类型;
整体分为两类:原生数据类型(primitive data type)和复杂数据类型(complex data type)
最常用的数据类型是字符串String数字类型Int

在这里插入图片描述

(2)分隔符指定语句

ROW FORMAT DELIMITED语法用于指定字段之间等相关的分隔符,这样Hive才能正确的读取解析数据。
或者说只有分隔符指定正确,解析数据成功,我们才能在表中看到数据。

LazySimpleSerDe是Hive默认的,包含4种子语法,分别用于指定字段之间、集合元素之间、map映射 kv之间、换行的分隔符号。
在建表的时候可以根据数据的特点灵活搭配使用。

在这里插入图片描述

演示
create table t_archer(
    id int comment "ID编号",
    name string comment "英雄名称",
    hp_max int comment "最大生命",
    mp_max int comment "最大法力",
    attack_max int comment "最高物攻",
    defense_max int comment "最大防御",
    attack_range string comment "攻击范围",
    role_main string comment "主要定位",
    role_assist string comment "次要定位"
)
row format delimited
fields terminated by "\t"; -- 字段之间的分隔符是tab键 制表符

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

(3)Hive默认分隔符

Hive建表时如果没有row format语法指定分隔符,则采用默认分隔符;
默认分隔符是'\001',是一种特殊的字符,使用的是ASCII编码的值,键盘是打不出来的。
在这里插入图片描述
在vim编辑器中,连续按下Ctrl+v / Ctrl+a 即可输入’\001’,显示^A
在这里插入图片描述
在一些文本编辑器中将以SOH的形式显示
在这里插入图片描述
字段:id、team_name(战队名称)、ace_player_name(王牌选手名字)。分析一下:数据都是原生数据类型,且字段之间分隔符是\001,因此在建表的时候可以省去row format语句,因为hive默认的分隔符就是\001。
在这里插入图片描述

Hive Show 语法

Show相关的语法可以帮助用户查询相关信息。
比如我们最常使用的查询当前数据库下有哪些表 show tables。

-- 1、显示所有数据库 SCHEMAS和DATABASES的用法,功能一样
show databases;
show schemas;

-- 2、显示当前数据库所有表
show tables;
show tables [in database_name]; -- 指定某个数据库

-- 3、查询显示一张表的元数据信息
desc formatted t_team_ace_player;
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值