hive安装
一、安装配置
1、安装
#安装要求
java 1.7+ ,建议1.8+
Hadoop 2.x
#hive下载地址
https://hive.apache.org/downloads.htmlhttps://hive.apache.org/downloads.html
#解压文件
>$ tar -xzvf hive-x.y.z.tar.gz
#设置环境变量HIVE_HOME
>$ cd hive-x.y.z
>$ export HIVE_HOME={{pwd}}
>$ export PATH=$HIVE_HOME/bin:$PATH
>$ export HADOOP_HOME=<hadoop-install-dir>
#初始化化数据存储
$ $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
#安装mysql
参考CDH相关.txt
#修改hadoop配置
$HADOOP_HOME/etc/hadoop/core-site.xml
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
#初始化
>schematool -dbType mysql -initSchema
>nohup hive --service metastore >> log.out 2>&1 &
>nohup hive --service hiveserver2 >> log.out 2>&1 &
2、运行Hive CLI
>$ $HIVE_HOME/bin/hive
3、运行HiveServer2 and Beeline
#hiveserver2
>$ $HIVE_HOME/bin/hiveserver2
hive --service hiveserver2 --hiveconf hive.root.logger=INFO,console &
#beeline(如:jdbc:hive2://localhost:10000.)
>$ $HIVE_HOME/bin/beeline -u jdbc:hive2://$HS2_HOST:$HS2_PORT
#HCatalog
#启动HCatalog
>$ $HIVE_HOME/hcatalog/sbin/hcat_server.sh
#使用HCatalog
$ $HIVE_HOME/hcatalog/bin/hcat
#WebHCat (Templeton)
>$ $HIVE_HOME/hcatalog/sbin/webhcat_server.sh
4、配置管理
#hive默认读取配置文件hive-default.xml
<install-dir>/conf/hive-default.xml
所有对hive-deault.xml的修改将被忽略,修改参数配置可以通过新增hive-site.xml文件添加配置实现
#hive基于hadoop并默认继承hadoop的参数配置
编辑 hive-site.xml 可以定义任何期望的参数 (包括hadoop的参数)
#使用命令行
#调用hive(不赞成使用)、Beeline 或 HiveServer2
>$ bin/hive --hiveconf x1=y1 --hiveconf x2=y2 //this sets the variables x1 and x2 to y1 and y2 respectively
>$ bin/hiveserver2 --hiveconf x1=y1 --hiveconf x2=y2 //this sets server-side variables x1 and x2 to y1 and y2 respectively
>$ bin/beeline --hiveconf x1=y1 --hiveconf x2=y2 //this sets client-side variables x1 and x2 to y1 and y2 respectively.
#设置HIVE_OPTS值,--hiveconf x1=y1 --hiveconf x2=y2,同上
5、运行时配置
#hive 查询是通过map-reduce实现查询的,因此,这样的查询可以通过hadoop的参数控制
#HiveCLI(不赞成使用)、Beeline的set命令 可以用来设置任何hadoop(或者hive)配置变量,例如:
beeline> SET mapred.job.tracker=myhost.mycompany.com:50030;
beeline> SET -v;
6、Hive, Map-Reduce and Local-Mode
#hive为大部分查询请求生成jobs,这些jobs的提交是通过集群指示参数设置
mapred.job.tracker
#小数据本地模式执行,mapred.local.dir必须指定路径(如:/tmp/<username>/mapred/local). (否则,将会抛出磁盘空间分配异常.)
hive> SET mapreduce.framework.name=local;
#默认本地模式是关闭的
hive> SET hive.exec.mode.local.auto=false;
#本地模式开启的情况下,满足以下条件的任务,将以本地模式执行
The total input size of the job is lower than: hive.exec.mode.local.auto.inputbytes.max (128MB by default)
The total number of map-tasks is less than: hive.exec.mode.local.auto.tasks.max (4 by default)
The total number of reduce tasks required is 1 or 0.
#本地模式下,不同的运行环境有不同的结果,以本地模式运行,会出现意想不到的行为或错误
#可以通过hive.mapred.local.mem设置jvm内存的使用,默认设置为0,hive让hadoop决定内存分配限制
7、hive日志
#日志配置文件
$HIVE_HOME/conf/hive-log4j.properties.
#日志存储路径配置
hive.log.dir=<other_location>
#通过命令行参数配置
bin/hive --hiveconf hive.root.logger=INFO,console //for HiveCLI (不建议使用)
bin/hiveserver2 --hiveconf hive.root.logger=INFO,console
#命令行修改配置
bin/hive --hiveconf hive.root.logger=INFO,DRFA //for HiveCLI (不建议使用)
bin/hiveserver2 --hiveconf hive.root.logger=INFO,DRFA
二、DDL
1、创建hive表
hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
创建一个名为“邀请”的表格,有两列和一个名为ds的分区列。分区列是一个虚拟列。它不是数据本身的一部分,而是来自于一个特定数据集被加载到的分区。
默认情况下,表被假定为文本输入格式,分隔符被假定为A(ctrl-a)。
2、list所有表
hive> SHOW TABLES;
3、显示表的所有列
hive> DESCRIBE invites;
4、修改或删除表
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');
5、修改列属性
hive> ALTER TABLE invites REPLACE COLUMNS (foo INT COMMENT 'only keep the first column');
6、删除表
hive> DROP TABLE pokes;
7、元数据存储
元数据位于嵌入式Derby数据库中,其磁盘存储位置是由名为javax.jdo.option.ConnectionURL的Hive配置变量决定的。默认情况下,这个位置是./metastore_db (see conf/hive-default.xml).
https://www.cnblogs.com/1130136248wlxk/articles/5517909.html
三、DML
1、从文件加载数据入hive
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
LOCAL:本地数据,未指定本参数,则从hadoop中读取
INPATH:源文件路径
OVERWRITE:数据存在则删除后再新增;未指定本参数,表示往表中追加数据
四、SQL
1、查询结果显示在console中
hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';
2、查询结果存入hadoop文件中(分区的表必须总是在语句的WHERE条件中选择一个分区。)
hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15';
3、数据查询存入本地文件系统
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;
4、查询数据存入另一张表或文件系统中的示例
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;
5、分组查询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;
6、关联查询JOIN
hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;
7、多表插入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;
8、流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';
五、简单用例
1、创建表
CREATE TABLE u_data (
userid INT,
movieid INT,
rating INT,
unixtime STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
2、加载数据
LOAD DATA LOCAL INPATH '<path>/u.data'
OVERWRITE INTO TABLE u_data;
3、查询
SELECT COUNT(*) FROM u_data;
4、创建python文件
Create 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)])
Use the mapper script:
5、使用python添加数据到新创建表
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;
6、查询
SELECT weekday, COUNT(*)
FROM u_data_new
GROUP BY weekday;
6、Apache Weblog Data
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;
六、集群
Hive中搭建分为三中方式 a)内嵌Derby方式 b)Local方式 c)Remote方式 三种方式归根到底就是元数据的存储位置不一样。
1、内嵌Derby方式
使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录。这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库。
2、本地模式
这种存储方式需要在本地运行一个mysql服务器,并作如下配置(下面两种使用mysql的方式,需要将mysql的jar包拷贝到$HIVE_HOME/lib目录下)。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
</property>
</configuration>
3)多用户模式
1.Remote一体:
这种存储方式需要在远端服务器运行一个mysql服务器,并且需要在Hive服务器启动meta服务。
这里用mysql的测试服务器,ip位192.168.1.214,新建hive_remote数据库,字符集位latine1
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://172.16.1.181:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>Shy!12345</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://172.16.1.181:9083</value>
</property>
<property>
<name>hive.server2.authentication</name>
<value>SASL</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>172.16.1.181</value>
<description>Bind host on which to run the HiveServer2 Thrift interface.
Can be overridden by setting $HIVE_SERVER2_THRIFT_BIND_HOST</description>
</property>
<property>
<name>hive.server2.transport.mode</name>
<value>binary</value>
<description>
Expects one of [binary, http].
Transport mode of HiveServer2.
</description>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
</configuration>