##安装和配置html
首先从Apache下载镜像下载最新的发布包(见Hive版本) 接下来解压缩tar包。这将会建立一个名字为hive-x.y.z的子目录java
$ tar -xzvf hive-x.y.z.tar.gz
配置环境变量HIVE_HOME 指向安装的目录:python
$ cd hive-x.y.z $ export HIVE_HOME={{pwd}}
最后,添加$HIVE_HOME/bin 到PATH:web
$ 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编译Hiveshell
$ 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,所以:数据库
另外,你在Hive中建立表前必须在HDFS上建立/tmp和/user/hive/warehouse(见hive.metastore.warehouse.dir)目录,而且设置权限为 chmod g+w 完成这个步骤的命令:apache
$ $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,虽然不是必须的,可是颇有用api
$ 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包安装HCatalog和HCatalog CLI ###运行WebHCat 从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/<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的大小,当知足下述全部条件时运行本地模式:
所以在小数据集上查询,或者查询在多个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/<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 Responses 和 Log Files 在 WebHCat 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