首页IT科技hive实训总结(Hive官方手册翻译(Getting Started) 实践检验真理 51CTO技术博客)

hive实训总结(Hive官方手册翻译(Getting Started) 实践检验真理 51CTO技术博客)

时间2025-06-13 16:14:32分类IT科技浏览4592
导读:标签:手册 hadoop hive...

标签:手册 hadoop hive

版权声明:原创作品              ,如需转载                   ,请与作者联系             。否则将追究法律责任                      。
翻译Hive官方文档系列        ,文中括号中包含 注: 字样的           ,为我自行标注的                  ,水平有限           ,翻译不是完美无缺的      。如有疑问        ,请参照Hive官方文档对照查看         。
内容列表
Cloudera制作的Hive介绍视频
安装与配置
系统需求
安装Hive发行版
从Hive源码编译
运行Hive
配置管理概览
运行时配置
Hive, Map-Reduce 与本地模式
错误日志
DDL 操作
元数据存储
DML 操作
SQL 操作
查询示例
SELECTS 和 FILTERS
GROUP BY
JOIN
MULTITABLE INSERT
STREAMING
Simple Example Use Cases
MovieLens User Ratings
Apache Weblog Data
免责声明: Hive目前仅在Unix(linux)和Mac系统下使用Java 1.6测试运行                   ,可以在这些或类似的平台上正常运行                      。并不支持在Cygwin上工作(注:windows还是别想了)         。
绝大部分的测试工作是基于Hadoop 0.20完成的 - 所以              ,我们建议不要使用其他版本    ,以避免编译或运行的异常      。
Cloudera制作的Hive介绍视频
Hive 介绍视频
Hive 演示视频
安装与配置
系统需求
Java 1.6
Hadoop 0.20.x.(注:目前0.9.0支持hadoop 1.0.x)
用发行版安装Hive
使用下载工具从Apache下载镜像下载最近的Hive发行包(查看 Hive发行包)
下一步你需要解压缩Tar包                    ,这将会创建一个名为hive-x.y.z的子目录:
$ tar -xzvf hive-x.y.z.tar.gz
设置HIVE_HOME环境变量指向到Hive的安装目录:

$ 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/ (所有shell脚本)

lib/ (所需的jar文件)

conf/ (配置文件)

examples/ (示例输入与查询文件)
在接下来, 我们会交替的使用build/dist和<install-dir>.
运行Hive
Hive 使用Hadoop                 ,这意味着:
你必须在PATH里面设置了hadoop路径 (注:原文是 you must have hadoop in your path,我认为这个path应该是大写的) 或者
export HADOOP_HOME=<hadoop-install-dir>
作为附加的, 你必须在创建Hive库表前                 ,在HDFS上创建/tmp和/user/hive/warehouse                    ,并且将它们的权限设置为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
配置文件管理概述
Hive 默认的配置文件保存在 <install-dir>/conf/hive-default.xml
你可以修改其中的配置              ,并重命名这个文件为 <install-dir>/conf/hive-site.xml(注:我建议你还是保留原始配置文件)
Hive配置文件的位置可以通过设置HIVE_CONF_DIR环境变量来改变.
Log4j的配置保存在 <install-dir>/conf/hive-log4j.properties
Hive的配置存在于Hadoop之上                   ,这意味着Hadoop的配置默认会被继承到Hive中.
Hive 配置可以被如下方式控制:
编辑 hive-site.xml 并定义任何需要的变量 (包括hadoop的变量)
从 cli 模式使用使用set命令 (看下面)
使用如下方式:
$ bin/hive -hiveconf x1=y1 -hiveconf x2=y2
这个例子分别设置了变量x1为y1        ,x2为y2
设置使用 HIVE_OPTS 环境变量 "-hiveconf x1=y1 -hiveconf x2=y2" 与上面的功能相同
运行时配置
Hive 查询是执行map-reduce查询           ,并且                  ,这些查询是可以被hadoop的配置所控制的.
命令行命令 SET 可以被用来设置任何hadoop(或者hive)的配置变量           ,例如:

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

hive> SET -v;
后者(注 SET -v)用来查看当前全部的设置. 而不使用 -v 选项        ,则是用来查看当前与Hadoop不同的配置.
Hive, Map-Reduce 与本地模式
Hive编译器会为绝大多数查询生成map-reduce的jobs                      。这些Jobs使用下面这个变量来表明被提交到Map-Reduce集群中:
mapred.job.tracker
由于这通常是在一个多节点的map-reduce集群中被指出                   ,Hadoop同样有个就近的方式来在用户的工作机上运行map-reduce jobs             。这就在小数据集的查询上显得非常有用 - 在这种情况下              ,本地模式运行通常会比将任务提交到整个大集群中查询更快   。数据从HDFS上获取是透明的                     。同样的    ,由于本地模式仅运行一个reducer                    ,这样                 ,在大数据查询上是非常慢的                 。
从 0.7 版本开始, Hive全面支持本地运行模式,要使用这个模式                 ,请按照下列进行设置:
hive> SET mapred.job.tracker=local;
作为附加的                    ,mapred.local.dir应该指定一个合法的本机路径(注:安装hive的那台服务器) (例如: /tmp/<username>/mapred/local). (否则,用户将获取一个定位本地空间的异常抛出).
从0.7版本开始, Hive同样支持自动/非自动地使用本地模式来完成map-reduce jobs    ,相关的选项是:
hive> SET hive.exec.mode.local.auto=false;
请注意这个功能默认是关闭的              ,如果打开 - Hive将分析每一个查询的map-reduce job                    ,并且如果以下阀值被确认为OK        ,就尝试运行在本地:
全部job的输入大小低于: hive.exec.mode.local.auto.inputbytes.max (128MB 默认)
全部的map任务数低于: hive.exec.mode.local.auto.tasks.max (4 个默认)
全部reduce任务数等于 1 或者 0.
对于查询大于小数据集           ,或者需要查询在多个map-reduce jobs中完成                  ,但是子查询很小的(注:小于上述条件)           ,jobs仍可能使用本地模式来运行。
注意        ,可能不同的hadoop服务器节点和hive客户端的运行时环境(由于不同的jvm版本或者不同的软件库)                 。运行本地模式可能会导致一个不可被捕获的错误                     。同样需要注意的是                   ,本地运行模式是在一个独立的子jvm(hive 客户端的子进程)中完成的   。 如果用户希望              ,子jvm所能使用的最大内存数    ,可以通过访问hive.mapred.local.mem来进行控制             。默认设置是0                    ,所以Hive允许Hadoop来决定子jvm的默认内存限制
错误日志
Hive 使用 log4j 来记录日志. 默认来说                 ,日志不会被返回到CLI模式的控制台上(注:也就是CRT中)                      。默认的日志记录等级是WARN,并被保存到以下文件夹中:
/tmp/<user.name>/hive.log
如果用户愿意 - 日志可以通过修改下面的参数来返回到控制台上:
bin/hive -hiveconf hive.root.logger=INFO,console
另外                 ,用户可以改变记录等级:
bin/hive -hiveconf hive.root.logger=INFO,DRFA
注意                    ,配置项 hive.root.logger 在hive初始化以后    ,即不能通过使用set命令来改变了
Hive同样会为每个hive会话保存查询日志              ,在/tmp/<user.name>/ (注:本机路径下)                   ,但是可以通过修改 hive-site.xml 中的 hive.querylog.location属性来变更      。
Hive在一个hadoop集群上运行过程中的日志是由Hadoop的配置所决定的         。通常Hadoop会为每个map和reduce任务创建日志文件        ,并保存在运行任务的集群服务器上                      。日志文件可以通过Hadoop Jobtracker提供的Web UI上的Task Detail页面来跟踪观察         。
运行本地模式时(mapred.job.tracker=local)           ,Hadoop/Hive 将会将执行日志放在本机上                  ,从0.6版本开始 - Hive使用hive-exec-log4j.properties (如果不存在           ,则是使用hive-log4j.properties文件)来决定默认的日志的保存方式      。默认的配置文件将为每个查询执行在本地模式下的日志放到/tmp/<user.name>                      。这样做的目的是为了将配置单独管理        ,并可以将日志集中存放到一个用户需要的位置(例如一个NFS文件服务器)上             。执行日志对于运行时错误的debug并无帮助   。
错误日志对于定位问题非常有用                   ,请将存在的任何bug发送到hive-dev@hadoop.apache.org
DDL 操作
创建Hive表和查看使用
hive> CREATE TABLE pokes (foo INT, bar STRING);
创建一个包含两个字段              ,名称为pokes的表    ,第一个字段是int(注:整型)                    ,第二个字段是string(注:字符串)
hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
创建一个名为invites的表                 ,其中包含两个字段和一个叫做ds的分区(partition)字段. 分区字段是一个虚拟的字段,本身并不包含在数据中                 ,但是是从加载进来的数据中特别衍生出来的数据集.
默认情况下                    ,表被假定是纯文本的格式    ,并且使用^A(ctrl-a)来作为数据分割的                     。
hive> SHOW TABLES;
列出所有的表
hive> SHOW TABLES .*s;
列出所有结尾包含 s 的表名                 。匹配方式使用Java正则表达式              ,查看下列连接获取关于Java正则的信息 http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html
hive> DESCRIBE invites;
查看invites表的全部字段
可以修改表名                   ,增加删除新的字段等:
hive> ALTER TABLE pokes ADD COLUMNS (new_col INT

);

hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT a comment

);

hive> ALTER TABLE events RENAME TO 3koobecaf;
删除表:
hive> DROP TABLE pokes;
元数据存储
元数据默认使用Derby数据库保存在本地文件系统中        ,并保存在./metastore_db下。通过修改conf/hive-default.xml中的javax.jdo.option.ConnectionURL变量修改                 。
当前           ,在默认配置下                  ,元数据每次只能同时被一个用户所使用                     。
元数据可以存储在任何一个使用JPOX支持的数据库中           ,这些关系型数据库的连接和类型可以通过两个变量进行控制   。javax.jdo.option.ConnectionURL 和 javax.jdo.option.ConnectionDriverName             。
你需要查看数据库的JDO(或JPOX)手册来获取更多信息                      。
数据库的Schema定义在JDO元数据注释文件package.jdo中        ,位置在src/contrib/hive/metastore/src/model      。
计划在未来                   ,元数据存储引擎可以成为一个独立的服务         。
如果你想将元数据作为一个网络的服务来在多个节点中访问              ,请尝试HiveDerbyServerMode.
DML 操作
将文件中的数据加载到Hive中:
hive> LOAD DATA LOCAL INPATH ./examples/files/kv1.txt OVERWRITE INTO TABLE pokes;
加载到pokes表的文件包含两个用ctrl-a符号分割的数据列    ,LOCAL 意味着文件是从本地文件系统加载                    ,如果没有 LOCAL 则意味着从HDFS中加载                      。
关键词 OVERWRITE 意味着当前表中已经存在的数据将会被删除掉         。
如果没有给出 OVERWRITE                 ,则意味着数据文件将追加到当前的数据集中      。
注意:
通过load命令加载的数据不会被校验正确性                      。
如果文件在HDFS上,他将会被移动到hive所管理的文件系统的命名空间中
Hive目录的根路径是在hive-default.xml文件中的变量
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);
上面这两个 LOAD 语句                 ,将加载不同的数据到invites表的分区(partition)中                     。invites表必须事先使用 ds 创建好partition                 。
hive> LOAD DATA INPATH /user/myname/kv2.txt OVERWRITE INTO TABLE invites PARTITION (ds=2008-08-15);
上述命令是将HDFS上的文件加载到表中。
注意从HDFS中加载数据                    ,将会把数据移动到目录下                 。这几乎是瞬间完成的                     。(注:因为只是在HDFS元数据中修改了文件路径的指向   。)
SQL 查询
查询示例
下面会演示一些查询范例    ,在build/dist/examples/queries中可以找到             。
更多的              ,可以在hive源码中的 ql/src/test/queries/positive中可以找到                      。
SELECTS 和 FILTERS
hive> SELECT a.foo FROM invites a WHERE a.ds=2008-08-15;
从invite表的字段 foo 中选择所有分区ds=2008-08-15的结果      。这些结果并不存储在任何地方                   ,只在控制台中显示         。
注意:下面的示例中        ,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目录中         。结果数据在在/tmp/hdfs_out目录中的文件(多个文件           ,文件数量取决于mapper的数量)      。
存在分区的表在使用 WHERE 条件过滤的时候必须至少指定一个分区来查询                      。
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

< 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;
字段计算和        ,最大值                   ,最小值同样可以使用              ,注意不包含在 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对数据的流式访问(就像使用hadoop的streaming)
同样的 - 流式访问也可以使用在reduce阶段   。(请查看 Hive Tutorial 范例)
简单的使用范例
用户对电影的投票统计
首先                 ,创建一个使用tab分割的文本文件的表
CREATE TABLE

u_data (

userid INT

,

movieid INT

,

rating INT

,

unixtime STRING)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY \tSTORED AS TEXTFILE;
然后,下载这个数据文件
wget http://www.grouplens.org/system/files/ml-data.tar+0.gz
tar xvzf ml-data.tar+0.gz
将这个文件加载到刚刚创建的表中:
LOAD DATA LOCAL INPATH ml-data/u.dataOVERWRITE 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.pyAS

(userid, movieid, rating, weekday)

FROM

u_data;

SELECT weekday, COUNT

(*)

FROM

u_data_new

GROUP BY weekday;
注意 0.5.0 及更早的的Hive版本    ,你需要使用COUNT(1) 来代替 COUNT(*)
Apache Web日志数据
Apache日志格式是可以自定义的              ,作为大多数网管来说都是使用默认设置                     。
我们可以给默认的Apache日志创建一个如下的表
更多的关于正则序列化/反序列化(注: 原文!RegexSerDe) 可以在这里看到                 。
http://issues.apache.org/jira/browse/HIVE-662
add

jar ../build/contrib/hive_contrib.jar;

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.contrib.serde2.RegexSerDeWITH

SERDEPROPERTIES (

"input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?",

"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"

)

STORED AS TEXTFILE;
声明:本站所有文章                   ,如无特殊说明或标注        ,均为本站原创发布。任何个人或组织           ,在未征得本站同意时                  ,禁止复制              、盗用                   、采集        、发布本站内容到任何网站           、书籍等各类媒体平台                 。如若本站内容侵犯了原著者的合法权益           ,可联系我们进行处理                     。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
2岁宝宝经常便秘怎么办(经常便秘怎么办?) 二叉树从下往上打印出来(每日算法之把二叉树打印成多行)