Hive教程(1)
2019-05-13 07:14:38来源:博客园 阅读 ()
1. 介绍
Apache Hive可以使用SQL来读,写,管理分布式存储的大数据集,结构可以投射到已经存储的数据上,命令行工具和JDBC驱动可以让用户连接到Hive。
2. 安装和配置
你可以下载Hive的稳定版本或者下载源码,自己编译Hive
必要:
- Java1.7(Hive 1.2需要java1.7,Hive 0.14到1.1版本可以与java1.6工作,强烈建议用户用java1.8)
- 最好使用Hadoop2.0。hadoop1.x并不会Hive2.0.0以后的版本
从稳定的版本安装Hive
tar -xzvf hive-x.y.z.tar.gz cd hive-x.y.z export HIVE_HOME={{pwd}} export PATH=$HIVE_HOME/bin:$PATH
运行Hive
Hive使用Hadoop,所以你必须执行该命令
export HADOOP_HOME=<hadoop-install-dir>
在创建表之前,执行HDFS命令创建/tmp和/user/hive/warehouse(hive.metastore.warehouse.dir),设置目录的权限为g+w。
$HADOOP_HOME/bin/hadoop dfs -mkdir /tmp $HADOOP_HOME/bin/hadoop dfs -mkdir /user/hive/warehouse $HADOOP_HOME/bin/hadoop dfs -chmod g+w /tmp $HADOOP_HOME/bin/hadoop dfs -chmod g+w /user/hive/warehouse
最好设置HIVE_HOME变量
export HIVE_HOME=<hive-install-dir>
运行Hive CLI,为了使用Hive CLI
$HIVE_HOME/bin/hive
运行HiveServer2和Beeline
从Hive2.1开始,我们需要运行schematool命令是为了初始化安装,例如,我们使用derby作为数据库类型
$HIVE_HOME/bin/schematool -dbType <db type> -initSchema
HiveServer2是从Hive0.11开始,有它自己的CLI,叫做Beeline。HiveCLI目前已经过了。HiveCLI缺少多用户,安全性,以及HiveServer2所具有的能力,为了运行HiveServer2和Beeline,执行以下命令
$HIVE_HOME/bin/hiveserver2 $HIVE_HOME/bin/beeline -u jdbc:hive2://$HS2_HOST:$HS2_PORT
Beeline需要HiveServer2的JDBC URL,默认它是(localhost:10000),地址将会是jdbc:hive2://localhost:10000
运行HCatalog
为了运行HCatalog服务(Hive 0.11.0版本以后)
$HIVE_HOME/hcatalog/sbin/hcat_server.sh
为了使用Hcatalog CLI(Hive 0.11.0版本以后)
$HIVE_HOME/hcatalog/bin/hcat
运行WebHCat(Hive 0.11.0版本以后)
$HIVE_HOME/hcatalog/sbin/webhat_server.sh
配置管理简介
- Hive默认从<install-dir>/conf/hive-default.xml中得到配置
- Hive的配置目录可以通过HIVE_CONF_DIR环境变量改变
- 配置变量可以改变,通过在<install-dir>/conf/hive-site.xml中重新定义他们
- Log4j配置是在<install-dir>/conf/hive-log4j.properties
- Hive配置会覆盖Hadoop的配置,默认Hive继承Hadoop的配置
- Hive配置可以通过下面的方式配置
- 编辑hive-site.xml文件,定义期望的变量(包括Hadoop变量)
- 使用set命令
- 调用Hive,Beeline或者HiveServer2
$ bin/hive --hiveconf x1=y1 --hiveconf x2=y2 //设置变量x1和x2 $ bin/hiveserver2 --hiveconf x1=y1 --hiveconf x2=y2 //设置服务端的变量x1和x2 $ bin/beeline --hiveconf x1=y1 --hiveconf x2=y2 //设置客户端的变量x1和x2
- 设置HIVE_OPTS环境变量和"--hiveconf x1=y1 --hiveconf x2=y2"一样的
运行时配置
Hive查询是使用map-reduce查询,因此这种查询被Hadoop配置变量控制
HiveCLI和Beeline中的SET命令可以设置Hadoop或者Hive的配置变量,例如
beeline> SET mapred.job.tracker=myhost.mycompany.com:50030; beeline> SET -v;
后面的命令会显示现在所有的设置,如果不带-v,仅仅显示不同于Hadoop基本配置的变量
Hive, Map-Reduce和Local-Mode
Hive编译器会为查询行为很多map-reduce jobs,这些jobs会被提交到Map-Reduce集群。Map-Reduce集群被变量mapred.job.tracker控制。
这通常会指向伴随很多个节点的map-reduce集群,Hadoop也提供一个选项可以在本地运行map-reduce jobs,对于小数据量来说是非常有用的,在这种情况下,本地模式执行通常比提交job到大集群更快。反过来,本地模式仅仅运行一个reducer,所以处理大数据量会很慢。
从Hive0.7版本开始,Hive支持本地模式,为了开启本地模式,用户可以执行下面的命令
hive> SET mapreduce.framework.name=local
除此之后,还需要配置mapred.local.dir指向本地的一个有效路径(例如:/tmp/<username>/mapred/local),否则,用户将会得到一个异常
从Hive0.7版本开始,Hive也支持自动运行jobs在本地模式,相关的选项是hive.exec.mode.local.auto,hive.exec.mode.local.auto.inputbytes.max,hive.exec.mode.local.auto.tasks.max
hive> SET hive.exec.mode.local.auto=false
这个特性默认是关闭状态,如果开启的话,Hive分析每个map-reduce job的大小,如果满足下面的条件,会在本地执行jobs
- job的输入大小小于:hive.exec.mode.local.auto.inputbytes.max(默认128MB)
- map任务的数量小于:hive.exec.mode.local.auto.tasks.max(默认4)
- reduce任务的数量必须是0或者1
Hive Logging
Hive使用log4j记录日志,默认logs并不会打印到CLI的控制台上。从Hive0.13.0开始,默认的log级别是INFO
----------------------------------------------------------------------------
DDL Operations
Hive DDL operations的文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL
创建Hive表
hive> create table pokes(foo int, bar string)
创建一个名叫pokes的表,包含两列。第一列是integer,第二列是string
create table invites(foo int, bar string) partitioned by (ds string);
创建一个名叫invites的表,包含两列和一个分区列ds,分区列是一个虚拟列,它并不是数据本身。
默认,tables是一个文本格式,分隔符是^A(ctrl-a)
浏览表
hive> show tables;
显示所有的表
hive> show tables '.*s';
显示以s结尾的表,支持java的正则表达式
hive> describe 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也可以从table结构中删除列。
hive> alter table invites replace columns(foo int comment 'only keep the first column');
删除表
hive> drop table pokes;
Metadata Store
Metadata是存储在内嵌的Derby数据库,磁盘存储位置由Hive的配置变量javax.jdo.option.ConnectionURL决定,默认是位置是./metastore_db(看conf/hive-default.xml)
在默认的配置中,metadata只能同时被一个用户看
Metastore可以存储在任何支持JPOX的数据库。数据库的位置和类型可以由javax.jdo.option.ConnectionURL和javax.jdo.option.ConnectionDriverName决定。数据库schema定义在src/contrib/hive/metastore/src/model中
将来,metastore会是一个独立的服务
如果你想要metastore作为网络服务,以至于它可以被多个节点访问,你可以看:https://cwiki.apache.org/confluence/display/Hive/HiveDerbyServerMode
DML Operation
Hive DML操作文档在:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML
从文件中加载数据到Hive
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
加载文件,这个文件包含被ctrl-a分割的两列,LOCAL标识输入文件是本地文件系统,如果LOCAL被忽略,将会寻找HDFS上的文件
OVERWRITE标识将会删除表里存在的数据,如果OVERWRITE忽略的话,数据将会追加到现在的数据集
注意:
- load命令并没有做任何的数据验证
- 如果文件在hdfs上,那么文件会移动hive管控的文件系统
- Hive目录由hive.metastore.warehouse.dir(hive-default.xml)配置。建议用户在创建表之前,先创建好这个目录
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不同的分区,表invites创建必须定义ds分区字段。
hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
上面的命令会加载hdfs的文件到表里
从HDFS中加载数据会引起移动文件或者目录,因此,操作几乎是瞬间的。
SQL Operations
Hive query操作的文档在:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select
hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';
从invites表的ds=2008-08-15的分区中查询foo列。这个结果并不会存储,仅仅显示在控制台上。
hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15';
将表invites中的分区ds='2008-08-15'的数据放到HDFS目录中,结果是存在那个目录下的。
分区表在where条件中必须有一个partition选择
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;
你必须使用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;
你必须使用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;
https://cwiki.apache.org/confluence/display/Hive/GettingStarted
原文链接:https://www.cnblogs.com/yandufeng/p/6306243.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 与JAVA集合相遇 2020-06-11
- Java基础语法菜鸟教程笔记 2020-06-10
- 今天来介绍java 各版本的新特性,一篇文章让你了解 2020-06-10
- Spring Boot 教程 - Elasticsearch 2020-06-09
- java环境教程:Tomcat下载,安装,设置为Windows服务,启动 2020-06-09
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash