前言:
Hadoop的课程已经告一段落,基本上在零基础课程里不会再出现了,接下来的课程由若总来上,第一讲Have。
复习前一个月的课程内容:
1、Linux
Linux:
文件(*****)
权限(*****)
压缩/解压(*****)
软件安装: JDK/MySQL/Hadoop/...(*****)
2、MySQL
DDL/DML(GROUP BY/JOIN:是大数据处理中的超级杀手:shuffle) 这两个是重点
数据倾斜的案例:必然是 GROUP BY/JOIN导致的,到时候把这两个反复看熟
解决shuffle对大数据来说已经掌握了60%
3、Hadoop
hadoop阐述:狭义和广义两个角度去阐述
狭义:
海量数据的一个分布式的存储和计算框架而已 (HDFS MapReduce YARN)
广义:
描述的是整个Hadoop生态圈,Hadoop里面的框架是处理某一个场景或者是某一类场景
Hadoop访问方式: shell CLI(*****) 用命令行的方式 Java API(*****): FileSystem Web UI: HUE(HDFS/RDBMS/Hive/HBase/Solr...) HDFS/MR/YARN架构:掌握一些基础的就行,明白每个进程的结构和如何使用就行。(面试使用) 面试前准备: 架构 MapReduce 执行流程 (生产不使用,比较low) MR/Spark/...提交到YARN的执行流程:1~8步骤,举一反三
4、Hadoop的常用操作
HDFS:mkdir put get rm mv
问题:copy vs mv
MR:mr的执行流程(一定要掌握的)
YARN:mr作业跑在yarn之上,杀死yarn上的作业,提交的时候指定的一些重要的参数。
问题:使用MapReduce实现join、mapjoin的功能?
===>非常繁琐
wordcount
明白:MR是非常麻烦的
5.Hive的产生背景:
1、MR编程不便性
2、传统的RDBMS人员的需求
HDFS上面的文件就是普通的文件,它并没有schema的概念
schema:RDBMS中的表结构
people.txt <== id name age address
sql ===> 搞定海量数据的统计分析
===> 产生Hive
6.Hive
Hive 是一个使用SQL来操作分布式存储系统上面的大数据集的读写和管理操作的一个客户端,Hive它不是一个集群。
用JDBC去连接Server的话,不应该是走查询统计分析,而是去拿到统计结果,只拿结果,不做计算。
Structure:半 非
分布式系统:HDFS/S3
问题:HDFS存的是近期的数据
1min:几百G
冷数据:定期的移走S3 table的location指向S3
FaceBook开源目的是解决海量结构化日志数据的统计文件
Hive构建在Hadoop之上的数据仓库
Hive的数据就是存在 HDFS之上
计算时使用MR
弹性:线性扩展
Hive底层的执行三个引擎:
MapReduce(在Hive1.x的时代MapReduce是默认引擎,在Hive2.x标记MapReduce为过期版本)
Tez
Spark (生产环境正在使用的引擎)
Hive定义一种类似SQL的查询语言:HQL 类SQL
问题:HQL和SQL的关系?
什么关系都没有,只是语法类似,Hive抄的MySQL的语法
很多的SQL on Hadoop的语法都是和RDBMS非常类似的
Hive常用于:离线批处理
SQL ===> MR:我们输入一个SQL通过我们的HIVE工具把SQL语句翻译成MapReduce/Spark/Tez 作业,并提交到YARN上运行
问题:是否智能、执行计划(sql是如何翻译成mr作业)
高级:UDF
Hive的重点
存储格式:
1.textfile
textfile为默认格式
存储方式:行存储
磁盘开销大 数据解析开销大
压缩的text文件 hive无法进行合并和拆分
2.sequencefile
二进制文件,以<key,value>的形式序列化到文件中
存储方式:行存储
可分割 压缩
一般选择block压缩
优势是文件和Hadoop api中的mapfile是相互兼容的。
3.rcfile
存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取
读记录尽量涉及到的block最少
读取需要的列只需要读取每个row group 的头部定义。
读取全量数据的操作 性能可能比sequencefile没有明显的优势
4.orc
存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取
效率比rcfile高,是rcfile的改良版本
5.自定义格式
用户可以通过实现inputformat和 outputformat来自定义输入输出格式。
总结:
相比传统的行式存储引擎,列式存储引擎具有更高的压缩比,更少的IO操作而备受青睐(注:列式存储不是万能高效的,
很多场景下行式存储仍更加高效),尤其是在数据列(column)数很多,但每次操作仅针对若干列的情景,
列式存储引擎的性价比更高。在互联网大数据应用场景下,大部分情况下,数据量很大且数据字段数目很多,
但每次查询数据只针对其中的少数几行,这时候列式存储是极佳的选择
压缩格式:
可使用Gzip,Bzip2等压缩算法压缩,压缩后的文件不支持split
Hive阶段版本
Stinger plan:(阶段版本)
08/2007: facebook
05/2013: 0.11.0 Stinger Phase1 ORC HiveServer2
10/2013: 0.12.0 Stinger Phase2 ORC improvement
04/2014: 0.13.0 Stinger Phase3 Vectorized query engine Tez(0.13版本后才能用)
11/2014: 0.14.0 Stinger.next Phase 1 Cost-based optimizer(CBO基于成本的优化,代价的优化)
01/2015: 1.0.0 (里程碑点)
Stinger:不是一个项目或产品,而是一种提议,旨在将Hive性能提升100倍(仅仅是个参考),包括Hive的改进和Tez项目两个部分。
为什么要使用Hive
1)、简单易用
2)、扩展性好:hdfs空间不够加磁盘加机器,存储不是问题。底层MapReduce或者Spark计算处理不过来就加CPU加内存就行。
3)、统一的元数据管理
如果存放在hdfs上就仅仅就是一个文件而已,如果要进行计算,肯定要告诉这个文件meta信息,哪个文件哪个列,列的数据类型是什么
Hive不是集群,Hdoop是集群,Hive仅仅是一个客户端,没有进程,不会挂掉,提交在YARN上执行。
元数据信息:
database、table、clumn:name type、hdfs存储位置:location
元数据存放在哪里呢?
元数据信息,全部配置在MySQL里面
元数据统一管理的好处:
/ruozedata/hadoop/a.txt 将hdfs上的数据用 Hive可以处理,Sprk也可以计算处理,不需要做任何的改进。
Hive/Pig/Impala/Spark SQL/Presto:共享元数据的信息是最大的好处,Hive里面创建了一张表,可以直接用Spark SQL进行访问
问题:Hive的数据存放在哪里?
HDFS + metadata
Vectorized query engine(向量化查询引擎):
传统方式中,对数据的处理是以行为单位,依次处理的。Hive也采用了这种方案。这种方案带来的问题是,针对每一行数据,
都要进行数据解析,条件判断,方法调用等操作,从而导致了低效的CPU利用。
向量化特性,通过每次处理1024行数据,列方式处理,从而减少了方法调用,降低了CPU消耗,提高了CPU利用率。
结合JDK1.8对SIMD的支持,获得了极高的性能提升。
通过以下参数启用向量化查询引擎:
相关参考:
https://cwiki.apache.org/confluence/display/Hive/Vectorized+Query+Execution
Hive体系架构
测试环境部署架构:
客户端(client、web、idbc)发送HQL语句到Hive(可以存放数据在MySQL或者Derby)上,最后作业提交到Hadoop集群上。
问题:Hive需要集群吗?
Hive不需要集群,可以理解Hive为一个客户端。
问题:测试环境存在什么缺陷?
一个MySQL在生产中可能存在单点故障,所以需要准备两个MySQL,一个是active一个是standby,一台机器出现问题,另外一台机器运行。
Hive部署架构
Hive VS RDBMS 关系和区别 异同点
1、Hive关注的是大数据的数据库仓库的统计和分析,跑一个Hive作业跑个7~8个小时是正常的,关注点不同,处理的场景不一样
2、关系型数据库,节点数量是有限制的,Hive是构建在Hadoop之上的,可以支持成千上万的节点的,而且是分布式计算的
3、关系型数据库里面是有事物的 insert/update Hive是没有事物的,都批次执行的,都是离线导入一个批次的数据。
总结:
Hive适用于离线计算,所以它的延迟性和实时性差别很大。MySQL讲究实时性和事物,一个insert或者一个update就要commit,更新数据,Hive处理的数据都是这些数据已经和业务没有直接关联的,停机的数据,进行离线批量的操作。
Hive环境的搭建
若泽数据-J哥:hadoop-2.8.1 Apache Hadoop
生产环境建议使用: CDH HDP (兼容性非常好)大数据平台里面会用到非常非常多的组件,也会遇到非常多的兼容性的问题,Jar包
冲突,所以不介意很多组合使用Apache版本,建议使用 CDH HDP
[若泽大数据机器结构]
机器目录结构相关: hadoop/hadoop
hadoop000(192.168.199.151)
hadoop001
hadoop002
.........
/home/hadoop/
software 存放安装软件
hadoop-2.6.0-cdh5.7.0.tar.gz
hive-1.1.0-cdh5.7.0.tar.gz
data 存放测试数据
source 存放源代码
hadoop-2.6.0-cdh5.7.0-src.tar.gz
lib 存放相关开发的jar
commons-lang3-3.5.jar
hive-1.0.jarhive-train.jar
scala-train-1.0jar
spark-2.2.0-bin-2.6.0-cdh5.7.0tgz
spark-train-1.0.jar
train-scala-1.0.jar
train-scala-1.0-jar-with-dependencies.jar
app 软件安装目录
apache-flume-1.6.0-cdh5.7.0-bin
apache-maven-3.3.9