首先从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 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和 .
$ 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使用了Hadoop,因此:
另外,你在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
从shell运行HCatalog,Hive0.11.0及以后版本:
$ $HIVE_HOME/hcatalog/sbin/hcat_server.sh
使用HCatalog命令行工具(CLI),Hive0.11.0及以后版本:
$ $HIVE_HOME/hcatalog/bin/hcat
更多信息,见HCatalog手册中的从TAR包安装HCatalog和HCatalog CLI
从shell运行WebCat server,Hive0.11.0及以后版本:
$ $HIVE_HOME/hcatalog/sbin/webhcat_server.sh
更多信息 见WebHCat手册的安装WebHCat
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的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/ /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的大小,当满足下述所有条件时运行本地模式:
因此在小数据集上查询,或者查询在多个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。日志存放文件夹:
如果用户希望-日志可以输出到控制台,通过添加如下参数:
bin/hive -hiveconf hive.root.logger=INFO,console
另外,用户可以修改日志级别:
bin/hive -hiveconf hive.root.logger=INFO,DRFA
注意在hive初始化后通过‘set'命令来修改hive.root.logger不会修改日志属性。
同样Hive会为每个session保存查询日志在/tmp/ /,但是可以通过配置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/ 。提供单独的配置文件是为了允许管理员在需要的时候集中运行日志(如:放在NFS文件系统上).执行日志对调试运行错误很有用。
WebHCat的错误和日志,见 Error Codes and Responses 和 Log Files 在 WebHCat manual.
错误日志对调试问题非常有用,请提交它们和bugs到[email protected].
审计日志记录来自于Hive metastore服务器的每个metastore API调用。
审计日志记录了函数和相关的函数参数在metastore日志文件中。日志的记录级别为log4j的INFO。因此你必须确定INFO级别的日志是启用的(见HIVE-3505).日志的入口名称为”HiveMetaStore.audit”.
审计日志在Hive0.7版本添加,用于安全的客户端连接(HIVE-1948)和Hive0.10版本的非安全连接 (HIVE-3277; 也见 HIVE-2797).
Hive DDL操作文档:Hive Data Definition Language.
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.
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装载数据将会移动文件/目录。该操作几乎是同时的。
Hive查询操作见文档Select.
下面展示一些查询例子,它们也在build/dist/examples/queries.
更多的在Hive源代码ql/src/test/queries/positive.
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(*).
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(*).
hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;
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;
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的格式是可定制的,大多数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