基本使用 sql语言
show databases; 查看数据库 ; 不能省略
优点:
- 学习成本低:提供了类SQL查询语言HQL,使得熟悉SQL语言的开发人员无需关心细节,可以快速上手。
- 海量数据分析:底层是基于海量计算MapReduce实现。
- 可扩展性:为超大数据集设计了计算/扩展能力(MR作为计算引擎,HDFS作为存储系统),Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
- 延展性:Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
- 良好的容错性:某个数据节点出现问题HQL仍可完成执行。
- 统计管理:提供了统一的元数据管理
-
缺点:
- Hive的HQL表达能力有限
- 迭代式算法无法表达.
- Hive的效率比较低.
- Hive自动生成的MapReduce作业,通常情况下不够智能化.
- Hive调优比较困难,粒度较粗
HIve架构设计
特别说明:hive2.2以后版本变化较大,去掉了HWI模块,HiveCLI模式也直接采用了beeline链接
从上图可以看出,Hive的体系结构分为以下几部分:
- 用户连接接口
- CLI:是指Shell命令行
- JDBC/ODBC:是指Hive的java实现,与传统数据库JDBC类似。
- WebUI:是指可通过浏览器访问Hive。
- thriftserver
- hive的可选组件,此组件是一个软件框架服务,允许客户端使用包括Java、C++、Ruby和其他很多种语 言,通过编程的方式远程访问Hive。
- 元数据
- Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括(表名、表所属的数据库名、 表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等)
- 驱动器(Driver)
- 解析器(SQLParser): 将HQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行 语法 分析,比如表是否存在、字段是否存在、SQL语义是否有误。
- 编译器(Compiler): 对hql语句进行词法、语法、语义的编译(需要跟元数据关联),编译完成后会生成一个执行计划。 hive上就是编译成mapreduce的job。
- 优化器(Optimizer): 将执行计划进行优化,减少不必要的列、使用分区、使用索引等。优化job。
- 执行器(Executer): 将优化后的执行计划提交给hadoop的yarn上执行。提交job。
- 用户提交查询等任务给Driver。
- 驱动程序将Hql发送编译器,检查语法和生成查询计划。
- 编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。
- 编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树 转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划 (MapReduce), 最后选择最佳的策略。
- 将最终的计划提交给Driver。到此为止,查询解析和编译完成。
- Driver将计划Plan转交给ExecutionEngine去执行。
- 在内部,执行作业的过程是一个MapReduce工作。执行引擎发送作业给JobTracker,在名称节点并把它 分配作业到TaskTracker,这是在数据节点。在这里,查询执行MapReduce工作。
- 与此同时,在执行时,执行引擎可以通过Metastore执行元数据操作。
- 执行引擎接收来自数据节点的结果。
- 执行引擎发送这些结果值给驱动程序。
- 驱动程序将结果发送给Hive接口。
Hive 基础应用
1。Hive基础概念
1.hive 数据模型
2。HiveSql
DDL建表说明
1 元数据:描述数据的数据
2.表分类:主要分内表和外表
1.内表:元数据和数据本身均被Hive管理。删除表则全部删除
2.外表:元数据被hive管理,数据本身存储在hdfs,不受hive管理,删除表则只删除元数据,数据本身不变。
3.建表模板
CREATE [external] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [comment col_comment], ...)]
[comment table_comment]
[partitioned by (col_name data_type [comment col_comment], ...)]
[clustered by (col_name, col_name, ...)
[sorted by (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[row format row_format]
[stored as file_format]
[location hdfs_path]
关键词解释
- external: 创建内部表还是外部表,此为内外表的唯一区分关键字。
- comment col_comment: 给字段添加注释
- comment table_comment: 给表本身添加注释
- partitioned by: 按哪些字段分区,可以是一个,也可以是多个
- clustered by col_name... into num_buckets BUCKETS:按哪几个字段做hash后分桶存储
- row format:用于设定行、列、集合的分隔符等设置
- stored as : 用于指定存储的文件类型,如text,rcfile等
- location : 设定该表存储的hdfs目录,如果不手动设定,则采用hive默认的存储路径
例子:创建学生表
CREATE TABLE student(
id string comment '学号',
username string comment '姓名',
classid int comment '班级id',
classname string comment '班级名称'
)
comment '学生信息主表'
partitioned by (come_date string comment '按入学年份分区')
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
LINES TERMINATED BY '\n'
STORED AS textfile;
5DMl语句:
加载脚本语句
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
加载HDFS数据文件的脚本
LOAD DATA INPATH '/tmp/tianliangedu/input_student_info/student.txt' OVERWRITE INTO TABLE student PARTITION (come_date=20170904);
Hive自定义函数:
1导包:
<dependencies>
<!-- 引入hadoop-cli-2.7.4依赖 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-cli</artifactId>
<version>1.2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>TlHadoopCore</finalName>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
上传jar包到hive交互中
add jar hdfs:///home/hive/tianliangedu_course/04_udf/TlHadoopCore-jar-with-dependencies.jar;
声明函数
create temporary function mask
as
'com.tianliangedu.hive.udf.ValueMaskUDF';
HIve的深入浅出
特别说明:
关于MapJoin的问题剖析
概念说明:将join的本来应该是reduce进行关联查找的过程,改成有纯map端进行关联查找。
特点特征:减少了reduce的处理,全部放到map端进行操作
减少了数据移动,提升了IO和计算效率。
应用场景:大表join小表的时候:大数据块join小数据块的时候。
为什么:在对大数据块的移动时,消耗的资源较多,所以在map端将大数据块就分为块状,然后在reduce端时将小数据块寻找大数据块。
代码实现:在Hive当中已经默认开启了该功能
关于数据切斜的问题剖析
概念说明:在大数据处理环境下,数据处理过程出现明显的切斜现象,导致任务整体迟迟不能完全结束。
特点特征:在作业或是任务在分布式执行时,经常出现大部分Task任务很快结束,而很少一部分Task,往往是一个或者一到两个一直卡在99%的情况下。典型的木桶原理,任务的执行完成时间,取决于最后一个task的完成时间。
应用场景:假倾斜场景 :数据格式设置不对,导致没有发挥分布式处理的优势
Sql编写不合理:如:select count(distinct uid)from visted log
改成:select count(1)form (select1 from user group by uid )temp;
个别机器性能较差。导致无法完成,更新硬件,是机器的硬件更加平均。给机器添加标签,启动任务指定对应的机器。
解决:代码优化就可以
真倾斜场景:记数据或是人物本身真的存在客观的倾斜性、比如:VIP会员数据的倒买倒卖问题导致极少数vip账号对应的数据量级多,而正常账号较少。
解决方法:分而治之,将倾斜的数据分类,将正常数据分类,然后进行分别计算
HIve企业应用
1数据仓库架构设计
数据仓库主要工作就是ETL
1数据架构:
架构原则:先水平分层:在垂直分主题域。
数据架构分三层:
源数据落地区(SDF:source Data FIle)
数据仓库层(DW: Data WareHouse)
数据集市层(DW:Data Market)
数据仓库层进一步细分为三层
源数据层(DWB)
细节数据层(DWD)
汇总数据层(DWS)
2.数据仓库分层介绍(水平划分)
3按主题划分
二. 数据仓库建模
- 数据模型是抽象描述现实世界的一种工具和方法,是通过抽象的实体及实体之间联系的形式,来表示现实世界中事务的相互关系的一种映射。
- 数据模型表现的抽象是实体和实体之间的关系,通过对实体和实体之间关系的定义和描述,来表达实际的业务中具体的业务关系。
- 数据仓库模型是数据模型中针对特定的数据仓库应用系统的一种特定的数据模型。
- 数据建模即数2据模型的构建和应用过程。
- 数据仓库建模即数据仓库模型的构建和应用过程。
2数据仓库建模的发展历史与意义
- 数据仓库建模的阶段发展
- 简单报表阶段:
- 该阶段系统的主要目标是解决一些日常的工作中业务人员需要的报表,以及生成一些简单的能够帮助领导进行决策所需要的汇总数据。
- 这个阶段的大部分表现形式为数据库和前端报表工具。
- 特点:简单、单一
- 数据集市阶段
- 该阶段系统主要是根据某个业务部门的需要,进行一定的数据的采集,整理,按照业务人员的需要,进行多维报表的展现,能够提供对特定业务指导的数据,并且能够提供特定的领导决策数据。
- 特点:多维度、业务场景化、按需定制性
- 数据仓库阶段
- 该阶段系统主要是按照一定的数据模型,对整个企业的数据进行采集,整理,并且能够按照各个业务部门的需要,提供跨部门的,完全一致的业务报表数据,能够通过数据仓库生成对对业务具有指导性的数据,同时,为领导决策提供全面的数据支持。
- 特点:全面、灵活、数据模型支撑、体系化
- 简单报表阶段:
- 数据建模的意义
- 进行全面的业务梳理,改进业务流程。
- 对公司进行全面梳理
- 了解公司的业务运行架构和运行状态
- 为改进公司架构、提升运营效率、指导生产提供科学支撑。
- 建立全方位的数据视角,消灭信息孤岛和数据差异。
- 提供公司数据的全面视角,不再是部门各自为战。
- 清晰化部门间的内在联系,消灭部门之间的信息孤岛。
- 保证公司全局数据的一致性,消灭差异性。
- 解决业务的变动和数据仓库的灵活性。
- 将底层技术实现与业务表达展现解耦。
- 需求的变动或新需求,可以最小化的成本达到目标。
- 帮助数据仓库系统本身的建设。
- 技术开发人员和业务需求人员较容易达成一致意见。
- 各方人员明确当前数据状况,便于做当前任务评估和长远构建规划。
- 进行全面的业务梳理,改进业务流程。