[翻译]Hive wiki GettingStarted

##安装和配置

需求

  • java1.6
  • hadoop 0.20.x

使用发布包安装Hive

首先从Apache下载镜像下载最新的发布包(见Hive版本) 接下来解压缩tar包。这将会创建一个名字为hive-x.y.z的子目录

$ tar -xzvf hive-x.y.z.tar.gz

配置环境变量HIVE_HOME 指向安装的目录:

$ cd hive-x.y.z
$ export HIVE_HOME={{pwd}}

最后,添加$HIVE_HOME/bin 到PATH:

$ export PATH=$HIVE_HOME/bin:$PATH

###从源码创建Hive Hive SVN地址:http://svn.apache.org/repos/asf/hive/trunk

$ svn co http://svn.apache.org/repos/asf/hive/trunk hive   
$ cd hive   
$ ant clean package   
$ cd build/dist   
$ ls   
README.txt   
bin/ (all the shell scripts)   
lib/ (required jar files)   
conf/ (configuration files)   
examples/ (sample input and query files)   

接下来我们会交替使用build/dist和<install-dir>. ###使用hadoop0.23.3编译Hive

$ svn co http://svn.apache.org/repos/asf/hive/trunk hive   
$ cd hive   
$ ant clean package -Dhadoop.version=0.23.3 -Dhadoop-0.23.version=0.23.3 -Dhadoop.mr.rev=23   
$ ant clean package -Dhadoop.version=2.0.0-alpha -Dhadoop-0.23.version=2.0.0-alpha -Dhadoop.mr.rev=23

###运行Hive Hive使用了Hadoop,因此:

  • 你必须配置Hadoop环境变量信息,或者
  • export HADOOP_HOME=<hadoop-install-dir>

另外,你在Hive中创建表前必须在HDFS上创建/tmp和/user/hive/warehouse(见hive.metastore.warehouse.dir)目录,并且设置权限为 chmod g+w 完成这个步骤的命令:

$ $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

设置HIVE_HOME,虽然不是必须的,但是很有用

 $ export HIVE_HOME=<hive-install-dir>

从shell使用Hive命令行工具(CLI)

$ $HIVE_HOME/bin/hive

###运行HCatalog

从shell运行HCatalog,Hive0.11.0及以后版本:

$ $HIVE_HOME/hcatalog/sbin/hcat_server.sh

使用HCatalog命令行工具(CLI),Hive0.11.0及以后版本: $ $HIVE_HOME/hcatalog/bin/hcat 更多信息,见HCatalog手册中的从TAR包安装HCatalogHCatalog CLI ###运行WebHCat 从shell运行WebCat server,Hive0.11.0及以后版本: $ $HIVE_HOME/hcatalog/sbin/webhcat_server.sh 更多信息 见WebHCat手册安装WebHCat

###配置管理概述

  • Hive默认配置<install-dir>/conf/hive-default.xml
  • 可以通过设置HIVE_CONF_DIR环境变量来改变Hive配置目录
  • 使用<install-dir>/conf/hive-site.xml来修改配置信息
  • Log4j配置信息存放在<install-dir>/conf/hive-log4j.properties
  • Hive配置会覆盖Hadoop配置-即默认Hive会继承Hadoop的配置信息
  • 操作Hive配置的方式:
    • 编辑hive-site.xml,定义任何需要的变量(包括Hadoop变量)
    • 通过CLI使用set命令(见下面)
    • 使用如下语法运行hive
      • $ bin/hive -hiveconf x1=y1 -hiveconf x2=y2 这会设置变量x1和x2分别为y1和y2
    • 通过设置HIVE_OPTS环境变量为"-hiveconf x1=y1 -hiveconf x2=y2"和上面功能一样.

###运行时配置

  • Hive查询是执行map-reduce查询,因此这些查询可以通过Hadoop配置变量来控制

  • CLI命令'SET'可以设置任意Hadoop(或者Hive)配置变量,如:

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

后者显示当前所有配置,不使用-v参数则显示与Hadoop不同的配置。

Hive,Map-Reduce和Local-Mode

Hive编译器将大多数查询生成为map-reduce的jobs。这些jobs提交到由变量指定的Map-Reduce集群 mapred.job.tracker 这通常指向多节点的map-reduce集群,Hadoop也提供了一个选项在本地用户机器上运行map-reduce jobs.在小数据集上运行查询时会非常有用-在这种情况下,local mode执行通常会比提交到大集群明显加快。可以从HDFS透明访问数据,相反,local mode只运行一个reducer,在大数据集是将会非常慢。

从0.7版本开始,Hive完美提供了local mode运行。用户通过配置如下参数来生效

hive> SET mapred.job.tracker=local;

另外,mapred.local.dir指向本地机器的有效路径(如:/tmp/<username>/mapred/local).(否则用户将会收到分配本地磁盘空间的异常) 从0.7版本开始,Hive也提供了自动使用local mode来运行map-reduce jobs。相关选项为hive.exec.mode.local.auto,hive.exec.mode.local.auto.imputbytes.max和hive.exec.mode.local.auto.tasks.max:

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

该特性默认是失效的.如果生效,Hive分析查询中各个map-reduce job的大小,当满足下述所有条件时运行本地模式:

  • 作业总计输入大小小于:hive.exec.mode.local.auto.inputbytes.max (默认128MB)
  • map-tasks总数小于:hive.exec.mode.local.auto.tasks.max (4 by default)
  • reduce tasks总数为1或者0.

因此在小数据集上查询,或者查询在多个map-reduce jobs但是jobs大体上很小,作业会运行在本地模式。

由于可能Hadoop服务器节点和Hive客户端机器的运行环境不同(因为不同的jvm版本或者不同的软件库)。在本地模式运行时,会产生意想不到的行为或错误。同样本地模式是在一个独立的子jvm(Hive的客户端)运行,如果用户期望,子jvm所能使用的最大内存量,可以通过hive.mapred.local.mem选项来控制,默认值为0,在此情况下Hive让Hadoop决定子jvm的默认内存限制。

###错误日志

Hive使用log4j来记录日志,默认CLI不会输出日志到控制台。默认日志级别为WARN在Hive0.13.0版本之前。从Hive0.13.0版本开始,默认日志级别为INFO。日志存放文件夹:

  • /tmp/<user.name>/hive.log 注解:在本地模式,日志文件名为".log"而不是"hive.log".这是一个bug将会在0.13.0版本修复(见 HIVE-5528HIVE-5676).

如果用户希望-日志可以输出到控制台,通过添加如下参数: bin/hive -hiveconf hive.root.logger=INFO,console 另外,用户可以修改日志级别: bin/hive -hiveconf hive.root.logger=INFO,DRFA

注意在hive初始化后通过‘set'命令来修改hive.root.logger不会修改日志属性。

同样Hive会为每个session保存查询日志在/tmp/<user.name>/,但是可以通过配置hive-site.xml中的hive.querylog.location属性。

Hive在一个hadoop集群上运行过程中的日志是由Hadoop的配置所决定的。通常Hadoop会对每个map和reduce task产生一个日志文件,并保存在运行任务的集群机器上。通过Hadoop JobTracker WEB界面的任务明细页面来获取日志文件。

使用本地模式时(使用mapred.job.tracker=local),Hadoop/Hive会将执行日志放在本机上,从0.6版本开始,Hive使用 hive-exec-log4j.properties(不存在则使用hive-log4j.properties ) 来定义默认日志定义。默认配置文件为每个查询生成单独日志文件在本地模式下并存放在/tmp/<user.name>。提供单独的配置文件是为了允许管理员在需要的时候集中运行日志(如:放在NFS文件系统上).执行日志对调试运行错误很有用。

WebHCat的错误和日志,见 Error Codes and ResponsesLog FilesWebHCat manual.

错误日志对调试问题非常有用,请提交它们和bugs到hive-dev@hadoop.apache.org.

###审计日志

审计日志记录来自于Hive metastore服务器的每个metastore API调用。

审计日志记录了函数和相关的函数参数在metastore日志文件中。日志的记录级别为log4j的INFO。因此你必须确定INFO级别的日志是启用的(见HIVE-3505).日志的入口名称为”HiveMetaStore.audit".

审计日志在Hive0.7版本添加,用于安全的客户端连接(HIVE-1948)和Hive0.10版本的非安全连接 (HIVE-3277; 也见 HIVE-2797).

##DDL操作

Hive DDL操作文档:Hive Data Definition Language.

###创建Hive表

hive> CREATE TABLE pokes (foo INT, bar STRING); 

创建有2个字段的pokes表,第一个字段类型为integer另一个为string。

hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);

创建一个名为invites的表,有2个字段和一个名为ds的分区字段,分区字段是一个虚拟字段。它不是数据本身的一部分。但是来源于特定数据集装入的分区。 默认,表假定输入格式为纯文本和分隔符为^A(ctrl-a).

###浏览表

hive> SHOW TABLES;

列出所有表

hive> SHOW TABLES '.*s';

列出所有以's'结尾的表。模式匹配使用Java的正则表达式。文档参见:http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html.

hive> DESCRIBE invites;

显示表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也可用于从表定义中删除字段。

hive> ALTER TABLE invites REPLACE COLUMNS (foo INT COMMENT 'only keep the first column'); 

删除表:

hive> DROP TABLE pokes; 

###元数据存储

元数据存储在内嵌的Derby数据库,其磁盘存放路径由Hive配置变量javax.jdo.option.ConnectionURL定义.默认路径为./metastore_db(见conf/hive-default.xml).

现在,在默认配置中,该元数据每次只能被一个用户访问。

元数据能存放在任意支持JPOX的数据库中,数据库路径和类型由参数javax.jdo.option.ConnectionURL和javax.jdo.option.ConnectionDriverName控制。见JDO(或JPOX)文档了解支持的数据库。数据库表定义定义在 src/contrib/hive/metastore/src/model目录下的JDO元数据文件package.jdo。

在将来,元数据本身将会成为一个单独的服务。

如果你想将元数据运行为网络服务,从而能够被多个节点访问,见 Hive Using Derby in Server Mode.

###DML操作

Hive DML操作见文档Hive Data Manipulation Language. 从文件导入数据到Hive

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

装载由ctrl-a分隔包括2个字段的文件到pokes表。'LOCAL'指示输入文件在本地文件系统,如果省略'LOCAL'将会在HDFS上寻找文件。

关键字'OVERWRITE'指示删除表中已经存在的数据。如果省略'OVERWRITE',数据文件将会追加到存在的数据集中。 注意:

  • load命令不会校验数据与表定义是否一致。

  • 如果文件在hdfs上,将会移动到Hive管理的文件系统空间。 Hive的根目录由文件hive-default.xml中的选项 option hive.metastore.warehouse.dir定义。我们建议用户在Hive中创建表前先建立这个目录。

    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');

上面的这2个LOAD语句装载数据到表invites的2个不同的分区。表invites必须先创建同样的ds键的分区来成功运行语句。 hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

上述命令将从HDFS文件目录装载数据到表。 注意从HDFS装载数据将会移动文件/目录。该操作几乎是同时的。

##SQL操作 Hive查询操作见文档Select.

###查询示例

下面展示一些查询例子,它们也在build/dist/examples/queries. 更多的在Hive源代码ql/src/test/queries/positive.

####SELECTS and FILTERS

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

查询invites表ds=2008-08-15分区上的'foo'字段的所有记录。结果将会直接显示在控制台上。

在下面的所有例子中,INSERT(到Hive表,本地目录或者HDFS目录)是可选的。

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

查询invites表ds=2008-08-15分区的所有记录结果导出到HDFS的目录。查询结果数据在那个目录下的多个文件(依赖于mappers的个数)。

注意:如果任何查询使用*,分区字段也会显示在查询结果中。

分区表必须在查询的WHERE子句中指定。

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

查询pokes表的所有记录到处到本地目录/tmp/local_out

hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;
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;

查询字段的SUM,或者使用avg、min或者max。注意不包含在HIVE-287的Hive的版本,你需要使用COUNT(1)来替换COUNT(*).

####GROUP BY

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

注意不包含在HIVE-287的Hive的版本,你需要使用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;

####MULTITABLE INSERT

FROM src
INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100
INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200
INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;

####STREAMING

hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';

在map阶段的数据流通过脚本 /bin/cat (like Hadoop streaming). 同样的,在reduce也可以使用数据流(例子见Hive Tutorial )

##场景例子

###电影评级

首先,建立一张tab键分隔的文本格式的表

CREATE TABLE u_data (
  userid INT,
  movieid INT,
  rating INT,
  unixtime STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE; 

接下来下载和提取数据文件

wget http://www.grouplens.org/sites/www.grouplens.org/external_files/data/ml-data.tar.gz tar xvzf ml-data.tar.gz 

装载数据到表 LOAD DATA LOCAL INPATH 'ml-data/u.data' OVERWRITE INTO TABLE u_data;

统计表u_data的记录数

SELECT COUNT(*) FROM u_data; 

注意:不包含在 HIVE-287中的Hive版本需要使用COUNT(1)而不是COUNT(*) 现在我们在表u_data上来做一些复杂的数据分析 创建weekday_mapper.py:

import sys
import datetime

for line in sys.stdin:
  line = line.strip()
  userid, movieid, rating, unixtime = line.split('\t')
  weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
  print '\t'.join([userid, movieid, rating, str(weekday)])

使用mapper脚本:

CREATE TABLE u_data_new (
  userid INT,
  movieid INT,
  rating INT,
  weekday INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';

add FILE weekday_mapper.py;

INSERT OVERWRITE TABLE u_data_new
SELECT
  TRANSFORM (userid, movieid, rating, unixtime)
  USING 'python weekday_mapper.py'
  AS (userid, movieid, rating, weekday)
FROM u_data;

SELECT weekday, COUNT(*)
FROM u_data_new
GROUP BY weekday;

注意如果你使用Hive0.5.0或更早版本,你需要使用COUNT(1)而不是COUNT(*).

###Apache Weblog Data Apache weblog的格式是可定制的,大多数web管理员使用默认配置。 默认Apache weblog,我们创建表使用下面的命令

关于!RegexSerDe的信息见HIVE-662 and HIVE-1719.

CREATE TABLE apachelog (
  host STRING,
  identity STRING,
  user STRING,
  time STRING,
  request STRING,
  status STRING,
  size STRING,
  referer STRING,
  agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  "input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?"
)
STORED AS TEXTFILE;

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

转载于:https://my.oschina.net/xiangel/blog/209822

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值