当前位置:   article > 正文

[学习笔记]黑马程序员-Hadoop入门视频教程_黑马程序员大数据hadoop入门笔记

黑马程序员大数据hadoop入门笔记

文章目录

参考资料

黑马程序员大数据Hadoop入门视频教程,适合零基础自学的大数据Hadoop教程

第一章:大数据导论与Linux基础(p1-p17)

学习目标
1.理解大数据基本概念
2.掌握数据分析基本步骤
3.理解分布式、集群概念
4.学会VMware虚拟机的导入与使用
5.掌握Linux常用操作命令使用
6.掌握vi/vim编辑器基础使用

1.1 大数据导论

1.1.1 企业数据分析方向

数据分析是为了把隐藏在数据背后的信息集中和提炼出来,总结出所研究对象的内在规律,帮助管理者进行有效的判断和决策。数据分析在”企业日常经营“分析中主要有三大方向:现状分析->原因分析->预测分析

  • 现状分析(分析当下的数据):现阶段的整体情况,各个部分的构成占比、发展、变动
  • 原因分析(分析过去的数据):某一现状为什么发生,确定原因,做成调整优化
  • 预测分析(结合数据预测未来):结合已有数据预测未来发展趋势

离线分析(Batch Processing):面向过去,面向历史,分析已有的数据;在时间维度明显成批次性变化。一周一分析(T+7),一天一分析(T+1),所以也叫做批处理
在这里插入图片描述
实时分析(Real Time Processing | Streaming)
面向当下,分析实时产生的数据;所谓的实时是指从数据产生到数据分析与数据应用的时间间隔很短,可细分秒级、毫秒级。实时分析又称为流式处理(Streaming)。
在这里插入图片描述
机器学习(Machine Learning)
基于历史数据和当下产生的实时数据预测未来发生的事情;侧重于数学算法的运用,如分类、聚类、关联、预测。
在这里插入图片描述

1.1.2 数据分析基本流程步骤

数据分析步骤(流程)的重要性体现在:对如何开展数据分析提供了强有力的逻辑支撑;
张文霖老师在《数据分析六部曲》中提到,典型的数据分析应该包含以下几个步骤:
明确分析目的和思路->数据收集->数据处理->数据分析->数据展现->报告攥写

明确分析的目的和思路
  • 目的是整个分析流程的起点,为数据的收集、处理及分析提供清晰的指引方向;
  • 思路是使分析框架体系化,比如先分析什么,后分析什么,使各分析点之间具有逻辑联系,保证分析维度的完整性,分析结果的有效性以及正确性,需要数据分析方法论进行支撑;
  • 数据分析方法论是一些营销管理相关理论,比如用户行为理论、PEST分析法、5W2H分析法等
数据收集
  • 数据从无到有的过程:比如传感器收集气象数据、埋点收集用户行为数据
  • 数据传输搬运的过程:比如采集数据库数据到数据分析平台

常见的数据源和种类:

  • 业务数据(RDBMS)
  • 日志数据(服务器、应用日志)
  • 爬虫数据(爬虫数据库)
  • 互联网公开数据(行业、政府网站)
数据处理
  • 准确来说,应该称之为数据预处理
  • 数据预处理需要对收集到的数据进行加工整理,形成适合数据分析的样式,主要包括数据清洗数据转化数据提取数据计算
  • 数据预处理可以保证数据的一致性和有效性,让数据变成干净规整的结构化数据

思考:

  1. 当下的企业中用于分析的数据是侧重文本数据多一些,还是侧重于图片、视频数据多一些?
    答案:文本数据多一点
  2. 什么叫干净规整的结构化数据?有非结构化数据?
    答案:结构化数据,专业来说就是二维表的数据,行列对应
数据分析
  • 用适当的分析方法及分析工具,对处理过的数据进行分析,提取有价值的信息,形成有效结论的过程;
  • 需要掌握各种数据分析方法,还要熟悉数据分析软件的操作;
数据展现
  • 数据展现又称之为数据可视化,指的是分析结果图表展示,因为人类是视觉动物;
  • 数据可视化(Data Visualization)属于数据应用的一种;
  • 注意,数据分析的结果不是只有可视化展示,还可以继续数据挖掘(Data Mining)、即席查询(Ad Hoc)等。
报告攥写
  • 数据分析报告是对整个数据分析结过程的一个总结与呈现
  • 把数据分析的起因、过程、结果及建议完整地呈现出来,供决策者参考
  • 需要有明确的结论,最好有建议或解决方案

1.1.3 大数据时代

大数据定义

大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

大数据的5V特征

5个V开头的单词,从5个方面准确、生动、形象地介绍了大数据特征。

  • Volume:数据体量大
    采集数据量大;存储数据量大;计算数据量大;TB、PB级别起步
  • Variety:种类、来源多样化
    种类:结构化、半结构化、非结构化
    来源:日志文本、图片、音频、视频
  • Value:低价值密度
    信息海量但是价值密度低
    深度复杂的挖掘分析需要机器学习参数
  • Velocity:速度快
    数据增长速度快
    获取数据速度快
    数据处理速度快
  • Veracity:数据的质量
    数据的准确性
    数据的可信赖度
应用场景

电商领域:精准广告位、个性化推荐、大数据杀熟
传媒领域:精准营销、猜你喜欢、交互推荐
金融方面:理财投资,通过对个人的信用评估,风险承担能力评估,集合众多理财产品,推荐相应的投资理财产品。
交通领域:拥堵预测、智能红绿灯、导航最优规划
电信领域:基站选址优化、舆情监控、客户用户画像
安防领域:犯罪预防、天网监控
医疗领域:智慧医疗、疾病预防、病源追踪

1.1.4 分布式与集群

概念

分布式、集群是两个不同的概念,但口语中经常混淆 二者。
分布式是指”多台机器,每台机器上部署不同组件“。
集群是指”多台机器,每台机器上部署相同组件“。

分布式示意图:
例如:去京东买东西,京东背后是多台服务器,不同服务器承担不同的服务。
在这里插入图片描述

集群示意图:
例如:访问百度,百度背后也有多台服务器,多台服务器都来提供搜索服务(再配合负载均衡),防止某台宕机。
在这里插入图片描述

应用

数据大爆炸,海量数据处理场景面临问题
如何存储?单机存储有瓶颈,多台机器分布式存储
如何计算(高效)?单台计算能力有限,多台机器分布式计算

1.2 Linux操作系统概述

1.2.1 操作系统概念与分类

操作系统概念
  • 操作系统(operating system, 简称OS)是管理计算机硬件与软件资源的程序,需要处理如:管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务;
  • 没有操作系统的机器称之为裸机,不管是开发还是使用都十分不便。
  • 操作系统也提供一个让用户与系统交互的操作界面
操作系统分类

操作系统发展至今,种类繁多,可以根据应用的不同领域进行划分:

  • 桌面操作系统:所谓的桌面是指图形化操作页面。
    Mac os(Apple)、Windows(Microsoft)、Linux三足鼎立。
  • 服务器操作系统:一般指的是安装在大型计算机上的操作系统。比如Web服务器、应用服务器和数据库服务器等,是企业IT系统的基础架构平台。
    主要分为四大流派:Unix、LinuxWindows Server和Netware。
  • 嵌入式操作系统:是一种完全嵌入受控器内部,为特定应用而设计的专用计算机系统。
    如嵌入式Linux、WinCE(微软嵌入式、移动计算平台)、RTOS(嵌入式实时操作系统、军事航空领域)等;在工业、军事、航空等领域使用较多。
  • 移动设备操作系统:主要应用在智能手机、平板等智能设备上。
    主要有Android(谷歌)、ios(苹果)、Symbian(诺基亚)、BlackBerry OS(黑莓)、windows mobile(微软)、Harmony(华为鸿蒙)等。

1.2.2 Linux起源与发展

  • Unix系统是较早被广泛使用的计算机操作系统之一,油Ken Thompsonb在AT&T贝尔实验室发现,后续发展中,因开源、版权等问题陷入不断纠纷,延伸出不同Unix版本;
  • 1991年芬兰学生Linus Torvalds发布Linux系统第一版本,遵循GPL协议(通用公共许可证),开源免费
  • Linux是一个类似Unix的操作系统,Linux的初衷就是要替代Unix,并在功能和用户体验上进行优化,所以Linux模仿了Unix(但并没有抄袭Unix的源码),使得Linux在外观和交互上与Unix非常类似。

1.2.3 Linux内核与发行版本

Linux内核(Kernel)
  • 操作系统的核心部分简称内核,Linux第一版本独立内核由Linus Torvalds开发实现,约10000行代码;
  • 后续Linus Torvalds公开了Linux内核代码,并邀请他人一起完善Linux;现在只有2%的Linux核心代码是由Linus Torvalds自己编写,但是仍然拥有Linux内核且保留了选择新代码和需要合并的新方法的最终裁定权
  • Linux操作系统 = Linux Kernel + GNU软件及系统软件 + 必要的应用程序
  • Linux选择企鹅图案作为Logo,其含义是:开放源代码的Linux像企鹅一样为全人类共同所有。
Linux发行版本
  • Linux发行版就是由Linux内核与各种常用软件的集合产品,如今全球大约有数百款的Linux发行版本。
  • 从大的方面来说,Linux发行版可大致分为个人桌面版企业服务器版
  • 个人桌面版中,Ubuntu成熟度颇高较受欢迎,而Redhat(红帽系列)及其延伸版本(Centos)凭借稳定的性能在企业服务器中占比很大。

1.3 VMware Workstation虚拟机使用

1.3.1 VMware虚拟机概念与安装

VMware介绍
  • VMware Workstation是一款虚拟机软件,允许用户将Linux、Windows等多个操作系统作为虚拟机在单台PC上运行
  • 用户可以在虚拟机上重现服务器、桌面和平板电脑环境,无需重新启动即可跨不同操作系统同时运行应用。
VMvare功能、组件
  • 通过对个人笔记本(PC)硬件资源的虚拟,在一台PC上运行其他隔离操作系统;
  • 隔离出来的操作系统虽然是虚拟的,但是硬件组成与功能上与物理实体机完全一致
  • VMware虚拟组件包括:网卡、交换机、DHCP、NAT设备等,此处不做深入探究。
网络架构图

在这里插入图片描述

1.3.2 Centos操作系统的虚拟机导入

导入相关步骤已经在2021韩顺平一周学会Linux中记录过,所以这里略过。
需要注意的是:
1.为了和提供的虚拟机(可在视频下方置顶评论区下载)对应,需要修改虚拟网络编辑器,将子网的网段改为192.168.88.0
2.在导入提供的虚拟机之后,打开虚拟机时,要选择“我已移动该虚拟机”(这样虚拟机的网卡的mac地址不变,但如果实际上是复制的,则会导致有两台虚拟机的mac地址相同,最终导致网路冲突),而不能选择“我已复制该虚拟机”(虚拟机的网卡的mac地址是新生成的)。
3.导入的node3和node2均依赖于node1虚拟机,这里采用的技术是“链接克隆技术”。

1.3.3 VMware虚拟机常规使用

内存、磁盘调整

在虚拟机关机状态下,可以根据需求调整每台机器的资源大小。(提供的虚拟机默认的内存分配是4G-2G-2G)

1.3.4 FinalShell介绍使用

SSH协议
  • SSH为Secure Shell的缩写,是一种网络安全协议,专为远程登录会话和其他网络服务提供安全性的协议。
  • 在Linux中,SSH的主要用途有:用户加密实现远程登录、服务器之间的免密登录
  • SSH协议默认采用RAS实现非对称加密(单方向加密),需要两个密钥:公开密钥(public key:简称公钥)和私有密钥(private key:简称私钥)。
  • 公钥和私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密
    在这里插入图片描述
  • 企业中,Linux服务器通常位于远程机房中,用户不方便直接在机房操作;
  • 可以使用支持SSH协议的软件,通过远程登录操作访问服务器,并且SSH协议可以实现对传输内容的加密。
  • 原理如图所示。
    在这里插入图片描述
支持SSH协议的软件
  • 常见的支持SSH协议的软件有:FinalShell、Putty、xshell、secureCRT等。
  • 本课程使用国产开源免费,支持中文的FinalShell软件。
  • FinalShell安装操作中主要注意的就是安装目录:最好无中文、无空格路径
FinalShell连接Linux
  • 配置windows上的hosts映射文件,这样就可以使用主机名访问3台虚拟机了
  • hosts文件路径:C:\Windows\System32\drivers\etc\hosts
  • 配置完毕之后,可以win+r,输入cmd进入命令行,使用ping命令测试是否生效。
192.168.88.151 node1
192.168.88.152 node2
192.168.88.153 node3
  • 1
  • 2
  • 3

1.4 Linux常用基础命令

1.4.1 Linux文件系统基础知识

Linux文件系统概念
  • 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统;
  • 文件系统的结构通常叫做目录树结构,从斜杠/根目录开始;
  • Linux号称“万物皆文件”,意味着针对Linux的操作,大多数时间是在针对Linux文件操作系统。
    在这里插入图片描述
文件系统通用特性
  • 几乎主流的文件系统都是从/根目录开始的,Linux也不例外,而windows文件系统会以盘符来区分不同文件系统
  • 目录树中节点分为两个种类:目录(directory)、文件(file)
  • 从根目录开始,路径具有唯一性
  • 只有在目录下才可以继续创建下一级目录,换句话说目录树到文件终止蔓延
易混概念
  • 当前路径:也叫当前工作目录,当下用户所属的位置;
  • 相对路径:相对当前工作目录开始的路径,会随当前路径变化而变化;
  • 绝对路径:不管工作目录在哪,绝对路径都是从/根目录开始,唯一不重复。
特殊符号
  • . 目录或者文件名字以.开始表示是隐藏的文件,如果路径以.开始表示当前路径
  • .. 当前目录的上一级目录
  • ~ 当前用户的home目录,比如root用户home目录是/root
  • / 根目录
# 进入当前目录下的a
cd ./a
# 进入根目录下的a
cd /a
# 进入当前目录上一级下的a
cd ../a
# 进入当前操作用户home目录下的a
cd ~/a
# 进入当前目录下的a,a是隐藏的
cd .a
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
Linux命令帮助手册

1.4.2 Linux常用操作命令

显示目录内容
  • ls(list files)命令:用于显示指定工作目录下的内容(列出目前工作目录所含的文件及子目录)。
    -a:显示所有文件及目录(.开头的隐藏文件也会列出)
    -l:除文件名外,也将文件型态、权限、拥有者、文件大小等咨询详细列出,注意ls -l = ll
ls path
ls -a path #查看所有文件,包括隐藏文件
ls -l # 查看文件详细信息,包括权限,类型,时间,大小等
ll # 功能等同于ls -l
ll -h path # 表示以人性化的方式显示内容
ll * # *通配符表示任意字符,?表示有且只有一个字符
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
切换目录
  • cd(change directory)命令:用于切换当前工作目录。切换的路径可为绝对路径或相对路径。若路径省略,则变换至使用者的home目录。
pwd # 查看自己当前所在目录
cd path # 注意自己写的是相对路径还是绝对路径,还可以结合特殊符号使用
  • 1
  • 2
创建、删除
  • mkdir(make directory)命令:用于创建目录。
    -p确保父目录名称存在,不存在的就建一个。
  • touch命令:创建一个空文件,无任何内容。
  • rm(remove)命令:用于删除一个文件或者目录。
    -f:强制直接删除,无需用户确认。
    -r:将目录及以下所有递归逐一删除。
    在这里插入图片描述
复制、移动
  • cp(copy file)命令:用于复制文件或目录。
    -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
  • mv(move file)命令:用来为文件或目录改名、或将文件或目录移入其他位置。
    在这里插入图片描述
文件内容查看
  • cat(concatenate)命令:用于连接文件并打印到标准输出设备如console控制台上。适合小文件内容查看。
  • more命令:类似cat,不过会以一页一页的形式显示,更方便使用者逐页阅读,翻页结束自动退出。适合大文件查看。按space键翻下一页,按b返回(back)上一页。
  • tail命令:用于查看文件的结尾部分的内容。
    -n:用于显示行号,默认为10,即显示10行的内容。
    -f:用于实时显示文件动态追加的内容。会把文件里的最尾部的内容显示在屏幕上,并不断刷新,只要文件有更新,就可以看到最新的文件内容。
其他
  • | 管道命令:将前一个命令执行的结果作为内容交给下一个命令处理。可以形成多级管道操作。
命令1 | 命令2   # 可以将命令1的结果通过命令2作进一步的处理
  • 1
  • echo命令:用于内容的输出,将内容输出到console控制台上。
echo string
  • 1
  • >:输出重定向(覆盖)命令:command > file 执行command然后将输出的内容存入file,file内已经存在的内容将新内容覆盖替代。
  • >>:输出重定向(追加)命令:command >> file 执行command然后将输出的内容存入file,新内容追加在文件末尾。
    在这里插入图片描述
解压缩命令
  • 打包、解包
    tar(tape archive)命令:常用于备份文件。是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件。
    -c或–create:建立新的备份文件。
    -x或–extract或–get:从备份文件中还原文件。
    -v或–verbose显示指令执行过程。
    -f<备份文件>或–file=<备份文件>指定备份文件。
# tar -cvf 打包名.tar 文件或者目录
tar -cvf test.tar 1.txt 2.txt      # 将当前目录下的1.txt和2.txt打包成test.tar文件
tar -xvf test.tar -C /root/        # 解包,当不指定-C 解包目录,则默认解包到当前目录
  • 1
  • 2
  • 3
  • 打包压缩、解压缩解包
    在打包备份或者解包的过程中,可以通过指定压缩算法,对打包的文件进行压缩,解压的时候也需要指定相应的算法。
    -z或–gzip或–ungzip通过gzip指令处理备份文件。
    最重要的搭配(因为很多软件安装包都是用tar来安装的):tar -zxvf xxxxx.tar.gz
tar -zcvf test.tar.gz 1.txt 2.txt # 将当前目录下的1.txt和2.txt打包压缩成test.tar.gz文件
tar -zxvf test.tar.gz -C /root/   # 解压缩解包,当不指定-C 解包目录,则默认解包到当前目录
  • 1
  • 2

补充:.tar.gz可以简写成.tgz

1.5 Linux常用系统命令

1.5.1 时间、日期查看

  • date命令:用来显示或设定系统的日期与时间,在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记。
  • cal(calendar)命令:用于显示当前或者指定日期的公历。
date    # 默认格式显示日期与时间:2023年 02月 06日 星期一 15:03:59 CST
date +"%Y-%m-%d %H:%M:%S" # 按照指定格式显示日期与时间:2023-02-06 15:06:08
cal     # 显示当前日期的公历
  • 1
  • 2
  • 3

在这里插入图片描述

1.5.2 内存、磁盘使用率查看

  • free命令:用于显示内存状态。会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。
  • df(英文全拼:disk free)命令:用于显示目前在Linux系统上的文件系统磁盘使用情况统计。
free -h # 查看内存使用情况
  • 1

在这里插入图片描述

df -h # 查看磁盘使用情况
  • 1

在这里插入图片描述
重点关注/dev/mapper/centos_node1-root,因为这是根目录的挂载点。

1.5.3 进程查看

  • ps(英文全拼:process status)命令:用于显示当前进程的状态,类似于windows的任务管理器。
  • jps命令:这是JDK自带的命令,专门用于查看本机运行的java进程情况。
jsp    # 在安装了jdk的情况下,jps命令可以用于查看本机运行的java进程
ps -ef # 查看本机运行的所有进程
kill -9 进程号 # 根据查询到的进程号,结合kill -9 命令来杀死进程
  • 1
  • 2
  • 3

1.6 vi/vim文本编辑器

1.6.1 vim编辑器介绍、3种工作模式

vim编辑器简介
  • vi是一款很多unix及其延伸内置的文本编辑器,具有强大的文本编辑能力。
  • vim是从vi发展出来的一个文本编辑器,可以理解为vi编辑器的增强版。vim中代码补完、编译及错误跳转等方便编程的功能特别丰富。
  • vi/vim编辑器的核心设计思路:让程序员的手指始终保持在键盘的核心区域,就能完成所有的编辑操作。
  • 学会使用vi/vim编辑器最大挑战:万物皆命令
    在这里插入图片描述
打开与新建文件

vim /path/file

  • 如果打开的文件不存在,此时就是新建文件,编辑器左下角会提示new file
  • 如果文件已经存在,此时就打开这个文件, 进入命令模式
vim编辑器的3种工作模式

相关内容已经在2021韩顺平一周学会Linux中记录过。所以这里略过。

1.6.2 vim基本操作命令

光标移动
  • 方向键控制移动
  • 翻页pageup pagedown
  • 行首(home 0) 行尾(end $)
  • 跳到文件的最后一行 G
  • 跳到文件的第一行 gg
复制粘贴
  • 复制
    yy 复制光标当前所在行内容
    nyy 复制当前行往下n行
  • 粘贴
    p 当前行的下一行粘贴
    P 当前行的上一行粘贴

注意:使用鼠标从windows或者其他地方复制内容到vim编辑器粘贴,一定要在输入模式下进行,否则数据会有丢失的风险

删除、撤销操作
  • 删除命令
    dd 删除光标所在行的内容
    ndd 删除当前行往下n行
  • 撤销、反撤销
    u 撤销上一步的操作
    ctrl+r 反撤销

第二章:Apache Hadoop、HDFS(p18-p37)

学习目标
1.了解Hadoop发展历史、现状
2.掌握Hadoop集群架构、角色
3.掌握Hadoop集群分布式安装部署
4.理解分布式存储的概念与实现
5.掌握HDFS分块存储、副本机制等特性
6.学会shell操作HDFS
7.掌握HDFS读写文件基本流程

2.1 Apache Hadoop概述

2.1.1 Hadoop介绍、发展简史、现状

Hadoop介绍
  • 狭义上Hadoop指的是Apache软件基金会的一款开源软件
    用java语言实现,开源
    允许用户使用简单的编程模型实现跨机器集群,对海量数据进行分布式计算处理
  • Hadoop核心组件
    Hadoop HDFS(分布式文件存储系统):解决海量数据存储
    Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度
    Hadoop MapReduce(分布式计算框架):解决海量数据计算
  • 官网:http://hadoop.apache.org/
  • 广义上Hadoop指的是围绕Hadoop打造的大数据生态圈
    在这里插入图片描述
Hadoop发展简史
  • Hadoop之父:Doug Cutting
  • Hadoop起源于Apache Lucene子项目:Nutch
    Nutch的设计目的是构建一个大型的全网搜索引擎。
    遇到瓶颈:如何解决数十亿网页的存储和索引问题
  • Google三篇论文
    《The Google file system》:谷歌分布式文件系统GFS
    《MapReduce: Simplified Data Processing on Large Clusters》:谷歌分布式计算框架MapReduce
    《Bigtable: A Distributed Storage System for Structured Data》:谷歌结构化数据存储系统
Hadoop现状
  • HDFS作为分布式文件存储系统,处在生态圈的底层核心位置;
  • YARN作为分布式通用的集群资源管理系统和任务调度平台,支撑各种计算引擎运行,保证了Hadoop地位;
  • MapReduce作为大数据生态圈第一代分布式计算引擎,由于自身设计的模型所产生的弊端,导致企业一线几乎不再直接使用MapReduce进行编程处理,但是很多软件的底层依然在使用MapReduce引擎来处理数据。

2.1.2 Hadoop特性优点、国内外应用

Hadoop特性优点
  • scalability:扩容能力强:Hadoop是在可用的计算机集群间分配数据并完成计算任务的,这些集群可方便灵活的方式扩展到数以千计的节点。
  • economical:成本低:Hadoop集群允许通过部署普通廉价的机器组成集群来处理大数据,以至于成本很低。看重的是集群整体能力。
  • efficiency:效率高:通过并发数据,Hadoop可以在节点之间动态并行的移动数据,使得速度非常快。
  • reliability:可靠性高:能自动维护数据的多份复制,并且在任务失败后能自动重新部署(redeploy)计算任务。所以Hadoop的按位存储和处理数据的能力值得人们信赖。
Hadoop国外应用
  • Yahoo
    支持广告系统
    用户行为分析
    支持Web搜索
    反垃圾右键系统
  • Facebook
    存储处理数据挖掘和日志统计
    构建基于Hdoop数据仓库平台(Apache Hive来自FB)
  • IBM
    蓝云基础设施构建
    商业化Hadoop发行、解决方案支持
Hadoop国内应用
  • 百度
    用户搜索表征的需求数据、阿拉丁爬虫数据存储
    数据分析和挖掘 竞价排名
  • 阿里巴巴
    为电子商务网络平台提供底层的基础计算和存储服务
    交易数据、信用数据
  • 腾讯
    用户关系数据
    基于Hadoop、Hive构建TDW(腾讯分布式数据仓库)
  • 华为
    对Hadoop的HA方案,以及HBase领域有深入研究

2.1.3 Hadoop发行版本、架构变迁

Hadoop发行版本
  • 开源社区版:Apache开源社区发行,也是官方发行版本。
    优点:更新迭代快
    缺点:兼容稳定性不周
    Apache开源社区版本:http://hadoop.apache.org/
  • 商业发行版:商业公司发行,基于Apache开源协议,某些服务需要收费
    优点:稳定兼容好
    缺点:收费,版本更新慢
    Cloudera:https://www.cloudera.com/products/open-source/apache-hadoop.html
    Hortonworks :https://www.cloudera.com/products/hdp.html
  • 这里使用Apache版的Hadoop,版本号为3.3.0
Hadoop架构变迁(1.0-2.0变迁)
  • Hadoop1.0
    HDFS(分布式文件存储)
    MapReduce(资源管理和分布式数据处理)
    在这里插入图片描述
  • Hadoop2.0
    HDFS(分布式文件存储)
    MapReduce(分布式数据处理)
    YARN(集群资源管理、任务调度)
    在这里插入图片描述
  • Hadoop3.0
    Hadoop 3.0架构组件和Hadoop 2.0类似,3.0着重于性能优化
    通用方面:精简内核、类路径隔离、shell脚本重构
    Hadoop HDFS:EC纠删码、多NameNode支持
    Hadoop MapReduce:任务本地化优化、内存参数自动推断
    Hadoop YARN:Timeline Service V2、队列配置

在这里插入图片描述

2.2 Apache Hadoop集群搭建

Hadoop集群整体概述
  • Hadoop集群包括两个集群(物理层面):HDFS集群YARN集群
  • 两个集群逻辑上分离、通常物理上在一起
  • 两个集群都是标准的主从架构集群
    HDFS集群是一个分布式存储系统,它当中的主角色叫做NameNode,简称NN,从角色叫做DataNode,简称DN,主角色辅助角色叫做SecondaryNameNode,简称SNN。
    YARN集群主要负责资源管理和任务调度,它当中的主角色叫做ResourceManager,简称RM,从角色叫做NodeManager,简称NM。

2.2.1 Hadoop集群简介

在这里插入图片描述

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

2.2.2 Hadoop集群模式安装(Cluster mode)

Hadoop源码编译
  • 安装包、源码包下载地址
    https://archive.apache.org/dist/hadoop/common/hadoop-3.3.0/
    在这里插入图片描述

  • 为什么要重新编译Hadoop源码?
    匹配不同操作系统本地库环境,Hadoop某些操作比如压缩、IO需要调用系统本地库(*.so|*.dll)
    修改源码重构源码

  • 如何编译Hadoop
    源码包根目录下文件:BUILDING.txt
    详细步骤参考附件资料
    在这里插入图片描述

  • 课程提供编译好的Hadoop安装包
    hadoop-3.3.0-Centos7-64-with-snappy.tar.gz

Step1:集群角色规划
  • 角色规划的准则
    根据软件工作特性和服务器硬件资源情况合理分配
    比如依赖内存工作的NameNode是不是部署在大内存机器上?
  • 角色规划注意事项
    资源上有抢夺冲突的,尽量不要部署在一起
    工作上需要互相配合的。尽量部署在一起

在这里插入图片描述

Step2:服务器基础环境准备
  • 查询主机名(3台机器)
vim /etc/hostname
  • 1

在这里插入图片描述
补充:
1.finalshell支持将命令发送到所有会话
2.Linux解决“您在 /var/spool/mail/root 中有新邮件”的问题
在这里插入图片描述

  • 建立Hosts映射(3台机器)
vim /etc/hosts
  • 1

在这里插入图片描述

  • 防火墙关闭(3台机器)
systemctl stop firewalld.service # 关闭防火墙
systemctl disable firewalld.service # 禁止防火墙开开启自启
  • 1
  • 2
  • ssh免密登录(只需要配置node1至node1、node2、node3即可)
# node1生成公钥私钥(4个回车)
ssh-keygen

#node1配置免密登录到node1 node2 node3
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 集群时间同步(3台机器)
yum -y install ntpdate
ntpdate ntp5.aliyun.com # 使用ntp协议,与网络授时服务器做同步
  • 1
  • 2

补充:阿里云时间同步服务器【ntp服务器】–ntp地址收集

  • 创建统一工作目录(3台机器)
mkdir -p /export/server/   # 软件安装路径
mkdir -p /export/data/     # 数据存储路径
mkdir -p /export/software/ # 安装包存放路径
  • 1
  • 2
  • 3
Step3:上传安装包、解压安装包
  • JDK1.8安装(3台机器)
# 先只在node1上安装JDK1.8
# 将jdk-8u241-linux-x64.tar.gz上传到/export/server/目录下
cd /export/server/
tar -zxvf jdk-8u241-linux-x64.tar.gz # 解压安装包,选项-zxvf中的-可有可没有
rm -rf jdk-8u241-linux-x64.tar.gz    # 解压后可以删除安装包

# 配置环境变量
vim /etc/profile
# 在/etc/profile文件的最后添加
export JAVA_HOME=/export/server/jdk1.8.0_241
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 重新加载环境变量
source /etc/profile

# 利用scp远程拷贝,将node1中的JDK1.8拷贝到node2和node3的root用户的/export/server/目录下
scp -r /export/server/jdk1.8.0_241/ root@node2:/export/server/ # 因为是拷贝目录,所以有-r
scp -r /export/server/jdk1.8.0_241/ root@node3:/export/server/
# 利用scp远程拷贝,将node1中的/etc/profile拷贝到node2和node3的root用户的/export/profile/目录下
scp /etc/profile root@node2:/etc
scp /etc/profile root@node3:/etc
# 三台机器同时发送source /etc/profile来重新加载环境变量文件
source/profile

#  三台机器同时发送java -version来验证JDK1.8是否正确安装
java -version
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 上传、解压Hadoop安装包(node1)
# 先只在node1上安装Hadoop
# 将已经编译好的Hadoop安装压缩包hadoop-3.3.0-Centos7-64-with-snappy.tar.gz通过FinalShell上传到node1的/export/server/下
cd /export/server/
tar -zxvf hadoop-3.3.0-Centos7-64-with-snappy.tar.gz
rm -rf hadoop-3.3.0-Centos7-64-with-snappy.tar.gz
  • 1
  • 2
  • 3
  • 4
  • 5
Step4:Hadoop安装包目录结构

在这里插入图片描述

配置文件概述
  • 官方文档: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-stie.xml MapReduce模块配置
    yarn-site.xml yarn模块配置
  • 第三类1个:workers
  • 所有的配置文件目录:/export/server/hadoop-3.3.0/etc/hadoop
Step5:编辑Hadoop配置文件

修改配置文件(配置文件目录:/export/server/hadoop-3.3.0/etc/hadoop)

  • hadoop-env.sh
#文件最后添加
export JAVA_HOME=/export/server/jdk1.8.0_241 # 申明Java的路径

# 指定各个进程的用户名
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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 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.0</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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • hdfs-site.xml
    文件系统的核心配置
<!-- 设置SNN进程运行机器位置信息 -->
<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>node2:9868</value>
</property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • mapred-site.xml
    MapReduce模块配置
<!-- 设置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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • yarn-site.xml
<!-- 设置YARN集群主角色运行机器位置 -->
<property>
	<name>yarn.resourcemanager.hostname</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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

注意:由于目前使用的是虚拟机,内存比较小,所以对物理内存和虚拟内存的限制关闭。如果在企业真实环境中,可以将两个参数去掉,这样就会进行检测。

  • workers
    配置集群的“工人”位于的机器ip信息
node1.itcast.cn
node2.itcast.cn
node3.itcast.cn
  • 1
  • 2
  • 3
Step6:分发同步安装包
  • 在node1机器上将Hadoop安装包scp同步到其他机器
cd /export/server/
scp -r hadoop-3.3.0/ root@node2:$PWD # 这里$PWD就是当前路径/export/server/
scp -r hadoop-3.3.0/ root@node2:$PWD
  • 1
  • 2
  • 3
Step7:配置Hadoop环境变量
  • 在node1上配置Hadoop环境变量
vim /etc/profile
export HADOOP_HOME=/export/server/hadoop-3.3.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  • 1
  • 2
  • 3
  • 将修改后的环境变量同步到其他机器
scp /etc/profile root@node2:/etc/
scp /etc/profile root@node3:/etc/
  • 1
  • 2
  • 重新加载环境变量,验证是否生效(3台机器)
source /etc/profile
hadoop # 验证环境变量是否生效
  • 1
  • 2

在这里插入图片描述

Step8:NameNode format(格式化操作)
  • 首次启动HDFS时,必须对其进行格式化操作。
  • format本质上是初始化工作,进行HDFS清理和准备工作
  • 命令:hdfs namenode -format

1.首次启动之前需要format操作;
2.format只能进行一次,后续不再需要;
3.如果多次format除了造成数据丢失外,还会导致hdfs集群主从角色之间互相不认识。通过删除所有机器hadoop.tmp.dir目录重新format解决

2.2.3 Hadoop集群启停命令、Web UI

手动逐个进程启停
  • 每台机器上每次手动启动关闭一个角色进程,可以精准控制每个进程启停,避免群起群停。
  • HDFS集群
# hadoop2.x版本命令
hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
# hadoop3.x版本命令
hadoop --daemon start|stop namenode|datanode|secondarynamenode
  • 1
  • 2
  • 3
  • 4
  • YARN集群
# hadoop2.x版本命令
yarn-daemon.sh start|stop resourcemanager|nodemanager
# hadoop3.x版本命令
yarn --daemon start|stop resourcemanager|nodemanager
  • 1
  • 2
  • 3
  • 4
shell脚本一键启停
  • 在node1上,使用软件自带的shell脚本一键启动。前提:配置好机器之间的SSH免密登录和workers文件
  • HDFS集群
start-dfs.sh
stop-dfs.sh
  • 1
  • 2
  • YARN集群
start-yarn.sh
stop-yarn.sh
  • 1
  • 2
  • Hadoop集群
start-all.sh # 一个命令代替start-dfs.sh和start-yarn.sh
stop-all.sh
  • 1
  • 2
进程状态、日志查看
  • 启动完毕之后可以使用jps命令查看进程是否启动成功

如果发现一个进程,查看的时候存在,过一会没了,即发生了“进程的闪退”,说明配置有问题。此时排错的唯一依据是看日志

  • Hadoop启动日志路径:/export/server/hadoop-3.3.0/logs/
HDFS集群的Web页面
  • 地址:http://namenode_host:9870
    其中namenode_host是namenode运行所在机器的主机名或者ip
    如果使用主机名访问,别忘了在Windows配置hosts
    这里我们用node1:9870可以访问HDFS的Web页面
YARN集群的Web页面
  • 地址:http://resourcemanager_host:8088
    其中resourcemanager_host是resourcemanager运行所在机器的主机名或者ip
    如果使用主机名访问,别忘了在Windows配置hosts
    这里我们用node1:8088可以访问YARN的Web页面

2.2.4 Hadoop初体验

HDFS初体验
  • shell命令操作
hadoop fs -mkdir /itcast
hadoop fs -put 要上传的文件 /itcast
hadoop fs -ls /
  • 1
  • 2
  • 3
  • Web UI页面操作
MapReduce+YARN初体验
  • 执行Hadoop官方自带的MapReduce案例,评估圆周率π的值。
cd /export/server/hadoop-3.3.0/share/hadoop/mapreduce/
hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 2 4
  • 1
  • 2

2.3 HDFS分布式文件系统基础

2.3.1 文件系统、分布式文件系统

文件系统定义
  • 文件系统是一种存储组织数据的方法,实现了数据的存储、分级组织、访问和获取等操作,使得用户对文件访问和查找变得容易;
  • 文件系统使用树形目录抽象逻辑概念代替了硬盘等物理设备使用数据块的概念,用户不必关心数据底层存在硬盘哪里,只需要记住这个文件的所属目录和文件名即可;
  • 文件系统通常使用硬盘和光盘这样的存储设备,并维护文件在设备中的物理位置
传统常见的文件系统
  • 所谓传统常见的文件系统更多指的是单机的文件系统,也就是底层不会横跨多台机器实现。比如windows操作系统上的文件系统、Linux上的文件系统、FTP文件系统等等。
  • 这些文件系统的共同特征包括:
    1.带有抽象的目录树结构,树都是从/根目录开始往下蔓延;
    2.树中节点分为两类:目录文件
    3.从根目录开始,节点路径具有唯一性

文件系统中有两个概念非常重要:数据、元数据

数据、元数据
  • 数据
    指存储的内容本身,比如文件、视频、图片等,这些数据底层最终是存储在磁盘等存储介质上的,一般用户无需关心,只需要基于目录树进行增删改查即可,实际针对数据的操作由文件系统完成。
  • 元数据
    元数据(metadata)又称之为解释性数据,记录数据的数据;
    文件系统元数据一般指文件大小、最后修改时间、底层存储位置、属性、所属用户、权限等信息
海量数据存储遇到的问题
  • 成本高
    传统存储硬件通用性差,设备投资加上后期维护、升级扩容的成本非常高
    在这里插入图片描述
  • 如何支撑高效率的计算分析
    传统存储方式意味着数据:存储是存储,计算是计算,当需要处理数据的时候把数据移动过来
    程序和数据存储是属于不同的技术厂商实现,无法有机统一整合在一起。
  • 性能低
    单节点I/O性能瓶颈无法逾越,难以支撑海量数据的高并发高吞吐场景。
  • 可扩展性差
    无法实现快速部署和弹性扩展,动态扩容、缩容成本高,技术实现难度大。
案例

场景互动:分布式存储系统的核心属性及功能含义
分布式存储系统核心属性

  • 分布式存储
  • 元数据记录
  • 分块存储
  • 副本机制
一、分布式存储的优点
  • 问题:数据量大,单机存储遇到瓶颈
  • 解决:
    单机纵向扩展:磁盘不够加磁盘,有上限瓶颈限制
    多机横向扩展:机器不够加机器,理论上无限扩展
二、元数据记录的功能
  • 问题:文件分布在不同机器上不利于寻找
  • 解决:元数据记录下文件及其存储位置信息,快速定位文件位置

在这里插入图片描述

三、分块存储好处
  • 问题:文件过大导致单机存不下、上传下载效率低
  • 解决:文件分块存储在不同机器,针对块并行操作提高效率
    在这里插入图片描述
四、副本机制的作用
  • 问题:硬件故障难以避免,数据易丢失
  • 解决:不同机器设备备份,冗余存储,保障数据安全
    在这里插入图片描述

2.3.2 HDFS简介

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

2.3.3 HDFS起源发展、设计目标

HDFS起源发展
  • Doug Cutting领导Nutch项目研发,Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能。
  • 随着爬虫抓取网页数量的增加,遇到了严重的可扩展性问题—如何解决数十亿网页的存储和索引问题
  • 2003年的时候,Google发表的论文为该问题提供了可行的解决方案。
    分布式文件系统(GFS),可用于处理海量网页的存储》
  • Nutch的开发人员完成了相应的开源实现HDFS,并从Nutch中剥离和MapReduce称为独立项目Hadoop。
HDFS设计目标
  • 硬件故障(Hardware Failure)是常态,HDFS可能有成百上千的服务器组成,每一个组件都有可能出现故障。因此故障检测和自动快速恢复是HDFS的核心架构目标。
  • HDFS上的应用主要是以流式读取数据(Streaming Data Access)。HDFS被设计成用于批处理,而不是用户交互式的。相较于数据访问的反应时间,更注重数据访问的高吞吐量
  • 典型的HDFS文件大小式GB到TB的级别。所以,HDFS被调整成支持大文件(Large Data Sets)。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。
  • 大部分HDFS应用对文件要求式write-one-read-many访问模型。一个文件一旦创建、写入、关闭之后就不需要修改了。这一假设简化了数据一致性问题,使高吞吐量的数据访问称为可能。
  • 移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效。将计算移动到数据附近,比之将数据移动到应用所在显然更好。
  • HDFS被设计为可从一个平台轻松移植到另一个平台。这有助于将HDFS广泛用作大量应用程序的首选平台。

2.3.4 HDFS应用场景

适合场景

大文件;数据流式访问;一次写入多次读取;低成本部署,廉价PC;高容错

不适合场景

小文件;数据交互式访问;频繁任意修改;低延迟处理

2.3.5 HDFS重要特性

整体概述
  • 主从架构
  • 分块存储
  • 副本机制
  • 元数据记录
  • 抽象统一的目录树结构(namespace)
    框架图(rack:机架/机柜)
    在这里插入图片描述
(1)主从架构
  • HDFS集群是标准的master/slave主从架构集群。
  • 一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成。
  • Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
  • 官方架构图中是一主五从模式,其中五个从角色位于两个机架(Rack)的不同服务器上。
(2)分块存储
  • HDFS中的文件在物理上是分块存储(block)的,默认大小是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记录下来。
  • HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
(6)数据块存储
  • 文件的各个block的具体存储管理由DataNode节点承担
  • 每一个block都可以在多个DataNode上存储。

2.4 HDFS shell操作

2.4.1 HDFS shell命令行解释说明

介绍
  • 命令行界面(英文:command-line interface,缩写:CLI),是指用户通过键盘输入指令,计算机接收到指令后,予以执行一种人际交互方式。
  • Hadoop提供了文件系统的shell命令行客户端:hadoop fs [generic options]
文件系统协议
  • HDFS Shell CLI支持操作多种文件系统,包括本地文件系统(file:///)、分布式文件系统(hdfs://nn:8020)等
  • 具体操作的是什么文件系统取决于命令中文件路径URL中的前缀协议
  • 如果没有指定前缀,则将会读取环境变量中的fs.defaultFS属性,以该属性值作为默认文件系统。
hadoop fs -ls file:///           # 操作本地文件系统
haddop fs -ls hdfs://node1:8020/ # 操作HDFS分布式文件系统
hadoop fs -ls /                  # 直接根目录,没有指定协议,将加载读取fs.defaultFS值
  • 1
  • 2
  • 3

在这里插入图片描述

区别
  • hadoop dfs 只能操作HDFS文件系统(包括与Local FS间的操作),不过已经Deprecated;
  • hdfs dfs 只能操作HDFS文件系统相关(包括与Local FS间的操作),常用;
  • hadoop fs 可操作任意文件系统,不仅仅是hdfs文件系统,使用范围更广;
    目前版本来看,官方最终推荐使用的是hadoop fs。当然hdfs dfs在市场上的使用也比较多。
参数说明
  • HDFS文件系统的操作命令很多和Linux类似,因此学习成本相对较低。
  • 可以通过hadoop fs -help命令来查看每个命令的详细用法。

2.4.2 HDFS shell命令行常用操作

1、创建文件夹
  • hadoop fs -mkdir [-p] <path> ...
    path 为待创建的目录
    -p选项的行为与Unix mkdir -p非常相似,它会沿着路径创建父目录。
hadoop fs -mkdir /itcast
  • 1
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 当前客户端上的目录/文件 HDFS上的目标目录,下面给出一个例子
hadoop fs -put zookeeper.out /itcast # 经典形式
hadoop fs -put file:///etc/profile hdfs://node1:8020/itcast # 完整形式
  • 1
  • 2
  • 3
4、查看HDFS文件内容
  • hadoop fs -cat <src> ...
    读取指定文件全部内容,显示在标准输出控制台。
    注意:对于大文件内容读取,慎重
hadoop fs -cat /itcast/zookeeper.out
  • 1
5、下载HDFS文件
  • hadoop fs -get [-f] [-p] <src> ... <localdst>
    下载文件到本文件系统指定目录,localdst必须是目录
    -f 覆盖目标文件(已存在下)
    -p 保留访问和修改时间,所有权和权限。
6、拷贝HDFS文件
  • hadoop fs -cp [-f] …
    -f 覆盖目标文件(已存在下)
7、追加数据到HDFS文件中
  • hadoop fs -appendToFile …
    将所有给定本地文件的内容追加到给定dst文件。
    dst如果文件不存在,将创建该文件。
    如果为-,则输入为从标准输入中读取。
    应用场景:小文件合并
# 追加内容到文件尾部appendToFile
echo 1 > 1.txt
echo 2 > 2.txt
echo 3 > 3.txt
hadoop fs -put 1.txt /                     # 上传1.txt
hadoop fs -appendToFile 2.txt 3.txt /1.txt # 将客户端的2.txt,3.txt追加到HDFS文件1.txt中
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
8、HDFS数据移动操作
  • hadoop fs -mv <src> ... <dst>
    移动文件到指定文件夹下
    可以使用该命令移动数据,重命名文件的名称
HDFS shell其他命令
  • 命令官方指导文档
    https://hadoop.apache.org/docs/r3.3.0/hadoop-project-dist/hadoop-common/FileSystemShell.html
  • 友情提示
    常见的操作自己最好能够记住,其他操作可以根据需要查询文档使用。
    命令属于多用多会,孰能生巧,不用就忘
    在这里插入图片描述
    在这里插入图片描述

2.5 HDFS工作流程与机制

2.5.1 HDFS集群角色与职责

官方架构图

在这里插入图片描述

主角色:namenode
  • NameNode是Hadoop分布式文件系统的核心,架构中的主角色。
  • NameNode维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息。
  • 基于此,NameNode成为了访问HDFS的唯一入口
  • NameNode内部通过内存磁盘文件两种方式管理元数据。
  • 其中磁盘上的元数据文件包括Fsimage内存元数据镜像文件和edits log(Journal)编辑日志。
    在这里插入图片描述
从角色:datanode
  • DataNode是Hadoop HDFS中的从角色,负责具体的数据块存储
  • DataNode的数量决定了HDFS集群的整体数据存储能力。通过和NameNode配合维护着数据块。
主角色辅助角色:secondarynamenode
  • Secondary NameNode充当NameNode的辅助节点,但不能替代NameNode。
  • 主要是帮助主角色进行元数据文件的合并动作。可以通俗的理解为主角色的“秘书”。
    在这里插入图片描述
namenode职责
  • NameNode仅存储HDFS的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件,不存储实际数据。
  • NameNode知道HDFS中任何给定任何的块列表及其位置。使用此信息NameNode知道如何从块中构建文件。
  • NameNode不持久化存储每个文件中各个块所在的datanode的位置信息,这些信息会在系统启动时从DataNode重建。
  • NameNode是Hadoop集群中的单点故障
  • NameNode所在机器通常会配置有大量内存(RAM)
datanode职责
  • DataNode负责最终数据块block的存储。是集群的从角色,也成为Slave。
  • DataNode启动时,会将自己注册到NameNode并汇报自己负责持有的块列表。
  • 当某个DataNode关闭时,不会影响数据的可用性。NameNode将安排由其他DataNode管理的块进行副本复制。
  • DataNode所在机器通常配置有大量的硬盘空间,因为实际数据存储在DataNode中。

2.5.2 HDFS写数据流程(上传文件)

核心概念–Pipeline管道
  • Pipeline,中文翻译为管道。这是HDFS在上传文件写数据过程中采用的一种数据传输方式。
  • 客户端将数据块写入第一个数据节点,第一个数据节点保存数据之后再将块复制到第二个数据节点,后者保存后将其复制到第三个数据节点。
  • 为什么datanode之间采用pipeline线性传输,而不是一次给三个datanode拓扑式传输呢?
  • 因为数据以管道的方式,顺序地沿着一个方向传输,这样能够充分利用每个机器的带宽,避免网络瓶颈和高延迟时的连接,最小化推送所有数据的延时
  • 在线性推送模式下,每台机器所有的出口宽带都用于以最快的速度传输数据,而不是在多个接受者之间分配宽带。
    在这里插入图片描述
核心概念–ACK应答响应
  • ACK(Acknowledge character)即是确认字符,在数据通信中,接收方发给发送方的一种传输类控制字符。表示发来的数据已确认接收无误。
  • 在HDFS pipeline管道传输数据的过程中,传输的反方向会进行ACK校验,确保数据传输安全。

在这里插入图片描述

核心概念–默认3副本存储策略
  • 默认副本存储策略是由BlockPlacementPolicyDefault指定。
  • 第一块副本:优先客户端本地,否则随机
  • 第二块副本:不同于第一块副本的不同机架
  • 第三块副本:第二块副本相同机架不同机器
    在这里插入图片描述
写数据完整流程(讲的有点粗糙了)
  1. HDFS客户端创建对象实例DistributedFileSystem,该对象封装了与HDFS文件系统操作的相关方法。
  2. 调用DistributedFileSystem对象的create()方法,通过RPC请求NameNode创建文件。
    NameNode执行各种检查判断:目标文件是否存在、父目录是否存在、客户端是否具有创建该文件的权限。检查通过,NameNode就会为本次请求记下一条目录,返回FSDataOutputStream输出流对象给客户端用于写数据。
  3. 客户端通过FSDataOutputStream输出流开始写入数据。
  4. 客户端写入数据时,将数据分成一个个数据包(packet 默认64k),内部组件DataStreamer请求NameNode挑选出适合存储数据副本的一组DataNode地址,默认是3副本存储。
    DataStreamer将数据包流式传输到pipeline的第一个DataNode,该DataNode存储数据包并将它发送到pipeline的第二个DataNode。同样,第二个DataNode存储数据包并发送给第三个(也是最后一个)DataNode。
  5. 传输的反方向上,会通过ACK机制校验数据包传输是否成功;
  6. 客户端完成数据写入后,在FSDataOutputStream输出流上调用close()方法关闭。
  7. DistributedFileSystem联系NameNode告知其文件写入完成,等待NameNode确认。
    因为namenode已经知道文件由哪些块组成(DataStream请求分配数据块),因此仅需等待最小复制块即可成功返回。最小复制数是由参数dfs.namenode.replicatin.min指定,默认是1。

在这里插入图片描述

2.5.3 HDFS读数据流程(下载文件)

读数据完整流程
  1. HDFS客户端创建对象实例DistributedFileSystem,调用该对象的open()方法来打开希望读取的文件。
  2. DistributedFileSystem使用RPC调用namenode来确定文件中前几个块的块位置(分批次读取)信息
    对于每个块,namenode返回具有该块所有副本的datanode位置地址列表,并且该地址列表是排序好的,与客户端的网络拓扑距离近的排序靠前
  3. DistributedFileSystem将FSDataInputStream输入流返回到客户端以供其读取数据。
  4. 客户端在FSDataInputStream输入流上调用read()方法。然后,已存储DataNode地址的InputStream连接到文件中第一个块的最近的DataNode。数据从DataNode流回客户端,结果客户端可以在流上重复调用read()。
  5. 当该块结束时,FSDataInputStream将关闭与DataNode的连接,然后寻找下一个block块的最佳datanode位置。这些操作对用户来说是透明的。所以用户感觉起来它一直在读取一个连续的流。
    客户端从流中读取数据时,也会根据需要询问NameNode来检索下一批数据块的DataNode位置信息
  6. 一旦客户端完成读取,就对FSDataInputStream调用close()方法。
    在这里插入图片描述

第三章:Hadoop MapReduce与Hadoop YARNp(p38-p50)

学习目标
1.理解分布式计算分而治之的思想
2.学会提交MapReduce程序
3.掌握MapReduce执行流程
4.掌握YARN功能与架构组件
5.掌握程序提交YARN交互流程
6.理解YARN调度策略

3.1 Hadoop MapReduce

3.1.1 理解MapReduce思想

  • MapReduce的思想核心是“先分再合,分而治之”。
  • 所谓“分而治之”就是把一个复杂的问题,按照一定的“分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的结果,然后把各部分的结果组成整个问题的最终结果
  • 这种思想来源于日常生活与工作时的经验。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想,而不是自己原创。
  • Map表示第一阶段,负责“拆分”:即把复杂的任务分解为若干个“简单的子任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系
  • Reduce表示第二阶段,负责“合并”:即对map阶段的结果进行全局汇总。
  • 这两个阶段合起来正是MapReduce思想的体现。

3.1.2 Hadoop MapReduce设计构思

(1)如何对付大数据处理场景
  • 对相互间不具有计算依赖关系的大数据计算任务,实现并行最自然的方法就是采取MapReduce分而治之的策略。
  • 首先Map阶段进行拆分,把大数据拆分成若干份小数据,多个程序同时并行计算产生中间结果;然后是Reduce聚合阶段,通过程序对并行的结果进行最终的汇总计算,得出最终的结果。
  • 不可拆分的计算任务或相互间有依赖关系的数据无法进行并行计算!
    在这里插入图片描述
(2)构建抽象编程模型
  • MapReduce借鉴了函数式语言中的思想,用MapReduce两个函数提供了高层的并行编程抽象模型。
    map:对一组数据元素进行某种重复式的处理;
    reduce:对Map的中间结果进行某种进一步的结果整理。
  • MapReduce中定义了如下的Map和Reduce两个抽象的编程接口,由用户去编程实现:
    map: (k1; v1) -> (k2; v2)
    reduce: (k2; [v2]) -> (k3; v3)
  • 通过以上两个编程接口,大家可以看出MapReduce成立的数据类型是<key, value>键值对
    在这里插入图片描述
    在这里插入图片描述
(3)统一框架、隐藏底层细节
  • 如何提供统一的计算框架,如果没有统一封装底层细节,那么程序员则需要考虑诸如数据存储、划分、分发、结果收集、错误恢复等诸多细节;为此,MapReduce设计并提供了统一的计算框架,为程序员隐藏了绝大多数系统层面的处理细节。
  • MapReduce最大的亮点在于通过抽象模型和计算框架把需要做什么(what need to do)与具体怎么做(how to do)分开了,为程序员提供一个抽象和高层的编程接口和框架。
  • 程序员仅需要关心其应用层的具体计算问题,仅需编写少量的处理应用本身计算问题的业务程序代码
  • 至于如何具体完成这个并行计算任务所相关的诸多系统层细节被隐藏起来,交给计算框架去处理:从分布代码的执行,到大到数千小到单个节点的自动调度使用。

3.1.3 Hadoop MapReduce介绍

分布式计算概念
  • 分布式计算是一种计算方法,和集中式计算是相对的。
  • 随着计算技术的发展,有些应用需要非常巨大的计算能力才能完成,如果采用集中式计算,需要耗费相当长的时间来完成。
  • 分布式计算将该应用分解成许多小的部分,分配给多台计算机进行处理。这样可以节约整体计算时间,大大提高计算效率。
    在这里插入图片描述
MapReduce介绍
  • Hadoop MapReduce是一个分布式计算框架,用于轻松编写分布式应用程序,这些应用程序以可靠,容错的方式并行处理大型硬件集群(数千个节点)上的大量数据(多TB数据集)。
  • MapReduce是一种面向海量数据处理的一种指导思想,也是一种用于对大规模数据进行分布式计算的编程模型。
MapReduce产生背景
  • MapReduce最早由Google于2004年在一篇名为《MapReduce:SimplifiedData Processingon Large Clusters》的论文中提出。
  • 论文中谷歌把分布式数据处理的过程拆分为Map和Reduce两个操作函数(受到函数式编程语言的启发),随后被Apache Hadoop参考并作为开源版本提供支持,叫做Hadoop MapReduce。
  • 它的出现解决了人们在最初面临海量数据束手无策的问题,同时它还是易于使用和高度可扩展的,使得开发者无需关心分布式系统底层的复杂性即可很容易的编写分布式数据处理程序,并在成千上万台普通的商用服务器中运行。
MapReduce特点
  • 易于编程
    Mapreduce框架提供了用于二次开发的接口;简单地实现一些接口,就可以完成一个分布式程序。任务计算交给计算框架去处理,将分布式程序部署到hadoop集群上运行,集群节点可以扩展到成百上千个等。
  • 良好的扩展性
    当计算机资源不能得到满足的时候,可以通过增加机器来扩展它的计算能力。基于MapReduce的分布式计算得特点可以随节点数目增长保持近似于线性的增长,这个特点是MapReduce处理海量数据的关键,通过将计算节点增至几百或者几千可以很容易地处理数百TB甚至PB级别的离线数据。
  • 高容错性
    Hadoop集群是分布式搭建和部署得,任何单一机器节点宕机了,它可以把上面的计算任务转移到另一个节点上运行,不影响整个作业任务得完成,过程完全是由Hadoop内部完成的。
  • 适合海量数的离线处理
    可以处理GB、TB和PB级别的数据量
MapReduce局限性
  • MapReduce虽然有很多的优势,也有相对得局限性,局限性不代表不能做,而是在有些场景下实现的效果比较差,并不适合用MapReduce来处理,主要表现在以下结果方面:
  • 实时计算性能差
    MapReduce主要应用于离线作业,无法作到秒级或者是亚秒级得数据响应。
  • 不能进行流式计算
    流式计算特点是数据是源源不断得计算,并且数据是动态的;而MapReduce作为一个离线计算框架,主要是针对静态数据集得,数据是不能动态变化得。
MapReduce实例进程

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

  • MRAppMaster(只有一个):负责整个MR程序的过程调度及状态协调
  • MapTask(可能多个):负责map阶段的整个数据处理流程
  • ReduceTask(可能多个):负责reduce阶段的整个数据处理流程
    在这里插入图片描述
阶段组成
  • 一个MapReduce编程模型中只能包含一个Map阶段和一个Reduce阶段,或者只有Map阶段;
  • 不能有诸如多个map阶段、多个reduce阶段的情景出现;
  • 如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序串行运行。
    在这里插入图片描述
MapReduce数据类型
  • 注意:整个MapReduce程序中,数据都是以kv键值对的形式流转的;
  • 在实际编程解决各种业务问题中,需要考虑每个阶段的输入输出kv分别是什么;
  • MapReduce内置了很多默认属性,比如排序、分组等,都和数据的k有关,所以说kv的类型数据确定及其重要的。

3.1.4 Hadoop MapReduce官方示例

概述
  • 一个最终完整版本的MR程序需要用户编写的代码Hadoop自己实现的代码整合在一起才可以;
  • 其中用户负责map、reduce两个阶段的业务问题,Hadoop负责底层所有的技术问题;
  • 由于MapReduce计算引擎天生的弊端(慢),当下企业中直接使用率已经日薄西山了,所以在企业中工作很少涉及到MapReduce直接编程,但是某些软件的背后还依赖MapReduce引擎。
  • 可以通过官方提供的示例来感受MapReduce及其内部执行流程,因为后续的新的计算引擎比如Spark,当中就有MapReduce深深的影子存在。
示例说明
  • 示例程序路径:/export/server/hadoop-3.3.0/share/hadoop/mapreduce/
  • 示例程序:hadoop-mapreduce-examples-3.3.0.jar
  • MapReduce程序提交命令:[hadoop jar|yarn jar] hadoop-mapreduce-examples-3.3.0.jar args…
  • 提交到哪里去?提交到YARN集群上分布式执行
案例:评估圆周率π(PI)的值

圆周率π大家都不陌生,如何去估算π的值呢?
Hadoop MapReduce示例提供了Monte Carlo方法计算圆周率。
在这里插入图片描述

  • 运行MapReduce程序评估一下圆周率的值,执行中可以去YARN页面上观察程序的执行的情况。
    第一个参数:pi表示MapReduce程序执行圆周率计算任务;
    第二个参数:用于指定map阶段运行的任务task次数,并发度,这里是10;
    第三个参数:用于指定每个map任务取样的个数,这里是50。
hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 2 2
  • 1

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

案例:wordcount单词词频统计

WordCount中文叫做单词统计、词频统计;
指的是统计指定文件中,每个单词出现的总次数

WordCount概述
  • WordCount算是大数据计算领域经典的入门案例,相当于Hello World。
  • 虽然WordCount业务及其简单,但是希望能够通过案例感受背后MapReduce的执行流程和默认的行为机制,这才是关键。
    在这里插入图片描述
WordCount编程实现思路
  • map阶段的核心:把输入的数据经过切割,全部标记1,因此输出就是<单词,1>。
  • shuffle阶段核心:经过MR程序内部自带默认的排序分组等功能,把key相同的单词会作为一组数据构成新的kv对
  • reduce阶段核心:处理shuffle完的一组数据,该组数据就是该单词所有的键值对。对所有的1进行累加求和,就是单词的总次数。
    在这里插入图片描述
WordCount程序提交
  • 上传课程资料中的文本文件1.txt到HDFS文件系统的/input目录下,如果没有这个目录,使用shell创建(也可以使用WebUI来上传)
hadoop fs -mkdir /input
hadoop fs -put 1.txt /input
  • 1
  • 2
  • 准备好之后,执行官方MapReduce实例,对上述文件进行单词次数统计
    第一个参数:wordcount表示执行单词统计任务;
    第二个参数:指定输入文件的路径;
    第三个参数:指定输出结果的路径(该路径不能已存在);
 hadoop jar hadoop-mapreduce-examples-3.3.0.jar wordcount /input /output
  • 1

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

3.1.5 Map阶段执行流程

MapReduce整体执行流程图

在这里插入图片描述

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合并,成为一个文件。
    在这里插入图片描述

3.1.6 Reduce阶段执行流程

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

3.1.7 Shuffle机制

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中频繁涉及到数据在内存、磁盘之间的多次往复

3.2 Hadoop YARN

3.2.1 Hadoop YARN介绍

YARN简介
  • Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的Hadoop资源管理器。
  • YARN是一个通用资源管理系统调度平台,可为上层应用提供统一的资源管理和调度。
  • 它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
    在这里插入图片描述
YARN功能说明
  • 资源管理系统:集群的硬件资源,和程序运行相关,比如内存CPU等。(磁盘由HDFS管理)
  • 调度平台:多个程序同时申请计算资源如何分配,调度的规则(算法)。
  • 通用:不仅仅支持MapReduce程序,理论上支持各种计算程序。YARN不关心你干什么,只关心你要资源,在有的情况下给你,用完之后还我。
YARN概述
  • 可以把Hadoop YARN理解为相当于一个分布式的操作系统平台,而MapReduce等计算程序则相当于运行于操作系统之上的应用程序,YARN为这些程序提供运算所需的资源(内存、CPU等)。
  • Hadoop能有今天这个地位,YARN可以说是功不可没。因为有了YARN ,更多计算框架可以接入到HDFS中,而不单单是MapReduce,正是因为YARN的包容,使得其他计算框架能专注于计算性能的提升
  • HDFS可能不是最优秀的大数据存储系统,但却是应用最广泛的大数据存储系统,YARN功不可没。

3.2.2 Hadoop YARN架构、组件

YARN官方架构图

在这里插入图片描述

官方架构图中出现的概念

在这里插入图片描述

YARN3大组件
  • ResourceManager(RM)
    YARN集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者
    接收用户的作业提交,并通过NM分配、管理各个机器上的计算资源。
  • NodeManager(NM)
    YARN中的从角色,一台机器上一个,负责管理本机器上的计算资源
    根据RM命令,启动Container容器、监视容器的资源使用情况。并且向RM主角色汇报资源使用情况。
  • ApplicationMaster(AM)
    用户提交的每个应用程序均包含一个AM。
    应用程序内的“老大”,负责程序内部各阶段的资源申请,监督程序的执行情况。

AM程序是任何程序在YARN上运行启动的第一个进程

3.2.3 程序提交YARN交互流程

核心交互流程
  • MR作业提交 Client–>RM
  • 资源的申请 MRAppMaster–>RM
  • MR作业状态汇报 Container(Map|Reduce Task)–>Container(MrAppMaster)
  • 节点的状态汇报 NM–>RM
整体概述

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

  • 第一个阶段是客户端申请资源启动运行本次程序的ApplicationMaster
  • 第二个阶段是由ApplicationMaster根据本次程序内部具体情况,为它申请资源,并监控它的整个运行过程,直到运行完成。
    在这里插入图片描述
MR提交YARN交互流程
  • 第1步、用户通过客户端向YARN中ResourceManager提交应用程序(比如hadoop jar提交MR程序);
  • 第2步、ResourceManager为该应用程序分配第一个Container(容器),并与对应的NodeManager通信,要求它在这个Container中启动这个应用程序的ApplicationMaster。
  • 第3步、ApplicationMaster启动成功之后,首先向ResourceManager注册并保持通信,这样用户可以直接通过ResourceManage查看应用程序的运行状态(处理了百分之几);
  • 第4步、AM为本次程序内部的各个Task任务向RM申请资源,并监控它的运行状态;
  • 第5步、一旦ApplicationMaster 申请到资源后,便与对应的NodeManager 通信,要求它启动任务。
  • 第6步、NodeManager 为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务
  • 第7步、各个任务通过某个RPC 协议向ApplicationMaster 汇报自己的状态和进度,以让ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC 向ApplicationMaster 查询应用程序的当前运行状态。
  • 第8步、应用程序运行完成后,ApplicationMaster 向ResourceManager 注销并关闭自己。

3.2.4 YARN资源调度器Scheduler

MR程序提交YARN交互流程

在这里插入图片描述

如何理解资源调度
  • 在理想情况下,应用程序提出的请求将立即得到YARN批准。但是实际中,资源是有限的,并且在繁忙的群集上,应用程序通常将需要等待其某些请求得到满足。YARN调度程序的工作是根据一些定义的策略为应用程序分配资源
  • 在YARN中,负责给应用分配资源的就是Scheduler,它是ResourceManager的核心组件之一。Scheduler完全专用于调度作业,它无法跟踪应用程序的状态。
  • 一般而言,调度是一个难题,并且没有一个“最佳”策略,为此,YARN提供了多种调度器和可配置的策略供选择
    在这里插入图片描述
调度器策略
  • 三种调度器
    FIFO Scheduler(先进先出调度器)、Capacity Scheduler(容量调度器)、Fair Scheduler(公平调度器)。
  • Apache版本YARN默认使用Capacity Scheduler
  • 如果需要使用其他的调度器,可以在yarn-site.xml中的yarn.resourcemanager.scheduler.class进行配置。
    在这里插入图片描述
FIFO Scheduler概述
  • FIFO Scheduler是Hadoop1.x中JobTracker原有的调度器实现,此调度器在YARN中保留了下来。
  • FIFO Scheduler是一个先进先出的思想,即先提交的应用先运行。调度工作不考虑优先级和范围,适用于负载较低的小规模集群。当使用大型共享集群时,它的效率较低且会导致一些问题。
  • FIFO Scheduler拥有一个控制全局的队列queue,默认queue名称为default,该调度器会获取当前集群上所有的资源信息作用于这个全局的queue。
    在这里插入图片描述
FIFO Scheduler优势、坏处
  • 优势:
    无需配置、先到先得、易于执行
  • 坏处:
    任务的优先级不会变高,因此高优先级的作业需要等待
    不适合共享集群
    在这里插入图片描述
Capacity Scheduler概述
  • Capacity Scheduler容量调度是Apache Hadoop3.x默认调度策略。该策略允许多个组织共享整个集群资源,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。
  • Capacity可以理解成一个个的资源队列,这个资源队列是用户自己去分配的。队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
    在这里插入图片描述
Capacity Scheduler资源队列划分
  • Capacity Scheduler调度器以队列为单位划分资源。简单通俗点来说,就是一个个队列有独立的资源,队列的结构和资源是可以进行配置的。
    在这里插入图片描述
Capacity Scheduler特性优势
  • 层次化的队列设计(Hierarchical Queues)
    层次化的管理,可以更容易、更合理分配和限制资源的使用。
  • 容量保证(Capacity Guarantees)
    每个队列上都可以设置一个资源的占比,保证每个队列都不会占用整个集群的资源。
  • 安全(Security)
    每个队列有严格的访问控制。用户只能向自己的队列里面提交任务,而且不能修改或者访问其他队列的任务。
  • 弹性分配(Elasticity)
    空闲的资源可以被分配给任何队列。
    当多个队列出现争用的时候,则会按照权重比例进行平衡。
    在这里插入图片描述
Fair Scheduler概述
  • Fair Scheduler叫做公平调度,提供了YARN应用程序公平地共享大型集群中资源的另一种方式。使所有应用在平均情况下随着时间的流逝可以获得相等的资源份额。
  • Fair Scheduler设计目标是为所有的应用分配公平的资源(对公平的定义通过参数来设置)。
  • 公平调度可以在多个队列间工作,允许资源共享和抢占。
    在这里插入图片描述
如何理解公平共享
  • 有两个用户A和B,每个用户都有自己的队列。
  • A启动一个作业,由于没有B的需求,它分配了集群所有可用的资源。
  • 然后B在A的作业仍在运行时启动了一个作业,经过一段时间,A,B各自作业都使用了一半的资源。
  • 现在,如果B用户在其他作业仍在运行时开始第二个作业,它将与B的另一个作业共享其资源,因此B的每个作业将拥有资源的四分之一,而A的继续将拥有一半的资源。结果是资源在用户之间公平地共享。
    在这里插入图片描述
Fair Scheduler特性优势
  • 分层队列:队列可以按层次结构排列以划分资源,并可以配置权重以按特定比例共享集群。
  • 基于用户或组的队列映射:可以根据提交任务的用户名或组来分配队列。如果任务指定了一个队列,则在该队列中提交任务。
  • 资源抢占:根据应用的配置,抢占和分配资源可以是友好的或是强制的。默认不启用资源抢占。
  • 保证最小配额:可以设置队列最小资源,允许将保证的最小份额分配给队列,保证用户可以启动任务。当队列不能满足最小资源时,可以从其它队列抢占。当队列资源使用不完时,可以给其它队列使用。这对于确保某些用户、组或生产应用始终获得足够的资源。
  • 允许资源共享:即当一个应用运行时,如果其它队列没有任务执行,则可以使用其它队列,当其它队列有应用需要资源时再将占用的队列释放出来。所有的应用都从资源队列中分配资源。
  • 默认不限制每个队列和用户可以同时运行应用的数量。可以配置来限制队列和用户并行执行的应用数量。限制并行执行应用数量不会导致任务提交失败,超出的应用会在队列中等待。

第四章:数据仓库基础与Apache Hive入门(p51-p)

学习目标
1.掌握数据仓库是什么、解决什么
2.理解数据仓库有什么特点
3.理解SQL编程语言的概念、优点
4.掌握Apache Hive架构原理、组件
5.掌握Apache Hive客户端使用
6.掌握Apache Hive的建库、建表SQL语法

4.1 数据仓库基本概念

4.1.1 数据仓库概念

数仓概念
  • 数据仓库(英语:Data Warehouse,简称数仓、DW),是一个用于存储、分析、报告的数据系统
  • 数据仓库的目的是构建面向分析的集成化数据环境,分析结果为企业提供决策支持(Decision Support)。
    在这里插入图片描述
数仓专注分析
  • 数据仓库本身并不“生产”任何数据,其数据来源于不同外部系统;
  • 同时数据仓库自身也不需要“消费”任何的数据,其结果开放给各个外部应用使用;
  • 这也是为什么叫“仓库”,而不叫“工厂”的原因。
    在这里插入图片描述

CRM:客户关系管理

4.1.2 场景案例:数据仓库为何而来

案例:数据仓库为何而来,解决什么问题的?

先下结论:为了分析数据而来,分析结果给企业决策提供支撑。
下面以中国人寿保险公司(chinalife)发展为例,阐述数据仓库为何而来?

(1)业务数据的存储问题
  • 中国人寿保险(集团)公司下辖多条业务线,包括:人寿险、财险、车险,养老险等。各业务线的业务正常运营需要记录维护包括客户、保单、收付费、核保、理赔等信息。这么多业务数据存储在哪里呢
  • 联机事务处理系统(OLTP)正好可以满足上述业务需求开展, 其主要任务是执行联机事务处理。其基本特征是前台接收的用户数据可以立即传送到后台进行处理,并在很短的时间内给出处理结果
  • 关系型数据库(RDBMS)是OLTP典型应用,比如:Oracle、MySQL、SQL Server等。在这里插入图片描述
(2)分析型决策的制定
  • 随着集团业务的持续运营,业务数据将会越来越多。由此也产生出许多运营相关的困惑:
    能够确定哪些险种正在恶化或已成为不良险种?
    能够用有效的方式制定新增和续保的政策吗?
    理赔过程有欺诈的可能吗?
    现在得到的报表是否只是某条业务线的?集团整体层面数据如何?
  • 为了能够正确认识这些问题,制定相关的解决措施,瞎拍桌子是肯定不行的。
  • 最稳妥办法就是:基于业务数据开展数据分析,基于分析的结果给决策提供支撑。也就是所谓的数据驱动决策的制定。
    在这里插入图片描述
OLTP环境开展分析可行吗?

可以,但是没必要

  • OLTP系统的核心是面向业务,支持业务,支持事务。所有的业务操作可以分为读、写两种操作,一般来说读的压力明显大于写的压力。如果在OLTP环境直接开展各种分析,有以下问题需要考虑:
  • 数据分析也是对数据进行读取操作,会让读取压力倍增
  • OLTP仅存储数周或数月的数据
  • 数据分散在不同系统不同表中,字段类型属性不统一;
数据仓库面世
  • 当分析所涉及数据规模较小的时候,在业务低峰期时可以在OLTP系统上开展直接分析。
  • 为了更好的进行各种规模的数据分析,同时也不影响OLTP系统运行,此时需要构建一个集成统一的数据分析平台。该平台的目的很简单:面向分析,支持分析,并且和OLTP系统解耦合。
  • 基于这种需求,数据仓库的雏形开始在企业中出现了。
数据仓库的构建
  • 如数仓定义所说,数仓是一个用于存储、分析、报告的数据系统,目的是构建面向分析的集成化数据环境。我们把这种面向分析、支持分析的系统称之为OLAP(联机分析处理)系统。当然,数据仓库是OLAP系统的一种实现。
  • 中国人寿保险公司就可以基于分析决策需求,构建数仓平台。
    在这里插入图片描述

4.1.3 数据仓库主要特征

  • 面向主题(Subject-Oriented):主题是一个抽象的概念,是较高层次上数据综合、归类并进行分析利用的抽象。
  • 集成性(Integrated):主题相关的数据通常会分布在多个操作型系统中,彼此分散、独立、异构。需要集成到数仓主题下
  • 非易失性(Non-Volatile):也叫非易变性。数据仓库是分析数据的平台,而不是创造数据的平台。
  • Time-Variant(时变性):数据仓库的数据需要随着时间更新,以适应决策的需要。
面向主题性(Subject-Oriented)
  • 主题是一个抽象的概念,是较高层次上企业信息系统中的数据综合、归类并进行分析利用的抽象。在逻辑意义上,它是对应企业中某一宏观分析领域所涉及的分析对象。
  • 传统OLTP系统对数据的划分并不适用于决策分析。而基于主题组织的数据则不同,它们被划分为各自独立的领域,每个领域有各自的逻辑内涵但互不交叉,在抽象层次上对数据进行完整、一致和准确的描述
    在这里插入图片描述
集成性(Integrated)
  • 主题相关的数据通常会分布在多个操作型系统中,彼此分散、独立、异构
  • 因此在数据进入数据仓库之前,必然要经过统一与综合,对数据进行抽取、清理、转换和汇总,这一步是数据仓库建设中最关键、最复杂的一步,所要完成的工作有:
  • 统一源数据中所有矛盾之处
    如字段的同名异义、异名同义、单位不统一、字长不一致等等。
  • 进行数据综合和计算
    数据仓库中的数据综合工作可以在从原有数据库抽取数据时生成,但许多是在数据仓库内部生成的,即进入数据仓库以后进行综合生成的。
  • 下图说明了保险公司综合数据的简单处理过程,其中数据仓库中与“承保”主题有关的数据来自于多个不同的操作型系统。
  • 这些系统内部数据的命名可能不同,数据格式也可能不同。把不同来源的数据存储到数据仓库之前,需要去除这些不一致。
    在这里插入图片描述
非易失性、非异变性(Non-Volatile)
  • 数据仓库是分析数据的平台,而不是创造数据的平台。我们是通过数仓去分析数据中的规律,而不是去创造修改其中的规律。因此数据进入数据仓库后,它便稳定且不会改变。
  • 数据仓库的数据反映的是一段相当长的时间内历史数据的内容,数据仓库的用户对数据的操作大多是数据查询或比较复杂的挖掘,一旦数据进入数据仓库以后,一般情况下被较长时间保留。
  • 数据仓库中一般有大量的查询操作,但修改和删除操作很少
时变性(Time-Variant)
  • 数据仓库包含各种粒度的历史数据,数据可能与某个特定日期、星期、月份、季度或者年份有关。
  • 当业务变化后会失去时效性。因此数据仓库的数据需要随着时间更新,以适应决策的需要
  • 从这个角度讲,数据仓库建设是一个项目,更是一个过程。

4.1.4 数据仓库主流开发语言–SQL

数仓开发语言概述
  • 数仓作为面向分析的数据平台,其主职工作就是对存储在其中的数据开展分析,那么如何读取数据分析呢?
  • 理论上来说,任何一款编程语言只要具备读写数据、处理数据的能力,都可以用于数仓的开发。比如大家耳熟能详的C、java、Python等;
  • 关键在于编程语言是否易学、好用、功能是否强大。遗憾的是上面所列出的C、Python等编程语言都需要一定的时间进行语法的学习,并且学习语法之后还需要结合分析的业务场景进行编码,跑通业务逻辑。
  • 不管从学习成本还是开发效率来说,上述所说的编程语言都不是十分友好的。
  • 在数据分析领域,不得不提的就是SQL编程语言,应该称之为分析领域主流开发语言
SQL语言介绍
  • 结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询更新管理数据。
  • SQL语言使我们有能力访问数据库,并且SQL是一种ANSI(美国国家标准化组织)的标准计算机语言,各大数据库厂商在生产数据库软件的时候,几乎都会去支持SQL的语法,以使得用户在使用软件时更加容易上手,以及在不同厂商软件之间进行切换时更加适应,因为大家的SQL语法都差不多。
  • SQL语言功能很强,十分简洁,核心功能只用了9个动词。语法接近英语口语,所以,用户很容易学习和使用。
    在这里插入图片描述
数仓与SQL
  • 虽然SQL语言本身是针对数据库软件设计的,但是在数据仓库领域,尤其是大数据数仓领域,很多数仓软件都会去支持SQL语法
  • 原因在于一是用户学习SQL成本低,二是SQL语言对于数据分析真的十分友好,爱不释手
结构化数据
  • 结构化数据也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。
  • 与结构化数据相对的是不适于由数据库二维表来表现的非结构化数据,包括所有格式的办公文档、XML、HTML、各类报表、图片和音频、视频信息等。
  • 通俗来说,结构化数据会有严格的行列对齐,便于解读与理解。
    在这里插入图片描述
二维表结构
  • 表由一个名字标识(例如“客户”或者“订单”),叫做表名。表包含带有数据的记录(行)。
  • 下面的例子是一个名为“Persons” 的表,包含三条记录(每一条对应一个人)和五个列(Id、姓、名、地址和城市)。
    在这里插入图片描述
SQL语法分类
  • SQL主要语法分为两个部分:数据定义语言(DDL)和数据操纵语言(DML)
  • DDL语法使我们有能力创建或删除表,以及数据库、索引等各种对象,但是不涉及表中具体数据操作:
    CREATE DATABASE -创建新数据库
    CREATE TABLE -创建新表
  • DML语法是我们有能力针对表中的数据进行插入、更新、删除、查询操作:
    SELECT -从数据库表中获取数据
    UPDATE - 更新数据库表中的数据
    DELETE - 从数据库表中删除数据
    INSERT - 向数据库表中插入数据

4.2 Apache Hive入门

4.2.1 Apache Hive概述

什么是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的最大的魅力在于用户专注于编写HQLHive帮您转换成为MapReduce程序完成对数据的分析

4.2.2 场景设计:如何模拟实现Hive功能

案例:如何模拟实现Apache Hive的功能

在HDFS文件系统上有一个文件,路径为/data/china_user.txt;
需求:统计来自于上海年龄大于25岁的用户有多少个?
在这里插入图片描述

场景目的
  • 重点理解下面两点:
    Hive能将数据文件映射成为一张表,这个映射是指什么?
    Hive软件本身到底承担了什么功能职责
映射信息记录
  • 映射在数学上称之为一种对应关系,比如y=x+1,对于每一个x的值都有与之对应的y的值。
  • 在hive中能够写sql处理的前提是针对表,而不是针对文件,因此需要将文件和表之间的对应关系描述记录清楚。”映射信息“,专业的叫法称之为元数据信息(元数据是指用来描述数据的数据metadata)。
  • 具体来看,要记录的元数据信息包括:
    表对应着哪个文件(位置信息)
    表的列对应着文件哪一个字段(顺序信息)
    文件字段之间的分隔符是什么
    在这里插入图片描述
SQL语法解析、编译
  • 用户写完sql之后,hive需要针对sql进行语法校验,并且根据记录的元数据信息解读sql背后的含义,制定执行计划。
  • 并且把执行计划转换成MapReduce程序来具体执行,把执行的结果封装返回给用户。
对Hive的理解
  • Hive能将数据文件映射成为一张表,这个映射是指什么?
    在这里插入图片描述
  • Hive软件本身到底承担了什么功能职责?
    在这里插入图片描述
最终效果
  • 基于上述分析,最终要想模拟实现的Hive的功能,大致需要下图所示组件参与其中。
  • 从中可以感受一下Hive承担了什么职责,当然,也可以把这个理解为Hive的架构图。
    在这里插入图片描述

4.2.3 Apache Hive架构、组件

Hive架构图

在这里插入图片描述

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种执行引擎。
    在这里插入图片描述

4.3 Apache Hive安装部署

4.3.1 Apache Hive元数据

什么是元数据
  • 元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
    在这里插入图片描述
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。由于还可以完全屏蔽数据库层,因此这也带来了更好的可管理性/安全性。
    在这里插入图片描述

4.3.2 Apache 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集群同步配置文件,重启生效。
# 下面内容需要写入core-site.xml。这里之前写入过了,所以略过
<!-- 整合hive 用户代理设置 -->
<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>

<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

对于分布式软件,一旦涉及到配置文件修改,必须对每台机器都配置,并且重启后生效

Step1:MySQL安装
  • 详细参考课程附件资料。
  • 注意MySQL只需要在一台机器安装并且需要授权远程访问
  • 卸载Centos7自带的mariadb:
rpm -qa|grep mariadb # 查询是否有mariadb
rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps # 删除mariadb
rpm -qa|grep mariadb # 再次查询是否有mariadb
  • 1
  • 2
  • 3
  • 安装mysql
mkdir /export/software/mysql # 创建存放安装包的目录
# 上传mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar 到上述文件夹下
tar xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar # 解包

# 执行安装
yum -y install libaio # 安装依赖

# 安装mysql
rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm mysql-community-libs-5.7.29-1.el7.x86_64.rpm mysql-community-client-5.7.29-1.el7.x86_64.rpm mysql-community-server-5.7.29-1.el7.x86_64.rpm
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • mysql初始化设置
# 初始化
mysqld --initialize

# 更改所属组
chown mysql:mysql /var/lib/mysql -R

# 启动mysql
systemctl start mysqld.service

# 查看生成的临时root密码
cat /var/log/mysqld.log

[Note] A temporary password is generated for root@localhost: .Yy5n37-mMhm
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 修改root密码 授权远程访问 设置开机自启动
mysql -u root -p # 登录mysql,密码用上面获得的临时密码
alter user user() identified by "hadoop"; # 更改root密码,设置为hadoop
# 授权,以便其他机器可以远程访问
use mysql;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'hadoop' WITH GRANT OPTION;
FLUSH PRIVILEGES; # 刷新权限
# 按Ctrl+D离开mysql

# mysql的启动和关闭 状态查看(这几个命令必须记住)
systemctl stop mysqld
systemctl status mysqld
systemctl start mysqld

# 建议设置未开机自启动服务
systemctl enable mysqld

# 查看是否已经设置自启动成功
systemctl list-unit-files | grep mysqld
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
Step2:上传解压Hive安装包(node1安装即可)
  • 上传hive安装包到/export/server/目录下,并解压安装包
tar zxvf apache-hive-3.1.2-bin.tar.gz
rm -rf apache-hive-3.1.2-bin.tar.gz
  • 1
  • 2
  • 解决Hive与Hadoop之间guava版本差异
cd /export/server/apache-hive-3.1.2-bin
rm -rf lib/guava-19.0.jar # 将hive中的低版本guava删除
cp /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/ # 将Hadoop中高版本guava复制到hive的lib目录下
  • 1
  • 2
  • 3
  • 修改配置文件
Step3:修改hive-env.sh

hive-env.sh

cd /export/server/apache-hive-3.1.2-bin/conf
mv hive-env.sh.template hive-env.sh # 重命名

vim hive-env.sh
# 在文件中添加下面内容
export HADOOP_HOME=/export/server/hadoop-3.3.0
export HIVE_CONF_DIR=/export/server/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/export/server/apache-hive-3.1.2-bin/lib
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
Step4:新增hive-site.xml

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>hadoop</value>
</property>

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

<!-- 远程模式部署metastore 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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
Step5:添加驱动、初始化
  • 上传mysql jdbc驱动mysql-connector-java-5.1.32.jar到hive安装包的lib目录下

  • 初始化元数据

cd /export/server/apache-hive-3.1.2-bin/

bin/schematool -initSchema -dbType mysql -verbos
#初始化成功会在mysql中创建74张表
  • 1
  • 2
  • 3
  • 4
  • 在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
  • 1
  • 2
  • 3
  • 4
metastore服务启动方式

(1)前台启动,进程会一直占据终端,ctrl + c结束进程,服务关闭。
可以根据需求添加参数开启debug日志,获取详细日志信息,便于排错。

# 前台启动
/export/server/apache-hive-3.1.2-bin/bin/hive --service metastore
  • 1
  • 2

(2)后台启动,输出日志信息在/root目录下nohup.out

# 后台挂起启动
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
# 结束进程
# 使用jps查看进程 使用kill-9杀死进程
# nohup命令,在默认情况下(非重定向时),会输出一个名叫nohup.out的文件到当前目录下
  • 1
  • 2
  • 3
  • 4
  • 5

4.3.3 Apache Hive客户端使用

(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服务
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2  &
  • 1
  • 2
# 将beeline和第一代客户端拷贝到node3
scp -r /export/server/apache-hive-3.1.2-bin/ root@node3:/export/server/
  • 1
  • 2
  • 在node3上使用第一代客户端连接hive
# 由于已经配置了metastore的地址,所以在node3上敲下面命令可以直接访问metastore
/export/server/apache-hive-3.1.2-bin/bin/hive
  • 1
  • 2
  • 在node3上使用beeline客户端进行连接访问。需要注意hiveserver2服务启动之后需要稍等一会才可以对外提供服务
  • Beeline是JDBC的客户端,通过JDBC协议和Hiveserver2服务进行通信,协议的地址是:jdbc:hive2://node1:10000
/export/server/apache-hive-3.1.2-bin/bin/beeline
# 与第一代客户端不同,通过beeline访问,我们还需要手动输入地址
beeline> ! connect jdbc:hive2://node1:10000   # jdbc:hive2://是协议前缀,表示通过jdbc协议与hiveserver2通信,后面是hive地址,表示hive地址在node1上,端口是10000(默认端口)
# 输入具有权限的用户,如root
beeline> root
# 没有密码,所以直接回车
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
beeline连接配置说明

在这里插入图片描述

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

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

练习:使用DataGrip软件远程连接Hiveserver2服务
  • DataGrip安装比较简单,只需要注意安装路径无中文无空格即可。
  • DataGrip分为免费的社区版和收费的专业版。
DataGrip使用教程
  • step1:windows创建工程文件夹
  • step2:DataGrip中创建新Project
  • step3:关联本地工程文件夹
  • step4:DataGrip连接Hive
  • step5:配置Hive JDBC连接驱动
  • step6:返回,配置Hiveserver2服务连接信息

4.4 Hive SQL语言:DDL建库、建表

4.4.1 Hive SQL之数据库与建库

Hive数据模型总览

在这里插入图片描述

SQL中DDL语法的作用
  • 数据定义语言(Data Definition Language,DDL),是SQL语言集中对数据库内部的对象结构进行创建,删除,修改等的操作语言,这些数据库对象包括database、table等。
  • DDL核心语法由CREATE、ALTER与DROP三个所组成。DDL并不涉及表内部数据的操作
    在这里插入图片描述
Hive中DDL语法的使用
  • Hive SQL(HQL)与标准SQL的语法大同小异,基本相通;
  • 基于Hive的设计、使用特点,HQL中create语法(尤其create table)将是学习掌握Hive DDL语法的重中之重
    建表是否成功直接影响数据文件是否映射成功,进而影响后续是否可以基于SQL分析数据。通俗点说,没有表,表没有数据,你用Hive分析什么呢?
  • 选择正确的方向,往往比盲目努力重要
  • 本课程主要讲解基础的建库与建表语法操作
数据库database
  • 在Hive中,默认的数据库叫做default,存储数据位置位于HDFS的/user/hive/warehouse下。
  • 用户自己创建的数据库存储位置是/user/hive/warehouse/database_name.db下。
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, ...)];
  • 1
  • 2
  • 3
  • 4
  • 例子:创建数据库itcast
    注意:如果需要使用location指定路径的时候,最好指向的是一个新创建的空文件夹。
create database if not exists itcast
comment "this is my first db"
with dbproperties ('createdBy'='Allen');
  • 1
  • 2
  • 3
use database
  • 选择特定的数据库
    切换当前会话使用哪一个数据库进行操作
drop database
  • 删除数据库
    默认行为是RESTRICT,这意味着仅在数据库为空时才删除它。
    要删除带有表的数据库(不为空的数据库),我们可以使用CASCADE
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
  • 1

4.4.2 Hive SQL之表与建表

表Table
  • 一个数据库通常包含一个或多个表。每个表由一个名字标识(例如“客户”或者“订单”)。
  • 表包含带有数据的记录(行)。
建表语法树(基础)
# Hive DDL 建表语法树
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name
(col_name data_type [COMMENT col_comment], ...)
[COMMENT table_comment]
[ROW FORMAT DELIMITED ...];
  • 1
  • 2
  • 3
  • 4
  • 5
注意事项
  • 蓝色字体是建表语法的关键字,用于指定某些功能。
  • [ ]中括号的语法表示可选。
  • 建表语句中的语法顺序要和语法树中顺序保持一致
  • 最低限度必须包括的语法为:CREATE TABLE table_name (col_name data_type);
    在这里插入图片描述
(1)数据类型
  • Hive数据类型指的是表中列的字段类型;
  • 整体分为两类:原生数据类型(primitive data type)和复杂数据类型(complex data type)。
  • 最常用的数据类型是字符串String数字类型Int
    在这里插入图片描述
(2)分隔符指定语法
  • ROW FORMATDELIMITED语法用于指定字段之间等相关的分隔符,这样Hive才能正确的读取解析数据。
  • 或者说只有分隔符指定正确,解析数据成功,我们才能在表中看到数据。
  • LazySimpleSerDe是Hive默认的,包含4种子语法,分别用于指定字段之间、集合元素之间、map映射kv之间、换行的分隔符号。
  • 在建表的时候可以根据数据的特点灵活搭配使用。
    在这里插入图片描述
Hive默认分隔符
  • Hive建表时如果没有row format语法指定分隔符,则采用默认分隔符;
  • 默认的分割符是'\001',是一种特殊的字符,使用的是ASCII编码的值,键盘是打不出来的。
  • 在vim编辑器中,连续按下Ctrl+v/Ctrl+a即可输入’\001’ ,显示^A
  • 在一些文本编辑器中将以SOH的形式显示
注释comment中文乱码解决办法

因为hive底层将原数据保存在mysql中,但Mysql默认编码不支持中文,它主要支持的是latin1的编码。
解决方法是:

# 登录mysql的hive3数据库
mysql -u root -p # 输入账号密码
use hive3;
# 执行以下代码修改hive3数据库存储的元数据信息
alter table hive3.COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table hive3.TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table hive3.PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8 ;
alter table hive3.PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
alter table hive3.INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

案例:Hive建表基础语法练习

1、数据类型
2、分隔符指定
3、默认分隔符

练习:一、数据类型、分隔符练习

文件archer.txt中记录了手游《王者荣耀》射手的相关信息,包括生命、物防、物攻等属性信息,其中字段之间分隔符为制表符\t,要求在Hive中建表映射成功该文件。

(1/3)数据文件
  • 字段含义:id、name(英雄名称)、hp_max(最大生命)、mp_max(最大法力)、attack_max(最高物攻)、defense_max(最大物防)、attack_range(攻击范围)、role_main(主要定位)、role_assist(次要定位)。
  • 分析一下:字段都是基本类型,字段的顺序需要注意一下。
  • 字段之间的分隔符是制表符,需要使用row format语法进行指定。
    在这里插入图片描述
(2/3)建表语句
  • 建表成功之后,在Hive的默认存储路径下就生成了表对应的文件夹;
--1、创建一张表 将射手结构化数据文件在Hive中映射成功
-- 表名
-- 字段   名称  类型  顺序
-- 字段之间的分隔符需要指定
create table itheima.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键  制表符
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • archer.txt文件上传到对应的表文件夹下。
(3/3)结果验证
  • 执行查询操作,可以看出数据已经映射成功。
  • 核心语法:row format delimited fields terminated by 指定字段之间的分隔符。
练习:二、默认分隔符使用

文件team_ace_player.txt中记录了手游《王者荣耀》主要战队内最受欢迎的王牌选手信息,字段之间使用的是\001作为分隔符,要求在Hive中建表映射成功该文件。

(1/3)数据文件
  • 字段:id、team_name(战队名称)、ace_player_name(王牌选手名字)
  • 分析一下:数据都是原生数据类型,且字段之间分隔符是\001,因此在建表的时候可以省去row format语句,因为hive默认的分隔符就是\001。
(2/3)建表语句
  • 建表成功后,把team_ace_player.txt文件上传到对应的表文件夹下。
(3/3)结果验证
  • 执行查询操作,可以看出数据已经映射成功。
  • 想一想:字段以\001分隔建表时很方便,那么采集、清洗数据时对数据格式追求有什么启发?你青睐于什么分隔符?

4.5 Hive Show语法

show语法功能
  • Show相关的语句可以帮助用户查询相关信息。
  • 比如我们最常使用的查询当前数据库下有哪些表show tables.
常用show语句
--1、显示所有数据库SCHEMAS和DATABASES的用法功能一样
show databases;
show schemas;
--2、显示当前数据库所有表
show tables;
SHOW TABLES [IN database_name]; --指定某个数据库
--3、查询显示一张表的元数据信息
desc formatted t_team_ace_player;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

第五章:Apache Hive DML语句与函数使用

学习目标
1.掌握Hive SQL Load加载数据语句
2.掌握Hive SQL Insert插入数据语句
3.掌握Hive SQL Select基础查询语句
4.掌握Hive SQL Join查询语句
5.掌握Hive SQL 常用函数的使用

5.1 Hive SQL DML语法之加载数据

5.1.1 Hive SQL-DML-Load加载数据

回顾
  • 在Hive中建表成功之后,就会在HDFS上创建一个与之对应的文件夹,且文件夹名字就是表名
  • 文件夹父路径是由参数hive.metastore.warehouse.dir控制,默认值是/user/hive/warehouse
  • 不管路径在哪里,只有把数据文件移动到对应的表文件夹下面,Hive才能映射解析成功;
  • 最原始暴力的方式就是使用hadoop fs –put|-mv等方式直接将数据移动到表文件夹下;
  • 但是,Hive官方推荐使用Load命令将数据加载到表中
Load语法功能
  • Load英文单词的含义为:加载、装载
  • 所谓加载是指:将数据文件移动到与Hive表对应的位置,移动时是纯复制、移动操作
  • 纯复制、移动指在数据load加载到表中时,Hive不会对表中的数据内容进行任何转换,任何操作。
Load语法规则
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;
  • 1
语法规则之filepath
  • filepath表示待移动数据的路径。可以指向文件(在这种情况下,Hive将文件移动到表中),也可以指向目录(在这种情况下,Hive将把该目录中的所有文件移动到表中)。
  • filepath文件路径支持下面三种形式,要结合LOCAL关键字一起考虑:
  1. 相对路径,例如:project/data1
  2. 绝对路径,例如:/user/hive/project/data1
  3. 具有schema的完整URI,例如:hdfs://namenode:9000/user/hive/project/data1
语法规则之LOCAL
  • 指定LOCAL,将在本地文件系统中查找文件路径。
  • 若指定相对路径,将相对于用户的当前工作目录进行解释;
  • 用户也可以为本地文件指定完整的URI-例如:file:///user/hive/project/data1。
  • 没有指定LOCAL关键字。
  • 如果filepath指向的是一个完整的URI,会直接使用这个URI;
  • 如果没有指定schema,Hive会使用在hadoop配置文件中参数fs.default.name指定的(不出意外,都是HDFS)。
LOCAL本地是哪里?
  • 如果对HiveServer2服务运行此命令
    本地文件系统指的是Hiveserver2服务所在机器的本地Linux文件系统,不是Hive客户端所在的本地文件系统。
    在这里插入图片描述
练习:Load Data From Local FS or HDFS

1、练习Load Data From Local FS
2、练习Load Data From HDFS
3、理解Local关键字的含义

Step1:建表
--建表student_local 用于演示从本地加载数据
create table student_local(num int,name string,sex string,age int,dept string) row format delimited fields terminated by ',';
--建表student_HDFS  用于演示从HDFS加载数据
create table student_HDFS(num int,name string,sex string,age int,dept string) row format delimited fields terminated by ',';
  • 1
  • 2
  • 3
  • 4
Step2:load加载数据
--建议使用beeline客户端 可以显示出加载过程日志信息
--step2:加载数据
-- 从本地加载数据  数据位于HS2(node1)本地文件系统  本质是hadoop fs -put上传操作
LOAD DATA LOCAL INPATH '/root/hivedata/students.txt' INTO TABLE student_local;
# Loading data to table itheima.student_local from file:/root/hivedata/students.txt

--从HDFS加载数据  数据位于HDFS文件系统根目录下  本质是hadoop fs -mv移动操作
--先把数据上传到HDFS上  hadoop fs -put /root/hivedata/students.txt /
LOAD DATA INPATH '/students.txt' INTO TABLE student_HDFS;
# Loading data to table itheima.student_hdfs from hdfs://node1:8020/students.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5.1.2 Hive SQL-DML-Insert插入数据

Insert语法功能
  • Hive官方推荐加载数据的方式:
    清洗数据成为结构化文件,再使用Load语法加载数据到表中。这样的效率更高。
  • 也可以使用insert语法把数据插入到指定的表中,最常用的配合是把查询返回的结果插入到另一张表中
insert+select
  • insert+select表示:将后面查询返回的结果作为内容插入到指定表中
  1. 需要保证查询结果列的数目和需要插入数据表格的列数目一致
  2. 如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但是不能保证转换一定成功,转换失败的数据将会为NULL。
insert into table tablename select_statement1 from from_statement;
  • 1

5.2 Hive SQL DML语法之查询数据

内容均可以参考SQL相关知识,已经学过,这里略。

5.3 Hive SQL Join关联查询

内容均可以参考SQL相关知识,已经学过,这里略。

5.4 Hive SQL中的函数使用

5.4.1 Hive函数概述及分类标准

概述
  • Hive内建了不少函数,用于满足用户不同使用需求,提高SQL编写效率:
  1. 使用show functions查看当下可用的所有函数;
  2. 通过describe function extended funcname来查看函数的使用方式。
    在这里插入图片描述
分类标准
  • Hive的函数分为两大类:内置函数(Built-in Functions)、用户定义函数UDF(User-Defined Functions):
  • 内置函数可分为:数值类型函数、日期类型函数、字符串类型函数、集合函数、条件函数等;
  • 用户定义函数根据输入输出的行数可分为3类:UDF、UDAF、UDTF。
用户定义函数UDF分类标准
  • 根据函数输入输出的行数:
    UDF(User-Defined-Function)普通函数,一进一出
    UDAF(User-Defined Aggregation Function)聚合函数,多进一出
    UDTF(User-Defined Table-Generating Functions)表生成函数,一进多出
    在这里插入图片描述
UDF分类标准扩大化
  • UDF分类标准本来针对的是用户自己编写开发实现的函数。UDF分类标准可以扩大到Hive的所有函数中:包括内置函数和用户自定义函数。
    因为不管是什么类型的函数,一定满足于输入输出的要求,那么从输入几行和输出几行上来划分没有任何问题。
    千万不要被UD(User-Defined)这两个字母所迷惑,照成视野的狭隘。
  • 比如Hive官方文档中,针对聚合函数的标准就是内置的UDAF类型。
    在这里插入图片描述

5.4.2 Hive常用的内置函数

概述
  • 内置函数(build-in)指的是Hive开发实现好,直接可以使用的函数,也叫做内建函数。
  • 官方文档地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
  • 内置函数根据应用归类整体可以分为8大种类型,我们将对其中重要的,使用频率高的函数使用进行详细讲解。
    在这里插入图片描述
(1)String Functions 字符串函数
------------String Functions 字符串函数------------
select length("itcast");
select reverse("itcast");
select concat("angela","baby");
--带分隔符字符串连接函数:concat_ws(separator, [string | array(string)]+)
select concat_ws('.', 'www', array('itcast', 'cn'));
--字符串截取函数:substr(str, pos[, len]) 或者substring(str, pos[, len])
select substr("angelababy",-2); --pos是从1开始的索引,如果为负数则倒着数
select substr("angelababy",2,2);
--分割字符串函数: split(str, regex)
select split('apache hive', ' ');
select split('apache hive', ' ')[0];
select split('apache hive', ' ')[1];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
(2)Date Functions 日期函数
-----------Date Functions 日期函数-----------------
--获取当前日期: current_date
select current_date();
--获取当前UNIX时间戳函数: unix_timestamp
select unix_timestamp();
--日期转UNIX时间戳函数: unix_timestamp
select unix_timestamp("2011-12-07 13:01:03");
--指定格式日期转UNIX时间戳函数: unix_timestamp
select unix_timestamp('20111207 13:01:03','yyyyMMdd HH:mm:ss');
--UNIX时间戳转日期函数: from_unixtime
select from_unixtime(1618238391);
select from_unixtime(0, 'yyyy-MM-dd HH:mm:ss');
--日期比较函数: datediff 日期格式要求'yyyy-MM-dd HH:mm:ss' or 'yyyy-MM-dd'
select datediff('2012-12-08','2012-05-09');
--日期增加函数: date_add
select date_add('2012-02-28',10);
--日期减少函数: date_sub
select date_sub('2012-01-1',10);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
(3)Mathematical Functions 数学函数
----Mathematical Functions 数学函数-------------
--取整函数: round 返回double类型的整数值部分(遵循四舍五入)
select round(3.1415926);
--指定精度取整函数: round(double a, int d) 返回指定精度d的double类型
select round(3.1415926,4);
--取随机数函数: rand 每次执行都不一样返回一个0到1范围内的随机数
select rand();
--指定种子取随机数函数: rand(int seed) 得到一个稳定的随机数序列
select rand(3);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
Conditional Functions 条件函数
  • 主要用于条件判断、逻辑判断转换这样的场合
-----Conditional Functions 条件函数------------------
--使用之前课程创建好的student表数据
select * from student limit 3;

--if条件判断: if(boolean testCondition, T valueTrue, T valueFalseOrNull)
select if(1=2,100,200);
select if(sex ='男','M','W') from student limit 3;

--空值转换函数: nvl(T value, T default_value)
select nvl("allen","itcast");
select nvl(null,"itcast");

--条件转换函数: CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END
select case 100 when 50 then 'tom' when 100 then 'mary' else 'tim' end;
select case sex when '男' then 'male' else 'female' end from student limit 3;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

第六章:Hadoop生态综合案例-陌陌聊天数据分析

学习目标
1.了解案例背景、目标需求、原始数据内容
2.掌握Hive数仓建库建表、ETL操作
3.掌握Hive SQL查询统计分析的基本操作
4.知道FineBI基本报表图形的使用与构建

6.1 陌陌聊天数据分析案例需求

6.1.1 背景介绍

陌陌作为聊天平台每天都会有大量的用户在线,会出现大量的聊天数据,通过对聊天数据的统计分析,可以更好的对用户构建精准的用户画像,为用户提供更好的服务以及实现高ROI平台运营推广,给公司的发展决策提供精确的数据支撑。

6.1.2 目标需求

目标

基于Hadoop和Hive实现聊天数据统计分析,构建聊天数据分析报表

在这里插入图片描述

需求
  • 统计今日总消息量
  • 统计今日每小时消息量、发送和接收用户数
  • 统计今日各地区发送消息数据量
  • 统计今日发送消息和接收消息的用户数
  • 统计今日发送消息最多的Top10用户
  • 统计今日接收消息最多的Top10用户
  • 统计发送人的手机型号分布情况
  • 统计发送人的设备操作系统分布情况

6.1.3 数据内容

  • 数据来源:聊天业务系统中导出的2021年11月01日一天24小时的用户聊天数据,以TSV文本形式存储在文件中
  • 数据大小:两个文件共14万条数据
  • 列分隔符:制表符\t
  • 数据字典及样例数据
    在这里插入图片描述

6.2 基于Hive数仓使用SQL实现需求开发

6.3 基于FineBI实现可视化报表

FineBI的介绍及安装

  • FineBI的介绍:https://www.finebi.com/
    FineBI 是帆软软件有限公司推出的一款商业智能Business Intelligence)产品。FineBI 是定位于自助大数据分析的BI 工具,能够帮助企业的业务人员和数据分析师,开展以问题导向的探索式分析。
  • FineBI的特点
  • 通过多人协作来实现最终的可视化构建
  • 不需要通过复杂代码来实现开发,通过可视化操作实现开发
  • 适合于各种数据可视化的应用场景
  • 支持各种常见的分析图表和各种数据源
  • 支持处理大数据
    在这里插入图片描述

FineBI配置数据源及数据准备

FineBI构建可视化报表

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/80289
推荐阅读
相关标签
  

闽ICP备14008679号