hive基本操作,hive经验
Hive官方手册翻译(入门)-实践检验真理-51CTO技术博客
官方Hive手册翻译(入门)
2012-07-23 16:18:12
标签:手动hadoop配置单元
版权声明:原创作品,如需转载,请联系作者。否则将追究法律责任。
翻译Hive的公文系列。文中括号内有“注”字,由本人标注。水平有限,翻译也不完美。如有疑问,请参考官方Hive文档。
Cloudera制作的内容Hive介绍视频安装和配置系统要求安装Hive发行版,编译并运行Hive配置管理概述来自Hive源代码,在运行时配置Hive,Map-Reduce和本地模式错误日志DDL操作元数据存储DML操作SQL操作查询示例通过join选择和过滤组多表插入流简单示例用例movie lens u Ser Ratings Apache Weblog数据免责声明:Hive目前仅在使用Java 1.6的Unix(linux)和Mac系统上测试和运行,可以在这些或类似平台上正常运行。它不支持在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用源代码创建HiveHive SVN源代码来源:http://svn.apache.org/repos/asf/hive/trunk http://svn.apache.org/repos/asf/hive/trunk$, HIVE的SVNCO
$ cd配置单元
$ ant清洁包
$ cd版本/发行
$ ls
README.txt
Bin/(所有shell脚本)
Lib/(必需的jar文件)
Conf/(配置文件)
示例/(示例输入和查询文件)接下来,我们将交替使用build/dist和install-dir。运行HiveHive使用hadoop,意味着你必须在path中设置hadoop路径(注意:原文是你的PATH中必须有Hadoop,我觉得这个路径要大写)或者export Hadoop _ home=Hadoop-install-dir。另外,您必须在HDFS上创建/tmp和/user/Hive/warehouse,并将它们的权限设置为chmod g w。完成此操作的命令如下:$ $ Hadoop _ home/bin/hadoops-mkdir/
$ $ 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(注:建议您保留原来的配置单元配置文件的位置可以通过设置配置单元_ CONF _目录环境变量来更改。Log4j的配置保存在install-dir/conf/The configuration of hive-Log4j . properties Hive存在于hadoop上,这意味着Hadoop的配置将默认继承到Hive中。可以通过以下方式控制Hive配置:编辑hive-site.xml,定义任何需要的变量(包括Hadoop的变量)。在cli模式下使用set命令(见下文)的方式如下:$ bin/Hive-Hive conf x1=y1-Hive conf x2=y2。在这个例子中,变量x1和x2分别被设置为y1和y2。环境变量-hiveconfx1=y1-hiveconfx2=y2 被设置为使用。它的功能和上面的一样。运行时配置配置单元查询将执行map-reduce查询。而且,这些查询可以通过hadoop的配置来控制。命令行命令 SET 可用于设置任何hadoop(或hive)配置变量,例如:hive SET mapred . job . tracker=my host . my company . com:50030;
蜂巢套装-v;后者(注意SET -v)用于查看所有当前设置。它不使用-v选项,而是用于查看不同于Hadoop的当前配置。配置单元、map-reduce和本地模式配置单元编译器将为大多数查询生成Map-Reduce作业。这些作业使用以下变量来表示它们被提交到map-reduce集群:mapred.job.tracker因为这通常是在多节点map-reduce集群中指出的,所以Hadoop也有一种在用户的工作机器上运行Map-Reduce作业的就近方式。这对于查询小型数据集非常有用——在这种情况下,本地模式通常比将任务提交给整个大型集群进行查询要快。从HDFS获取数据是透明的。同样,因为本地模式只运行一个reducer,所以查询大数据非常慢。从0.7版本开始,Hive完全支持本地运行模式。要使用该模式,请设置如下:Hive set mapred . job . tracker=local;另外,mapred.local.dir应该指定一个合法的本地路径(注意:安装hive的服务器)(例如:/tmp/username /mapred/local)。(否则,用户将得到一个异常来定位本地空间)。从0.7版本开始,Hive还支持自动/非自动使用本地模式来完成map-reduce作业。相关选项有:hive set hive . exec . mode . local . auto=false;请注意,该功能在默认情况下是关闭的。如果打开-Hive,将分析每个查询的map-reduce作业,如果确认以下阈值为OK,则尝试本地运行:所有作业的输入大小低于:Hive。exec . mode . local . auto . input bytes . max(默认128 MB),并且map任务数低于:hive。exec . mode . local . auto . tasks . max(4个默认值)所有reduce任务的数量等于1或0。如果查询大于小数据集,或者查询需要在多个map-reduce作业中完成,但子查询很小(注意:小于上述条件),作业仍可能在本地模式下运行。注意,hadoop服务器节点和hive客户端可能有不同的运行时环境(由于不同的jvm版本或不同的软件库)。运行本地模式可能会导致无法捕获的错误。还需要注意的是,本地运行模式是在一个独立的子JVM(Hive客户端的子进程)中完成的。如果用户愿意,可以通过访问hive.mapred.local.mem来控制子jvm可以使用的最大内存,默认设置为0,所以hive允许Hadoop确定子jvm的默认内存限制错误日志。Hive使用log4j记录日志。默认情况下,日志不会在CLI模式下返回到控制台(注意:即在CRT中)。的默认记录级别是WARN,它保存在以下文件夹中:/tmp/user.name/hive.log。如果用户愿意,可以通过修改以下参数将日志返回到控制台:bin/Hive-Hive conf hive.root.logger=info,console此外,用户可以更改记录级别:bin/Hive-Hive conf Hive . root . logger=info,drfa请注意,配置项Hive . root . logger不能在配置单元初始化后使用“set”命令进行更改,并且还将为每个配置单元会话保存查询日志在/tmp/user.name/(注意:本地路径下),但是可以通过修改hive-site.xml中hive.querylog.location的属性来改变,在hadoop集群上运行的hive的日志是由Hadoop的配置决定的。Hadoop通常为每个map和reduce任务创建日志文件,并将它们保存在任务运行的集群服务器上。可以通过Hadoop Jobtracker提供的Web UI上的任务详细信息页面来跟踪和观察日志文件。在本地模式下运行时(mapred.job.tracker=local),Hadoop/Hive会把执行日志放到本地机器上。从0.6版开始-Hive使用hive-exec-log4j.properties(如果不存在,则使用hive-log4j.properties文件)来决定如何保存默认日志。的默认配置文件将在本地模式下为每个查询执行的日志放在/tmp/user.name中。这样做的目的是单独管理配置,日志可以集中存储在用户需要的位置(如NFS文件服务器)。执行日志对调试运行时错误没有帮助。
错误对于定位问题非常有用。请把虫子送到hive-dev@hadoop.apache.org。
Operation DDL使用hive create table poker (fooint,bar string)创建Hive表和视图;
创建一个有两个名为pokes的字段的表,第一个字段是int(注:整数),第二个字段是string(注:字符串)Hive创建表Invitations (fooint,bar string)partitioned by(ds string);
创建一个名为Invitations的表,其中包含两个字段和一个名为ds的分区字段。分区字段是一个虚拟字段,不包含在数据本身中,而是专门从加载的数据中导出的数据集。默认情况下,该表被假定为纯文本格式,并将a (Ctrl-A)用作数据分区。配置单元显示表;
所有列出的表格都显示表格。* s ;
列出所有末尾带有“s”的表名。匹配方法使用Java正则表达式,查看以下链接获取Java正则性相关信息:http://java.sun.com/Java SE/6/docs/API/Java/util/regex/pattern . html hive描述邀请;
您可以修改表名、添加和删除新字段等。通过查看邀请表中的所有字段:hive alter table poker add columns(new _ colint);
hive ALTER TABLE邀请添加列(new _ col 2 INT COMMENT a COMMENT );
hive ALTER TABLE事件重命名为3koobecaf
删除表:hive DROP表戳;默认情况下,使用Derby数据库和。/metastore_db。通过修改conf/hive-default.xml中的javax.jdo.option.ConnectionURL变量进行修改,目前在默认配置下,元数据一次只能被一个用户使用。元数据可以存储在JPOX支持的任何数据库中,这些关系数据库的连接和类型可以由两个变量控制。Javax.jdo.option.ConnectionURL和javax . jdo . option . connection driver name .需要查看数据库的jdo(或JPOX)手册了解更多信息。数据库的模式在JDO元数据注释文件package.jdo中定义,位于src/contrib/hive/metastore/src/model中。计划在未来,元数据存储引擎可以成为一个独立的服务。如果您希望将多个节点中的元数据作为网络服务进行访问,请尝试HiveDerbyServerMode。
DML操作将数据从文件加载到配置单元:配置单元加载路径中的本地数据。/examples/files/kv1.txt 覆盖到桌面扑克中;
加载到pokes表中的文件包含由ctrl-a符号分隔的两个数据列。“本地”意味着文件从本地文件系统加载,如果没有“本地”,则意味着文件从HDFS加载。关键字“OVERWRITE”意味着当前表中的现有数据将被删除。如果没有给出 OVERWRITE ,这意味着数据文件将被追加到当前数据集。注意:不会对load命令加载的数据进行正确性检查。如果文件在HDFS上,它将被移动到由hive管理的文件系统的名称空间。Hive目录的根路径由hive-default.xml文件中的变量hive.metastore.warehouse.dir确定。我们建议用户在使用Hive构建表之前创建由该变量指定的目录。配置单元加载数据本地路径。/examples/files/kv2 . txt OVERWRITE INTO TABLE invite PARTITION(ds= 2008-08-15 );
配置单元加载数据本地路径。/examples/files/kv3 . txt OVERWRITE INTO TABLE invite PARTITION(ds= 2008-08-08 );
以上两个LOAD语句将把不同的数据加载到invitations表的分区中。邀请表必须使用ds预先创建分区。将路径“/user/myname/kv2.txt”中的配置单元加载数据覆盖到表邀请分区(ds= 2008-08-15 );
上面的命令是将HDFS上的文件加载到表中。请注意,从HDFS加载数据会将数据移动到目录中。这几乎是立即完成的。(注意:因为在HDFS元数据中只修改了文件路径的指向。)
SQL查询查询示例下面将演示一些查询示例,这些示例可以在build/dist/examples/queries中找到。更多内容可以在配置单元源代码中的ql/src/test/queries/positive中找到。
选择和筛选配置单元从邀请a中选择a. foo其中a . ds= 2008-08-15 ;
从邀请表的字段福中选择所有分区ds=2008-08-15的结果。这些结果并不存储在任何地方,只在控制台中显示。注意:下面的示例中,插入(到储备表,本地目录或者分布式文件系统目录)是可选命令。hive INSERT OVERWRITE DIRECTORY /tmp/HDFS _ out SELECT a . * FROM invites a WHERE a . ds= 2008-08-15 ;
从邀请表中选择分区ds=2008-08-15的所有行,并放入分布式文件系统目录中。结果数据在在/tmp/hdfs_out目录中的文件(多个文件,文件数量取决于制图人的数量)。
存在分区的表在使用在哪里条件过滤的时候必须至少指定一个分区来查询。hive INSERT OVERWRITE LOCAL DIRECTORY /tmp/LOCAL _ out SELECT a . * FROM pokes a;
选择拨表中所有的数据并放到一个本地(注:当前服务器)的文件路径中。储备插入覆盖表事件从配置文件a中选择a. *
配置单元插入覆盖表事件从配置文件a中选择a . *,其中a .键为100;
配置单元插入覆盖本地目录/tmp/reg _ 3 从事件a中选择a .
hive INSERT OVERWRITE DIRECTORY /tmp/reg _ 4 select a . invites,a.pokes FROM profiles a
配置单元插入覆盖目录"/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
配置单元插入覆盖本地目录/tmp/SUM 选择SUM(a . PC)从pc1a
字段计算和,最大值,最小值同样可以使用,注意不包含在HIVE-287中的储备版本,你需要使用计数(1)来代替COUNT(*)GROUP BY hive FROM invite a INSERT OVERWRITE TABLE events SELECT a . bar,COUNT(*)WHERE a . foo 0 GROUP BY a . bar;
储备插入覆盖表事件SELECT a.bar,count(*)FROM invites a WHERE a . foo 0 GROUP BY a . bar;
注意不包含在HIVE-287中的储备版本,你需要使用计数(1)来代替COUNT(*)从pokes t1 JOIN邀请T2于(t1)加入配置单元。酒吧=T2。bar)插入覆盖表事件选择t1.bar,t1.foo,T2。foo
多表插入(多重插入)来自科学研究委员会
插入覆盖表dest1选择src .*其中键100
插入覆盖表dest2选择src.key,src.value其中src.key=100,src.key=100
插入覆盖表dest3分区(ds=2008-04-08 ,hr=12 )选择src.key其中src.key=200,src.key=200
插入覆盖本地目录“/tmp/dest 4”。“out”选择src。价值其中src.key=300
流动
hive FROM invite a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a . foo,a.bar) AS (oof,rab)USING /bin/cat WHERE a . ds 2008-08-09 ;在地图中使用脚本/bin/cat对数据的流式访问(就像使用大数据的流媒体)同样的-流式访问也可以使用在减少阶段。(请查看蜂巢教程范例)
简单的使用范例用户对电影的投票统计首先,创建一个使用标签分割的文本文件的表创建表u_data(
用户id INT,
电影id INT,
(同Internationalorganizations)国际组织评级,
时间戳字符串)
行格式分隔
以\t 结尾的字段
存储为文本文件;
然后,下载这个数据文件http://www.grouplens.org/system/files/ml-data.tar0.gz塔尔xvzf ml-data.tar 0.gz将这个文件加载到刚刚创建的表中:加载数据本地在路径“ml-DATA/u . DATA”中覆盖到表u _ data
计算表u_data中的总行数:SELECT COUNT(*)FROM u _ data;
注意不包含在HIVE-287中的储备版本,你需要使用计数(1)来代替计数(*)现在,我们可以在表u_data中做一些复杂的数据分析创建weekday_mapper.py:导入系统
导入日期时间
对于sys.stdin中的行:
line=line.strip()
userid,movieid,rating,unixtime=line.split(\t )
工作日=日期时间。日期时间。fromtimestamp(float(unixtime)).等工作日()
打印\t .join([用户id,电影id,分级,字符串(工作日)]使用制图人脚本:创建表u_data_new(
用户id INT,
电影id INT,
(同Internationalorganizations)国际组织评级,
工作日INT)
行格式分隔
以" \t "结尾的字段;
添加文件weekday _ mapper.py
插入覆盖表u_data_new
挑选
转换(用户id、电影id、分级、unixtime)
使用" python weekday_mapper.py "
作为(用户身份证,电影身份证,分级、工作日)
来自u _ data
选择工作日,计数(*)
来自u_data_new
按工作日分组;
注意0.5.0 及更早的的储备版本,你需要使用计数(1)来代替COUNT(*)Apache Web日志数据街头流氓日志格式是可以自定义的,作为大多数网管来说都是使用默认设置。我们可以给默认的街头流氓日志创建一个如下的表更多的关于正则序列化/反序列化(注:原文!RegexSerDe)可以在这里看到。http://issues.apache.org/jira/browse/HIVE-662add罐./build/contrib/hive _ contrib。罐子;
创建表apachelog(
主机字符串,
标识字符串,
用户字符串,
时间字符串,
请求字符串,
状态字符串,
大小字符串,
引用字符串,
代理字符串)
行格式塞尔德组织。阿帕奇。Hadoop。蜂巢。贡献。SERDE 2。regex SERDE
具有SERDEPROPERTIES(
输入。([^]*)([^]*]([^]*](-\\[^\\]*\\))([^ ]*[^]*)(-[0-9]*)(-[0-9]*)(? ([^ ]*.*) ([^ ]*.*))?
输出。格式。字符串“=”% 1 $ s % 2 $ s % 3 $ s % 4 $ s % 5 $ s % 6 $ s % 7 $ s % 8 $ s % 9 $ s
)
存储为文本文件;
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。