Hive架构,安装,使用,综合案例总结

11 篇文章 1 订阅
10 篇文章 2 订阅

什么是Hive

  • 基于Hadoop 数据保存到HDFS

  • 数据仓库工具(量比较大,访问不大,但保存历史版本,与mysql不同不是高并发)

  • 结构化的数据 映射为一张数据库表

    01,张三,89

    02,李四,91

    03,赵武,92

  • HQL查询功能 (Hive SQL)

  • 本质 把HQL翻译成MapReduce 降低使用hadoop计算的门槛

  • 主要用来做离线数据分析,开发效率比直接用MapReduce 高 但是速度还是比较慢

Hive架构

在这里插入图片描述

  • 用户接口:shell命令行 即 CIL
  • Hive将元数据存储在数据库中 (hive 和 hdfs 的映射
    • 数据库 表 都保存到哪些位置上(hdfs中的哪里
    • 表中的字段名字 类型
    • mysql derby(自带)
  • Drive
    • 负责把HQL翻译成mapreduce
    • 或者翻译成 shell 命令

Hive和Hadoop关系

  • 利用hdfs存数据 利用mapreduce算
  • Hive只需要跟 Master节点打交道 不需要集群

Hive和关系型数据库区别

Hive关系型数据库
ANSI SQL 不完全支持 支持
更新 INSERT OVERWRITE\INTO TABLE(默认) UPDATE\INSERT\DELETE
事务 不支持(默认) 支持
模式 读模式 写模式
查询语言 HQL SQL
数据存储 HDFS Raw Device or Local FS
执行 MapReduce Executor
执行延迟
子查询 只能用在From子句中 完全支持
处理数据规模
可扩展性
索引 0.8版本后加入位图索引 有复杂的索引
  • hive 离线计算 海量查询
  • hive最主要做查询 不涉及删除修改
  • 默认不支持删除修改,默认不支持事务,并不完全支持标准sql
  • sql 增删改查(CRUD)全部支持, 支撑在线业务,索引完整 支持事务

Hive 基本使用

  • 创建数据库

    • create database test;
  • 创建表

    • create table student(classNo string, stuNo string, score int) row format delimited fields terminated by ‘,’;

    • 字段不需要指定占多少字节

    • 需要通过row format delimited fileds terminated by ‘,’ 指定列的分隔符

  • 加载表数据的时候尽量使用 load data方式 把整个文件put上去

    • load data local inpath '/home/hadoop/tmp/student.txt’overwrite into table student;
  • 查看表的具体信息

    • desc formatted students;
  • 内部表和外部表

    • 内部表 managed table
      • 创建表的时候
        • CREATE TABLE 表名(字段名 字段类型,)row format delimited fields terminated by ‘,’
      • 删除表
        • 元数据和数据一起删除
      • 数据位置
        • 默认是/user/hive/warehouse
    • 外部表 external table
      • 建表语句
        • CREATE External TABLE 表名(字段名 字段类型,)row format delimited fields terminated by ‘,’ location ‘数据在hdfs上的路径’;
      • 删除表
        • 只删除元数据 数据会保留
      • 数据可以在hdfs上的任意位置
      • 外部分区表即使有分区的目录结构, 也必须要通过hql添加分区, 才能看到相应的数据
  • 分区表

    • 当数据量比较大的时候,使用分区表可以缩小查询的数据范围

    • 分区表实际上就是在表的目录下创建的子目录

    • 如果有分区表的话查询的时候,尽量要使用分区字段

    • 查看分区

      • show partitions 表名
    • 创建分区表的语句

      • create table 表名 (字段名,字段类型…) partitioned by (分区字段名 分区字段类型) row format delimited fields terminated by ‘,’ lines terminated by ‘\n’ stored as textfile;
    • 向分区表中插入数据

      • load data local inpath ‘/home/hadoop/tmp/employee.txt’ into table 表名 partition(分区字段名字=‘分区的具体值’);
    • 添加分区

      • alter table 表名 add if not exists partition(分区字段名字=‘分区的具体值’);
    • 动态分区

      • 插入数据的时候指定分区的字段,会自动帮助创建分区所对应的文件夹

      • 需要关掉默认设置

        • set hive.exec.dynamic.partition.mode=nonstrict;

sqoop 数据导入

  • 作用 数据交换工具 可以实现 数据在mysql oracle<==> hdfs之间互相传递

  • 原理 通过写sqoop 命令 把sqoop命令翻译成mapreduce 通过mapreduce连接各种数据源 实现数据的传递

  • 通过sqoop 把数据从mysql导入到hdfs

    • sqoop import --connect jdbc:mysql://mysql数据库地址:3306/数据库名字 --username root --password password --table 要导出数据的表名 -m mrjob的数量(2:有两个文件)

    • 默认会把文件导入到 hdfs上 /user/linux用户名 文件夹下

    • 通过 --target-dir指定其它位置

Hive安装

  • Hive 安装前需要安装好 JDK 和 Hadoop。配置好环境变量。

  • 下载Hive的安装包 http://archive.cloudera.com/cdh5/cdh/5/ 并解压

     tar -zxvf hive-1.1.0-cdh5.7.0.tar.gz  -C ~/app/
    
  • 进入到 解压后的hive目录 找到 conf目录, 修改配置文件

    cp hive-env.sh.template hive-env.sh
    vi hive-env.sh
    

    在hive-env.sh中指定hadoop的路径

    HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
    
  • 配置环境变量

    • vi ~/.bash_profile
      
    • export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0
      export PATH=$HIVE_HOME/bin:$PATH
      
    • source ~/.bash_profile
      
  • 根据元数据存储的介质不同,分为下面两个版本,其中 derby 属于内嵌模式。实际生产环境中则使用 mysql 来进行元数据的存储。

    • 内置 derby 版:
      bin/hive 启动即可使用
      缺点:不同路径启动 hive,每一个 hive 拥有一套自己的元数据,无法共享

    • mysql 版:

      • 上传 mysql驱动到 hive安装目录的lib目录下

        mysql-connector-java-5.*.jar

      • vi conf/hive-site.xml 配置 Mysql 元数据库信息(MySql安装见文档)

        <?xml version="1.0" encoding="UTF-8" standalone="no"?>
        <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
        <configuration>
        <!-- 插入以下代码 -->
            <property>
                <name>javax.jdo.option.ConnectionUserName</name>
                <value>hive</value><!-- 指定mysql用户名 -->
            </property>
            <property>
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>hive</value><!-- 指定mysql密码 -->
            </property>
           <property>
                <name>javax.jdo.option.ConnectionURL</name>mysql
                <value>jdbc:mysql://127.0.0.1:3306/hive</value>
            </property><!-- 指定mysql数据库地址 -->
            <property>
                <name>javax.jdo.option.ConnectionDriverName</name>
                <value>com.mysql.jdbc.Driver</value><!-- 指定mysql驱动 -->
            </property>
                <!-- 到此结束代码 -->
          <property>
            <name>hive.exec.script.wrapper</name>
            <value/>
            <description/>
          </property>
        </configuration>
        
        

UDF自定义函数

  • hive提供的函数不能满足需求的时候就可以使用自定函数

  • UDF:就是做一个mapper,对每一条输入数据,映射为一条输出数据。

  • UDAF:就是一个reducer,把一组输入数据映射为一条(或多条)输出数据

  • 使用别人已经编译好的.jar

    • 在hdfs中创建 /user/hive/lib目录
    • 把 hive目录下 lib/hive-contrib-hive-contrib-1.1.0-cdh5.7.0.jar 放到hdfs中
    • 把集群中jar包的位置添加到hive中
    • 在hive中创建临时UDF
    • 在之前的案例中使用临时自定义函数(函数功能: 添加自增长的行号)
	hadoop fs -mkdir /user/hive/lib
	hadoop fs -put hive-contrib-1.1.0-cdh5.7.0.jar /user/hive/lib/
	hive> add jar hdfs:///user/hive/lib/hive-contrib-1.1.0-cdh5.7.0.jar;
	hive> CREATE TEMPORARY FUNCTION row_sequence as 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence'
	Select row_sequence(),* from employee
  • 自己写python脚本实现udf、udaf
    • 通过hdfs向hive中ADD file
    • 加载文件到hdfs
    • hive从hdfs中加载python脚本
    • Transform
   hadoop fs -put udf.py /user/hive/lib/
   ADD FILE hdfs:///user/hive/lib/udf.py;
   SELECT TRANSFORM(fname, lname) USING 'python udf1.py' AS (fname, l_name) FROM u;

Hive综合案例

详见https://blog.csdn.net/qq_30031221/article/details/109156276

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值