1. 介绍

Apache Hive可以使用SQL来读,写,管理分布式存储的大数据集,结构可以投射到已经存储的数据上,命令行工具和JDBC驱动可以让用户连接到Hive。

2. 安装和配置

你可以下载Hive的稳定版本或者下载源码,自己编译Hive

必要:

  • Java1.7(Hive 1.2需要java1.7,Hive 0.14到1.1版本可以与java1.6工作,强烈建议用户用java1.8)
  • 最好使用Hadoop2.0。hadoop1.x并不会Hive2.0.0以后的版本

从稳定的版本安装Hive

tar -xzvf hive-x.y.z.tar.gz
cd hive-x.y.z
export HIVE_HOME={{pwd}}
export PATH=$HIVE_HOME/bin:$PATH

运行Hive

Hive使用Hadoop,所以你必须执行该命令

export HADOOP_HOME=<hadoop-install-dir>

在创建表之前,执行HDFS命令创建/tmp和/user/hive/warehouse(hive.metastore.warehouse.dir),设置目录的权限为g+w。

$HADOOP_HOME/bin/hadoop dfs -mkdir /tmp
$HADOOP_HOME/bin/hadoop dfs -mkdir /user/hive/warehouse
$HADOOP_HOME/bin/hadoop dfs -chmod g+w /tmp
$HADOOP_HOME/bin/hadoop dfs -chmod g+w /user/hive/warehouse

最好设置HIVE_HOME变量

export HIVE_HOME=<hive-install-dir>

运行Hive CLI,为了使用Hive CLI

$HIVE_HOME/bin/hive

运行HiveServer2和Beeline

从Hive2.1开始,我们需要运行schematool命令是为了初始化安装,例如,我们使用derby作为数据库类型

$HIVE_HOME/bin/schematool -dbType <db type> -initSchema

HiveServer2是从Hive0.11开始,有它自己的CLI,叫做Beeline。HiveCLI目前已经过了。HiveCLI缺少多用户,安全性,以及HiveServer2所具有的能力,为了运行HiveServer2和Beeline,执行以下命令

$HIVE_HOME/bin/hiveserver2
$HIVE_HOME/bin/beeline -u jdbc:hive2://$HS2_HOST:$HS2_PORT

Beeline需要HiveServer2的JDBC URL,默认它是(localhost:10000),地址将会是jdbc:hive2://localhost:10000

运行HCatalog

为了运行HCatalog服务(Hive 0.11.0版本以后)

$HIVE_HOME/hcatalog/sbin/hcat_server.sh

为了使用Hcatalog CLI(Hive 0.11.0版本以后)

$HIVE_HOME/hcatalog/bin/hcat

运行WebHCat(Hive 0.11.0版本以后)

$HIVE_HOME/hcatalog/sbin/webhat_server.sh

配置管理简介

  • Hive默认从<install-dir>/conf/hive-default.xml中得到配置
  • Hive的配置目录可以通过HIVE_CONF_DIR环境变量改变
  • 配置变量可以改变,通过在<install-dir>/conf/hive-site.xml中重新定义他们
  • Log4j配置是在<install-dir>/conf/hive-log4j.properties
  • Hive配置会覆盖Hadoop的配置,默认Hive继承Hadoop的配置
  • Hive配置可以通过下面的方式配置
  1. 编辑hive-site.xml文件,定义期望的变量(包括Hadoop变量)
  2. 使用set命令
  3. 调用Hive,Beeline或者HiveServer2
$ bin/hive --hiveconf x1=y1 --hiveconf x2=y2 //设置变量x1和x2
$ bin/hiveserver2 --hiveconf x1=y1 --hiveconf x2=y2 //设置服务端的变量x1和x2
$ bin/beeline --hiveconf x1=y1 --hiveconf x2=y2 //设置客户端的变量x1和x2
  • 设置HIVE_OPTS环境变量和"--hiveconf x1=y1 --hiveconf x2=y2"一样的

运行时配置

Hive查询是使用map-reduce查询,因此这种查询被Hadoop配置变量控制

HiveCLI和Beeline中的SET命令可以设置Hadoop或者Hive的配置变量,例如

beeline> SET mapred.job.tracker=myhost.mycompany.com:;
beeline> SET -v;

后面的命令会显示现在所有的设置,如果不带-v,仅仅显示不同于Hadoop基本配置的变量

Hive, Map-Reduce和Local-Mode

Hive编译器会为查询行为很多map-reduce jobs,这些jobs会被提交到Map-Reduce集群。Map-Reduce集群被变量mapred.job.tracker控制。

这通常会指向伴随很多个节点的map-reduce集群,Hadoop也提供一个选项可以在本地运行map-reduce jobs,对于小数据量来说是非常有用的,在这种情况下,本地模式执行通常比提交job到大集群更快。反过来,本地模式仅仅运行一个reducer,所以处理大数据量会很慢。

从Hive0.7版本开始,Hive支持本地模式,为了开启本地模式,用户可以执行下面的命令

hive> SET mapreduce.framework.name=local

除此之后,还需要配置mapred.local.dir指向本地的一个有效路径(例如:/tmp/<username>/mapred/local),否则,用户将会得到一个异常

从Hive0.7版本开始,Hive也支持自动运行jobs在本地模式,相关的选项是hive.exec.mode.local.auto,hive.exec.mode.local.auto.inputbytes.max,hive.exec.mode.local.auto.tasks.max

hive> SET hive.exec.mode.local.auto=false

这个特性默认是关闭状态,如果开启的话,Hive分析每个map-reduce job的大小,如果满足下面的条件,会在本地执行jobs

  • job的输入大小小于:hive.exec.mode.local.auto.inputbytes.max(默认128MB)
  • map任务的数量小于:hive.exec.mode.local.auto.tasks.max(默认4)
  • reduce任务的数量必须是0或者1

Hive Logging

Hive使用log4j记录日志,默认logs并不会打印到CLI的控制台上。从Hive0.13.0开始,默认的log级别是INFO

----------------------------------------------------------------------------

DDL Operations

Hive DDL operations的文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

创建Hive表

hive> create table pokes(foo int, bar string)

创建一个名叫pokes的表,包含两列。第一列是integer,第二列是string

create table invites(foo int, bar string) partitioned by (ds string);

创建一个名叫invites的表,包含两列和一个分区列ds,分区列是一个虚拟列,它并不是数据本身。

默认,tables是一个文本格式,分隔符是^A(ctrl-a)

浏览表

hive> show tables;

显示所有的表

hive> show tables '.*s';

显示以s结尾的表,支持java的正则表达式

hive> describe invites;

显示一张表的所有列

修改和删除表,表名可以修改,列可以添加或者替换

hive> alter table events rename to 3koobecaf;
hive> alter table pokes add columns (new_col int);
hive> alter table invites add columns(new_col2 int comment 'a comment');
hive> alter table invites replace columns(foo int, bar string, baz int comment 'baz replaces new_col2');

replace columns替换所有存在的列,仅仅改变表的结构,并不改变数据。表必须使用native SerDe。replace columns也可以从table结构中删除列。

hive> alter table invites replace columns(foo int comment 'only keep the first column');

删除表

hive> drop table pokes;

Metadata Store

Metadata是存储在内嵌的Derby数据库,磁盘存储位置由Hive的配置变量javax.jdo.option.ConnectionURL决定,默认是位置是./metastore_db(看conf/hive-default.xml)

在默认的配置中,metadata只能同时被一个用户看

Metastore可以存储在任何支持JPOX的数据库。数据库的位置和类型可以由javax.jdo.option.ConnectionURL和javax.jdo.option.ConnectionDriverName决定。数据库schema定义在src/contrib/hive/metastore/src/model中

将来,metastore会是一个独立的服务

如果你想要metastore作为网络服务,以至于它可以被多个节点访问,你可以看:https://cwiki.apache.org/confluence/display/Hive/HiveDerbyServerMode

DML Operation

Hive DML操作文档在:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML

从文件中加载数据到Hive

hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

加载文件,这个文件包含被ctrl-a分割的两列,LOCAL标识输入文件是本地文件系统,如果LOCAL被忽略,将会寻找HDFS上的文件

OVERWRITE标识将会删除表里存在的数据,如果OVERWRITE忽略的话,数据将会追加到现在的数据集

注意:

  • load命令并没有做任何的数据验证
  • 如果文件在hdfs上,那么文件会移动hive管控的文件系统
  • Hive目录由hive.metastore.warehouse.dir(hive-default.xml)配置。建议用户在创建表之前,先创建好这个目录
hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
hive> LOAD DATA LOCAL INPATH './examples/files/kv3.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-08');

两个load将会加载数据到表invites不同的分区,表invites创建必须定义ds分区字段。

hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

上面的命令会加载hdfs的文件到表里

从HDFS中加载数据会引起移动文件或者目录,因此,操作几乎是瞬间的。

SQL Operations

Hive query操作的文档在:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select

hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';

从invites表的ds=2008-08-15的分区中查询foo列。这个结果并不会存储,仅仅显示在控制台上。

hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15';

将表invites中的分区ds='2008-08-15'的数据放到HDFS目录中,结果是存在那个目录下的。

分区表在where条件中必须有一个partition选择

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;

从pokes表中选择所有的行到本地目录

hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < ;
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(*) FROM invites a WHERE a.ds='2008-08-15';
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;

你必须使用count(1)代替count(*)

GROUP BY

hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(*) WHERE a.foo >  GROUP BY a.bar;
hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(*) FROM invites a WHERE a.foo > GROUP BY a.bar;

你必须使用count(1)代替count(*)

JOIN

hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;

https://cwiki.apache.org/confluence/display/Hive/GettingStarted

Hive教程(1)的更多相关文章

  1. HIVE教程

    完整PDF下载:<HIVE简明教程> 前言 Hive是对于数据仓库进行管理和分析的工具.但是不要被“数据仓库”这个词所吓倒,数据仓库是很复杂的东西,但是如果你会SQL,就会发现Hive是那 ...

  2. Hive 教程(二)-认知hive

    在大数据领域,hive 的位置非常重要,排名前三的大数据工具为 spark.hive.kafka 什么是hive 在大数据领域有 3 种需求场景:传输.存储.计算: hive 是一个处理海量的结构化数 ...

  3. Hive 教程(十)-UDF

    hive 虽然自带了很多函数,但是毕竟有限,无法满足所有业务场景,用户可以自定义函数来实现特定功能 UDF user define function,用户自定义函数 可以分为 3 类 UDF:一进一出 ...

  4. Hive 教程(九)-python with hive

    本文介绍用 python 远程连接 hive,此时需要 hive 启动 hiveserver2 服务 windows 下报如下错误 thrift.transport.TTransport.TTrans ...

  5. Hive 教程(八)-hiveserver2

    hive 的另外一种启动方式是 hiveserver2,它是提供了一种服务,使得我们可以远程操作 hive,就像操作 mysql 一样 hiveserver1 既然有 hiveserver2,肯定有 ...

  6. Hive 教程(七)-DML基础

    DML,Hive Data Manipulation Language,数据操作语言: 通俗理解就是数据库里与数据的操作,如增删改查,统计汇总等: Loading files into tables ...

  7. Hive 教程(六)-Hive Cli

    hive 有两种启动方式,一种是 bin/hive,一种是 hiveserver2, bin/hive 是 hive 的 shell 模式,所有任务在 shell 中完成,shell 就相当于 hiv ...

  8. Hive 教程(五)-参数配置

    配置基本操作 hive> set; 查看所有配置hive> set key: 查看某个配置hive> set key value: 设置某个配置 我们可以看到一些 hadoop 的配 ...

  9. Hive 教程(四)-分区表与分桶表

    在 hive 中分区表是很常用的,分桶表可能没那么常用,本文主讲分区表. 概念 分区表 在 hive 中,表是可以分区的,hive 表的每个区其实是对应 hdfs 上的一个文件夹: 可以通过多层文件夹 ...

随机推荐

  1. Android序列化的存储和读取

    Android中序列化的实现有两种方式:Serializable接口和Parcelable接口,本文对这两种方式进行简单的总结和使用. 一.相关概念 (一)序列化的原因(序列化能实现的效果) 1.永久 ...

  2. bzoj 2005 & 洛谷 P1447 [ Noi 2010 ] 能量采集 —— 容斥 / 莫比乌斯反演

    题目:bzoj 2005 https://www.lydsy.com/JudgeOnline/problem.php?id=2005   洛谷 P1447 https://www.luogu.org/ ...

  3. DCloud-MUI:事件管理

    ylbtech-DCloud-MUI:事件管理 极简的JS函数 1.返回顶部 1.事件绑定 除了可以使用addEventListener()方法监听某个特定元素上的事件外, 也可以使用.on()方法实 ...

  4. Gym - 101981A The 2018 ICPC Asia Nanjing Regional Contest A.Adrien and Austin 简单博弈

    题面 题意:一堆有n个石子,编号从1⋯N排成一列,两个人Adrien 和Austin玩游戏,每次可以取1⋯K个连续编号的石子,Adrien先手,谁不能取了则输 题解:k==1时,显然和n奇偶相关,当k ...

  5. 移动App服务端架构设计

      我从事手机app服务端开发现在已经是3个年头,自己也整理出了一套相对好用的服务架构,写出来,跟大家一起分享.如有不足,还请多指教. 一:基础流程图. 其实有一点还需要加上,就是对json的压缩和加 ...

  6. Docker容器的使用和连接

    在上一篇文章<Docker从安装部署到Hello World>介绍了如何在CentOS7上安装Docker.这篇文章主要介绍一下Docker容器的使用和连接. vDocker 容器使用 1 ...

  7. MarkDown流程图概要

    要素 流程元素定义: 名称=>类型: 显示名称 控制流程定义: 名称1([yes,no],right)->名称2 注意事项 流程元素定义在代码上部, 流程走向定义在代码下部 名称可以取中文 ...

  8. Elasticsearch之curl删除索引库

    关于curl创建索引库的介绍,请移步 Elasticsearch之curl创建索引库 [hadoop@djt002 elasticsearch-2.4.3]$ curl -XPUT 'http://1 ...

  9. js,jquery中.each()方法遍历如何终止循环

    用.each()方法遍历节点的时候,用“return false”只能终止当前循环并跳入下一次循环,并不能终止所有循环.代码如下: $(".days").each(function ...

  10. Last-Modified If-Modified-Since ETag If-None-Match

    Last-Modified.If-Modified-Since 有些数据随时都在变化. CNN.com 的主页经常几分钟就更新.另一方面,Google.com 的主页几个星期才更新一次 (当他们上传特 ...