Hive安装使用

栏目: 服务器 · 发布时间: 6年前

内容简介:Hive最初由Facebook开发,最后贡献给Apache基金会,最后成为了Apache的顶级项目。Hadoop的出现虽然解决了海量数据的存储,并且提供了MR计算框架。但MR的使用门槛还是比较高,所以Facebook便开发了Hive,底层依旧使用HDFS存储数据,但操作数据却不用自己写MR程序,而是使用类似SQL的语法操作数据(在Hive里面称为HQL),后台自动转换为MapReduce,极大的降低了用户的使用难度。一句话概括就是:Hadoop提供了海量数据的存储、计算方案,而Hive使得该方案实施起来更

Hive最初由Facebook开发,最后贡献给Apache基金会,最后成为了Apache的顶级项目。Hadoop的出现虽然解决了海量数据的存储,并且提供了MR计算框架。但MR的使用门槛还是比较高,所以Facebook便开发了Hive,底层依旧使用HDFS存储数据,但操作数据却不用自己写MR程序,而是使用类似 SQL 的语法操作数据(在Hive里面称为HQL),后台自动转换为MapReduce,极大的降低了用户的使用难度。一句话概括就是:Hadoop提供了海量数据的存储、计算方案,而Hive使得该方案实施起来更加方便。

官方对于Hive的介绍如下:

The Apache Hive™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage and queried using SQL syntax.

对于Hive的总体介绍先到这里,我们先安装使用一下。

安装使用

Hive的安装也比较简单,和Hadoop那些类似,这里简单介绍一下步骤(本文使用的是Hive 2.3.3版本):

  1. 确保Hadoop已经正确安装,如果还没有,可参考我之前的文章《 大数据系列一——Hadoop安装部署 》。
  2. 下载二进制安装包并解压,然后设置 HIVE_HOMEPATH 环境变量:

    export HIVE_HOME=$HOME/software/apache-hive-2.3.3-bin
    export PATH=$HIVE_HOME/bin:$PATH
  3. 在HDFS上面创建Hive需要的目录并设置权限:

    $HADOOP_HOME/bin/hadoop fs -mkdir       /tmp
    $HADOOP_HOME/bin/hadoop fs -mkdir       /user/hive/warehouse
    $HADOOP_HOME/bin/hadoop fs -chmod g+w   /tmp
    $HADOOP_HOME/bin/hadoop fs -chmod g+w   /user/hive/warehouse
  4. 初始化Hive的Metastore:

    $HIVE_HOME/bin/schematool -dbType derby -initSchema
  5. 为了后面能正常使用Hive自带的beeline,需要在$HADOOP_HOME/etc/hadoop/core-site.xml中增加如下设置(将里面的 allan 改为你自己的用户名):

    <property>
        <name>hadoop.proxyuser.allan.groups</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.allan.hosts</name>
        <value>*</value>
    </property>

    同时,为了避免用户权限问题,在$HADOOP_HOME/etc/hadoop/hdfs-site.xml中关闭HDFS的权限校验:

    <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>

至此,一个最简单的Hive就安装完成了,我们可以通过Hive提供的CLI(Command Line Interface)访问Hive。Hive目前提供了两个CLI:HiveCLI(对应 hive 命令)和Beeline(对应 beeline 命令),前者现在已经废弃,不推荐使用;现在推荐使用Beeline。所以本文也就只介绍Beeline了。使用Beeline需要先启动 HiveServer2 (( 确保HDFS正常运行 )):

$HIVE_HOME/bin/hiveserver2`。

默认HiveServer2监听端口为10000,我们使用Beeline连接Hive:

cd $HIVE_HOME
bin/beeline -u jdbc:hive2://localhost:10000

连接成功之后,我们可以执行一些HQL来感受一下Hive,后面部分再继续介绍涉及到的概念:

# 创建pokes表
0: jdbc:hive2://localhost:10000> CREATE TABLE pokes (foo INT, bar STRING);
No rows affected (0.412 seconds)
0: jdbc:hive2://localhost:10000> desc pokes;
+-----------+------------+----------+
| col_name  | data_type  | comment  |
+-----------+------------+----------+
| foo       | int        |          |
| bar       | string     |          |
+-----------+------------+----------+
2 rows selected (0.195 seconds)

# 创建invites表,该表有一个分区
0: jdbc:hive2://localhost:10000> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
No rows affected (0.158 seconds)
0: jdbc:hive2://localhost:10000> desc invites;
+--------------------------+-----------------------+-----------------------+
|         col_name         |       data_type       |        comment        |
+--------------------------+-----------------------+-----------------------+
| foo                      | int                   |                       |
| bar                      | string                |                       |
| ds                       | string                |                       |
|                          | NULL                  | NULL                  |
| # Partition Information  | NULL                  | NULL                  |
| # col_name               | data_type             | comment               |
|                          | NULL                  | NULL                  |
| ds                       | string                |                       |
+--------------------------+-----------------------+-----------------------+
8 rows selected (0.234 seconds)

# 往pokes表里面导入数据
0: jdbc:hive2://localhost:10000> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
No rows affected (1.016 seconds)

# 查看数据
0: jdbc:hive2://localhost:10000> select * from pokes limit 5;
+------------+------------+
| pokes.foo  | pokes.bar  |
+------------+------------+
| 238        | val_238    |
| 86         | val_86     |
| 311        | val_311    |
| 27         | val_27     |
| 165        | val_165    |
+------------+------------+
5 rows selected (3.1 seconds)

# 往invites表里面导入数据,并指定分区
0: jdbc:hive2://localhost:10000> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
No rows affected (0.619 seconds)
0: jdbc:hive2://localhost:10000> LOAD DATA LOCAL INPATH './examples/files/kv3.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-08');
No rows affected (0.619 seconds)
0: jdbc:hive2://localhost:10000> select * from invites limit 5;
+--------------+--------------+-------------+
| invites.foo  | invites.bar  | invites.ds  |
+--------------+--------------+-------------+
| 238          | val_238      | 2008-08-08  |
| NULL         |              | 2008-08-08  |
| 311          | val_311      | 2008-08-08  |
| NULL         | val_27       | 2008-08-08  |
| NULL         | val_165      | 2008-08-08  |
+--------------+--------------+-------------+
5 rows selected (0.362 seconds)

# 创建新db
0: jdbc:hive2://localhost:10000> create database new_db;
No rows affected (0.547 seconds)
0: jdbc:hive2://localhost:10000> use new_db;
No rows affected (0.192 seconds)
0: jdbc:hive2://localhost:10000> CREATE TABLE pokes1 (foo INT, bar STRING);
No rows affected (0.216 seconds)
0: jdbc:hive2://localhost:10000> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes1;
No rows affected (0.524 seconds)

可以看到HQL和SQL非常的类似,本文的重点不是介绍HQL,所以这里就先不细述了,有兴趣的请移步 LanguageManual .

数据模型

上一节我们看到Hive与传统的RDBMS非常的像,在Hive的数据模型里面主要包含如下一些概念:

  • 数据库(Database):和RDBMS里面的数据库、HBase里面的Namespace作用类似,主要用来做资源隔离,避免一些名字冲突。同时也可以用来做权限管理。Hive里面内置了一个默认的数据库叫 default
  • 表(Tables):和RDBMS里面的表类似,用于存放格式一样的数据。
  • 分区(Partitions):每个表可以有多个分区列,用于决定数据如何存储,以及提高查询效率。分区列是一个虚拟列,并不是表中的某一列。实际使用中最常用的是使用时间列,比如上面的 invites 表中有一个分区列 ds ,里面存储的是时间,这样当我们根据时间查询的时候,就可以只查询某些分区。需要注意的是: 分区列名为2008-08-08并不代表里面所有的数据都是这一天的,这个要应用程序自己去保证
  • 桶(Buckets):有时也称作Clusters。对于每个分区里面的数据,我们可以根据哈希函数或者表中的某一列数据再分桶。

注意:分区和桶都是可选的,一个表可以没有分区和桶。

前面提到过,Hive的数据是存储在HDFS上的(存储目录由 hive.metastore.warehouse.dir 指定,默认值为 /user/hive/warehouse ),所以不同于RDBMS,Hive数据模型中的这些概念对应到后台实质就是一些目录(bucket可能是文件)。比如,我们看一下上一节中我们建的数据库、表以及数据是如何存储的:

➜ hadoop fs -ls -R /user/hive/warehouse
drwxrwxr-x   - anonymous supergroup          0 2018-09-12 14:58 /user/hive/warehouse/invites
drwxrwxr-x   - anonymous supergroup          0 2018-09-12 14:58 /user/hive/warehouse/invites/ds=2008-08-08
-rwxrwxr-x   1 anonymous supergroup        216 2018-09-12 14:58 /user/hive/warehouse/invites/ds=2008-08-08/kv3.txt
drwxrwxr-x   - anonymous supergroup          0 2018-09-12 14:58 /user/hive/warehouse/invites/ds=2008-08-15
-rwxrwxr-x   1 anonymous supergroup       5791 2018-09-12 14:58 /user/hive/warehouse/invites/ds=2008-08-15/kv2.txt
drwxrwxr-x   - anonymous supergroup          0 2018-09-12 15:13 /user/hive/warehouse/new_db.db
drwxrwxr-x   - anonymous supergroup          0 2018-09-12 15:13 /user/hive/warehouse/new_db.db/pokes1
-rwxrwxr-x   1 anonymous supergroup       5812 2018-09-12 15:13 /user/hive/warehouse/new_db.db/pokes1/kv1.txt
drwxrwxr-x   - anonymous supergroup          0 2018-09-12 14:57 /user/hive/warehouse/pokes
-rwxrwxr-x   1 anonymous supergroup       5812 2018-09-12 14:57 /user/hive/warehouse/pokes/kv1.txt

可以看到:

  • 一个数据库对应一个目录,目录名格式为: 数据库名.db ,加后缀是为了和表名区分。因为内置的数据库 defalut 里面的表对应的目录和其它的数据库目录是平级的。而其它数据库里面的表则在数据库目录之下。
  • 一个表名对应一个目录,目录名即表名;
  • 一个分区对应一个目录,目录名即分区名,多个分区列的话就是多级目录。
  • 数据以文件的方式存储在HDFS上面。

如果我们删掉数据库、表或者分区,对应的目录也会删除(外部表例外,以后再介绍)。

本文主要介绍了Hive的安装和基本使用,以及Hive的数据模型,可以说是非常粗的从“外面”介绍了一下Hive,旨在对Hive有一个直观的感受。下一篇文章会从“里面”介绍一下Hive,有兴趣的可以关注一下。

References:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

游戏编程模式

游戏编程模式

Robert Nystrom / GPP翻组 / 人民邮电出版社 / 2016-9-1 / 61.4

游戏开发一直是热门的领域,掌握良好的游戏编程模式是开发人员的应备技能。本书细致地讲解了游戏开发需要用到的各种编程模式,并提供了丰富的示例。 全书共分20章,通过三大部分内容全面介绍了与游戏编程模式相关的各类知识点。首部分介绍了基础知识和框架;第二部分深入探索设计模式,并介绍了模式与游戏开发之间的关联;第三部分介绍了13种有效的游戏设计模式。 本书提供了丰富的代码示例,通过理论和代码示例......一起来看看 《游戏编程模式》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码