AmosCloud

Library

Have a Question?

If you have any question you can ask below or enter what you are looking for!

day07_Hive

名词解释

  • hadoop
    狭义:apache hadoop这个软件
    HDFS、MapReduce、Yarn

  • hadoop生态圈
    广义:所有可以和hadoop配合使用的软件,
    或者是需要依靠hadoop的功能才能使用的软件

hive

1.是什么?

The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL. Structure can be projected onto data already in storage. A command line tool and JDBC driver are provided to connect users to Hive.
Apache Hive™数据仓库软件有助于使用SQL读取,写入和管理驻留在分布式存储中的大型数据集。可以将结构投影到已经存储的数据上。提供了命令行工具和JDBC驱动程序以将用户连接到Hive。

2.学什么?

2.1安装

  1. 上传解压改名

  2. 修改配置文件

    • hive-env.sh

      HADOOP_HOME=/opt/hadoop-2.7.7
      export HIVE_CONF_DIR=/opt/hive-1.2.2/conf
      export HIVE_AUX_JARS_PATH=/opt/hive-1.2.2/lib
      export JAVA_HOME=/opt/jdk1.8
    • hive-site.xml

      <?xml version="1.0" encoding="UTF-8" standalone="no"?>
      <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
      <configuration>
      </configuration>
  3. 添加环境变量

    echo 'export HIVE_HOME=/opt/hive-1.2.2' >> /etc/profile
    echo 'export PATH=.:$HIVE_HOME/bin:$PATH' >> /etc/profile
    source /etc/profile
  4. 启动hive客户端

    hive

2.2与mysql的集成

  1. 发现问题:

    • hive默认存储元数据信息使用的数据库是derby
    • 这个数据库1.性能不好2.多用户访问不支持3.库文件到处生成
    • 我们决定把hive的元数据信息库换成mysql
  2. 安装mysql
    http://www.amoscloud.com/?p=1562

  3. 修改hive-site.xml添加配置,将metastore设置为mysql

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://test02:3306/metastore?createDatabaseIfNotExist=true</value>
        <description>metastore使用的mysql服务器url</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
        <description>jdbc驱动类</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
        <description>数据库用户名</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>123456</value>
        <description>数据库密码</description>
    </property>
    <property>
        <name>hive.cli.print.header</name>
        <value>true</value>
        <description>开启命令行表头显示</description>
    </property>
    <property>
        <name>hive.cli.print.current.db</name>
        <value>true</value>
        <description>开启命令行当前使用的数据库显示</description>
    </property>
    </configuration>
  4. 将mysql的驱动jar包放到hive的lib目录下

    cp mysql-connector-java-8.0.20.jar /opt/hive-1.2.2/lib
  5. 初始化schema

    schematool -initSchema -dbType mysql
  6. 重新启动Hive尝试创建数据库

    hive
    hive> show databases;
    hive> create database db1;
  • 注意:
    如果hive启动失败,或报错

    1. 先检查HDFS的运行情况
    2. 进入mysql删除metastore库,重新执行"初始化schema"

2.3 命令行操作

2.3.0 使用Shell和HDFS命令
在hive命令行中可以使用Shell和HDFS命令
#shell语法  "!shell命令;"
!clear;
#hdfs语法 "dfs -命令;"   其实就是省略了hdfs
dfs -ls /;
2.3.1 Data Definition Language (DDL 数据定义语言) 如:建库,建表
-- 创建数据库
CREATE DATABASE BD_NAME;
-- 显示数据库
show databases;
-- 过滤显示查询的数据库
show databases like 'db_*';
-- 显示数据库信息
desc database db_hive;
-- 显示数据库详细信息,extended
desc database extended db_hive;
-- 删除空数据库
drop database db_hive2;
-- 如果删除的数据库不存在,最好采用 if exists判断数据库是否存在
drop database if exists db_hive2;
-- 如果数据库不为空,可以采用cascade命令,强制删除
drop database db_hive cascade;
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
-- hive中设置表的分区
[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]
-- 指定表的格式:比如行的分隔符,列的分隔符,集合中元素的分隔符,MAP中key和value的分隔符
[ROW FORMAT row_format]
-- 设置hive表的文件类型  Hive默认使用Text格式
-- 生产环境常用orc parquet
[STORED AS file_format]
-- 设置hive表存储在HDFS上的路径
-- 比如:我们先把log日志上传到了hdfs://test01:9000/logs
-- 之后创建表指定LOCATION到/logs目录下,就可以直接读取/logs中的数据
-- 注意:使用外部表
[LOCATION hdfs_path]
-- 创建一个日志表,以month作为分区字段
CREATE table log_partition(line string)
PARTITIONED BY (month string);
-- 加载数据到log_partiton中的202007分区
load data local inpath "/root/logs/access.log-20200701" into table log_partition partition (month="202007");
-- 创建一个日志表,以year和month作为分区字段
CREATE table log_partition(line string)
PARTITIONED BY (year string,month string);
-- 加载数据到log_partiton中的202007分区
load data local inpath "/root/logs/access.log-20200701" into table log_partition partition (year="2020",month="07");
--添加单个分区
alter table log_partiton add partition(month='202009') ;
--添加多个分区
alter table dept_partition add partition(month='202001') partition(month=‘202002');
--删除单个分区
alter table dept_partition drop partition (month= '201912');
--删除多个分区
alter table dept_partition drop partition (month= '202001'), partition (month= '202002 ');
--查看都有哪些分区
show partitions log_partiton;
--查看分区字段
desc formatted dept_partition;
  • 指定行格式
row format delimited fields terminated by '\t';
行  格式    限制      字段   结束        于  制表符
表的源文件字段之间以制表符分隔
2.3.2 Data Manipulation Language(DML 数据操纵语言),如:对表中的记录操作增删改
  1. 导入方式1(loaddata)

    Load操作
    load data [local] inpath "/root/data/student.txt" [overwrite] into table student [partition (partcol1=val1,…)];
    load data:表示加载数据
    local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表
    inpath:表示加载数据的路径
    into table:表示加载到哪张表
    student:表示具体的表
    overwrite:表示覆盖表中已有数据,否则表示追加
    partition:表示上传到指定分区
  2. 导入方式2(insert)

    通过查询语句向表中插入数据(Insert)
    创建一张分区表
    create table student(id string, name string) partitioned by (month string) row format delimited fields terminated by '\t';
    基本插入数据
    insert into table  student partition(month='202005') values(‘01',‘amos');
    基本模式插入(根据单张表查询结果)
    insert overwrite table student partition(month='202004')
             select id, name from student where month='202005';
    多插入模式(根据多张表查询结果)
    from student
              insert overwrite table student partition(month='202001')
              select id, name where month='202005'
              insert overwrite table student partition(month='202002')
              select id, name where month='202005';
  3. 导入方式3(as select)

    • 可以直接通过一个select创建一个新的表
      create table dept2 as select dname,address from dept;
  4. 导入方式4(操作hdfs)
    hive表中的数据其实就是存储在dhfs某个路径上的文件,所以我们可以通过直接将文件放在指定目录的方式将数据加载到表中,注意表结构和文件格式的对应
    如果导入之后查询不到
    可以使用msck repair table xxxxx命令修复!

  5. 导出1(insert)

    Insert导出
    将查询的结果导出到本地
    insert overwrite local directory '/root/data/export/student'
           select * from student;
    将查询的结果格式化导出到本地  |
    insert overwrite local directory '/root/data/export/student1'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY '\n'
                 select * from student;
    将查询的结果导出到HDFS上(没有local)
    insert overwrite directory '/user/root/hive/warehouse/student2'
             ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY '\n'
             select * from student;
  6. 导出2

    Hadoop命令导出到本地
    dfs -get /user/hive/warehouse/student/month=201809/*  /root/data/export/student3/;
    Hive Shell 命令导出
    bin/hive -e 'select * from default.student;' > /root/data/export/student4.txt;
    Export导出到HDFS上
    export table default.student to '/user/hive/warehouse/export/student';
    import table student2 partition(month=‘202005') from '/user/hive/warehouse/export/student';
  7. hive常用两个数据导出的命令

# 将-e后面的语句提交到hive执行并将查询结果打印到控制台
hive -e "select语句"
# 将-f后面的文件提交到hive执行并将查询结果打印到控制台
hive -f 文件
# 由于hive中的数据量通常比较大,一般配合重定向使用
  • truncate截断表
2.3.3 Data Query Language(DQL 数据查询语言),如:对表中的查询操作
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
  FROM table_reference
  [WHERE where_condition]
  [GROUP BY col_list]
  [ORDER BY col_list]
  [CLUSTER BY col_list
    | [DISTRIBUTE BY col_list] [SORT BY col_list]
  ]
 [LIMIT number]
2.3.4 Data Control Language(DCL 数据控制语言),如:对用户权限的设置

2.4 jdbc

2.5 原理和概念

2.5.1 hive数据的存储
  1. HDFS

    • hive将来存储库和表的位置是HDFS的/user/hive/warehouse
    • hive将来会执行MR程序生成一些临时文件使用HDFS中的/tmp
  2. Mysql

    • hive会把库和表的结构信息记录在mysql中
  • 注意:
    • 使用HIVE必须先启动HDFS和Mysql
2.5.2 内部表和外部表
  • 查询

    desc extended 表名;
    desc formatted 表名;
    -- Table Type:  MANAGED_TABLE|EXTERNAL_TABLE
  • 内部表(管理表):
    创建表时如果不加external关键字,默认创建的就是内部表
    内部表的生命周期由hive自身管理,如果删除内部表,表中的数据也会一起删除

  • 外部表:
    加external关键字创建的叫外部表,在hive中删除外部表不影响原始数据

2.5.3 分区表
  • hive中表的真实数据在hdfs上
  • 如果一个表中的数据过多,将来对这个表进行查询时每次都要加载全表数据到MR中非常浪费资源,所以我们考虑将表进一步分成多个目录这个目录就是所谓的分区
  • 例如:
    # 本来有一个log表里面存放了若干天的数据
    /user/hive/warehouse/db1.db/log1/
                                 2020年7月28日.log
                                 2020年7月29日.log
                                 ...
    # 我们查询数据时 只要from log 就会把所有文件全部加载到MR
    # 设置分区后
    /user/hive/warehouse/db1.db/log1/year=2020/month=7/day=28/2020年7月28日.log
                                                  day=29/2020年7月29日.log
    ...
    # 这样我们查数据时只需要指定where条件就可以大大缩减MR输入数据总量

You must be logged in to post a comment.