Hive

Hive
    Hive概述
        Hive是基于Hadoop的一个数据仓库工具。可以将结构化的数据文件映射为一张表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
        Hive是建立在 Hadoop 上的数据仓库基础构架。
        它提供了一系列的工具,可以用来进行数据提取、转化、加载(ETL Extract-Transform-Load ),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。
        Hive 定义了简单的类 SQL 查询语言,称为 HiveQL,它允许熟悉 SQL 的用户查询数据。
        Hive其实是基于Hadoop的一种分布式计算框架,底层仍然是MapReduce,所以它本质上还是一种离线大数据分析工具。
        提取、转化、加载(ETL Extract-Transform-Load )
        Hive体系结构


    Hql--HIVE特点
        HQL - Hive通过类SQL的语法,来进行分布式的计算。
        Hive在执行的过程中会将HQL转换为MapReduce去执行
        针对海量数据的高性能查询和分析系统
        类SQL的查询语言
        HiveQL 灵活的可扩展性(Extendibility)
        高扩展性(Scalability)和容错性
        与 Hadoop 其他产品完全兼容
    数据仓库的特征
        1.数据仓库是多个异构数据源所集成的。
        2.数据仓库存储的一般是历史数据。 读数据,分析数据,弱事务
        3.数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
        4.数据仓库是时变的,数据存储从历史的角度提供信息。即数据仓库中的关键结构都隐式或显示地包含时间元素。
        5.数据仓库是弱事务的,因为数据仓库存的是历史数据,一般都读(分析)数据场景。
        数据库属于OLTP系统。(Online Transaction Processing)联机事务处理系统。
            OLTP是面向用户的、用于程序员的事务处理以及客户的查询处理。
            OLTP系统的访问由于要保证原子性,所以有事务机制和恢复机制。
        数据仓库属于OLAP系统。(Online Analytical Processing)联机分析处理系统。
            OLAP是面向市场的,用于知识工人(经理、主管和数据分析人员)的数据分析。
            OLAP通常会集成多个异构数据源的数据,数量巨大。
            OLAP系统一般存储的是历史数据,所以大部分都是只读操作,不需要事务。
    


            用户接口主要有三个:CLI,JDBC 和 WUI
                1.CLI,最常用的模式。实际上在>hive 命令行下操作时,就是利用CLI用户接口。
                2.JDBC,通过java代码操作,需要启动hiveserver,然后连接操作。
            Metastore
                Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,
                表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
            解释器(complier)、优化器(optimizer)、执行器(executor)组件
                这三个组件用于:HQL语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
            Hadoop
                Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成
    适用场景
        Hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不能够在大规模数据集上实现低延迟快速的查询,
        Hive 并不适合那些需要低延迟的应用
        Hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。
    配置依赖
        实现步骤
            1.安装JDK
            2.安装Hadoop
            3.配置JDK和Hadoop的环境变量
            4.下载Hive安装包
            5.解压安装hive
            6.启动Hadoop的HDFS和Yarn
            7.启动Hive
        Hive的数据,是存在HDFS里的。此外,hive有哪些数据库,每个数据库有哪些表,这样的信息称之为hive的元数据信息。
        元数据信息不存在HDFS里。而是存在关系型数据库里,hive默认用的是derby数据库来存储。即hive工作时,除了要依赖Hadoop,还要依赖关系型数据库。
        虽然我们能通过HDFS查看到hive有哪些数据库,有哪些表,以及表里的数据,但是,这不是元数据信息。HDFS最主要的是存储hive的数据信息。
        用derby数据库,也不支持并发所以我们选择用mysql数据库。目前hive支持derby和mysql两种数据库。
    内外部表
        内部表的概念
            先在hive里建一张表,然后向这个表插入数据(用insert可以插入数据,也可以通过加载外部文件方式来插入数据),这样的表称之为hive的内部表。
        外部表的概念
            通过hive创建一张表stu来管理这个文件数据。则stu这样表称之为外部表。注意,hive外部表管理的是HDFS里的某一个目录下的文件数据。
            create external table stu (id int,name string) row format delimited fields terminated by  '  '  location   '/目录路径'
        hive无论是内部表或外部表,当向HDFS对应的目录节点下追加文件时(只要格式符合),hive都可以把数据管理进来
        内部表和外部标的区别
            通过hive执行:drop  table stu 。这是删除表操作。如果stu是一个内部表,则HDFS对应的目录节点会被删除。
            如果stu是一个外部表,HDFS对应的目录节点不会删除
    Hive分区表
        Hive也支持分区表,对数据进行分区可以提高查询时的效率。
        普通表和分区表区别:有大量数据增加的需要建分区表
        create table book (id int, name string) partitioned by (category string) row format delimited fields terminated by ' ';
        在创建分区表时,partitioned字段可以不在字段列表中。生成的表中自动就会具有该字段。category 是自定义的字段
    分区表加载数据
        1)load data local inpath '/home/cn.txt' overwrite into table book partition (category='cn');
        2)load data local inpath './book_english.txt' overwrite into table book partition (category='en');
    基本数据结构类型
       


    UDF
        如果hive的内置函数不够用,我们也可以自己定义函数来使用,这样的函数称为hive的用户自定义函数,简称UDF。
        1.新建java工程,导入hive相关包,导入hive相关的lib。
        2.创建类继承UDF
        3.自己编写一个evaluate方法,返回值和参数任意。
        4.为了能让mapreduce处理,String要用Text处理。
        5.将写好的类打成jar包,上传到linux中
        6.在hive命令行下,向hive注册UDF:add jar /xxxx/xxxx.jar
        7.在hive命令行下,为当前udf起一个名字:create temporary function fname as '类的全路径名';
        8.之后就可以在hql中使用该自定义函数了。
    Hive解决数据倾斜问题
        概述
            简单来说数据倾斜就是数据的key 的分化严重不均,造成一部分数据很多,一部分数据很少的局面。
            从另外角度看数据倾斜,其本质还是在单台节点在执行那一部分数据reduce任务的时候,由于数据量大,跑不动,造成任务卡住。
            业务逻辑造成的数据倾斜会多很多,日常使用过程中,容易造成数据倾斜的原因可以归纳为几点:
            1)group by
            2)distinct count(distinct xx)
            3)join
        如何处理group by的数据倾斜问题
            1、调优参数
                set hive.groupby.skewindata=true;
                数据倾斜时负载均衡,当选项设定为true,生成的查询计划会有两个MRJob。
            Hive优化
                1)map side join
                2)join语句优化
                3)group by 优化
                4)count distinct 优化
                5)调整切片数(map任务数)
                6)JVM重利用
                7)启用严格模式
                8)关闭推测执行
    Hive的分桶表
        如何使用分桶表
        1.创建带桶的 table :
        create table teacher(class string,name string) clustered by (class) into 3 buckets row formatdelimited fields terminated by ' ';
        2.开启分桶机制:
        set hive.enforce.bucketing=true;
        3.往表中插入数据:
        insert overwrite table teacher select * from tmp;//需要提前准备好temp,从temp查询数据写入teacher
        作用及原理
            分桶的原理是根据指定的列的计算hash值模余分桶数量后将数据分开存放。
    Sqoop
        Sqoop介绍
            sqoop是Apache 提供的工具
            用于hdfs和关系型数据库之间数据的导入和导入
            可以从hdfs导出数据到关系型数据库,也可以从关系型数据库导入数据到hdfs。
        实现步骤:
            1.准备sqoop安装包,官网地址:http://sqoop.apache.org
            2.配置jdk环境变量和Hadoop的环境变量。因为sqoop在使用是会去找环境变量对应的路径,从而完整工作。
            3.sqoop解压即可使用(前提是环境变量都配好了)
            4.需要将要连接的数据库的驱动包加入sqoop的lib目录下(本例中用的是mysql数据库)
            5.利用指令操作sqoop      
    Hive的jdbc编程
        hive实现了jdbc接口,所以可以非常方便用jdbc技术通过java代码操作。但是实际应用中用的不多,一般都是在HDFS储存的文件基础上建立外部表来进行查询处理。所以jdbc了解一下即可
    Hive工作流程
       


        1.通过客户端提交一条Hql语句
        2.通过complier(编译组件)对Hql进行词法分析、语法分析。在这一步,编译器要知道此hql语句到底要操作哪张表
        3.去元数据库找表信息
        4.得到信息
        5.complier编译器提交Hql语句分析方案。
        6.1 executor 执行器收到方案后,执行方案(DDL过程)。在这里注意,执行器在执行方案时,会判断
        如果当前方案不涉及到MR组件,比如为表添加分区信息、比如字符串操作等,比如简单的查询操作等,此时就会直接和元数据库交互,然后去HDFS上去找具体数据。
        如果方案需要转换成MR job,则会将job 提交给Hadoop的JobTracker。
        6.2 MR job完成,并且将运行结果写入到HDFS上。
        6.3 执行器和HDFS交互,获取结果文件信息。
        7.如果客户端提交Hql语句是带有查询结果性的,则会发生:7-8-9步,完成结果的查询。

原文地址:https://www.cnblogs.com/Striverchen/p/10557856.html