Hive部署及优化配置

1.1安装

1.Hive依赖hadoop环境,所有在装之前要先安装hadoop,hive一般安装在hadoop的NameNode节点上面;
2.下载 Hive最新Release版(0.7.1 ) http://www.apache.org/dyn/closer.cgi/hive/
3.将压缩安装包解压至一目录,如/home/hadoop/hive
4.配制metadata存放方式
默认metadatga是存放在derby里,这种方式不允许多个用户同时登陆hive shell,所有建议用mysql。
1)下载mysql驱动(http://download.csdn.net/detail/linjsh/2853585),并将驱动mysql-connector-java-5.1.11-bin.jar拷到/home/hadoop/hive/lib目录下;
2)将/home/hadoop/hive/conf目录下的hive-default.xml复制一份,并改名为hive-site.xml
cp /home/hadoop/hive/conf/hive-default.xml /home/hadoop/hive/conf/hive-site.xml
3)配制hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hivepasswd</value>
<description>password to use against metastore database</description>
</property>
上述配制项中javax.jdo.option.ConnectionURL指明连接mysql的主机,端口,数据库等信息。
配制完毕后,在shell下执行/home/hadoop/hive/bin/hive进入hive控制台,进入控制台后,会出现”hive> ”提示符,输入show tables 命令,如果执行没问题说明安装成功。

1.2 Hive的基本操作

1)创建表:CREATE TABLE pokes (foo INT,bar STRING);
2)创建表并创建分区字段ds
CREATE TABLE invites (foo INT,bar STRING) PARTITIONED BY (ds STRING);
3)显示所有表SHOW TABLES;
4)按正条件(正则表达式)显示表,SHOW TABLES ‘.*s’;
5)表添加一列ALTER TABLE pokes ADD COLUMNS (new_col INT);
6)添加一列并增加列字段注释ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT ‘a comment’);
7)更改表名ALTER TABLE events RENAME TO 3koobecaf;
8)将文件中的数据加载到表中
LOAD DATA LOCAL INPATH ‘./examples/files/kv1.txt’ OVERWRITE INTO TABLE pokes;
9)加载本地数据,同时给定分区信息
LOAD DATA LOCAL INPATH ‘./examples/files/kv2.txt’ OVERWRITE INTO TABLE invites PARTITION (ds=’2008-08-15′);
10)加载DFS数据 ,同时给定分区信息
LOAD DATA INPATH ‘/user/myname/kv2.txt’ OVERWRITE INTO TABLE invites PARTITION (ds=’2008-08-15′);
11)将查询结果输出至本地目录文件
INSERT OVERWRITE LOCAL DIRECTORY ‘/tmp/local_out’ SELECT a.* FROM pokes a;
12)为表创建索引
为表userloginlog创建索引
create index index_user_login_log on table userloginlog(userid) AS ‘org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler’ WITH DEFERRED REBUILD ;
为表userloginlog更新索引
ALTER INDEX index_user_login_log ON userloginlog REBUILD;
显示属于表index_user_login_log的索引
show index on index_user_login_log;
删除表userloginlog中的索引index_user_login_log
drop index index_user_login_log on userloginlog;
13)启动hive服务
bin/hive –service hiveserver  10000

1.3使用Hive进行数据分析的步聚

1.创建与Log文件字段相对应的Table,如日志文件
CREATE TABLE UserLoginLog(userid string,char_id string,user_name string,
user_ip string,login_time string,product_id string,
region_id string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’ STORED AS TEXTFILE
LOCATION ‘/home/hive/hivedata/login/’;
2.将日志文件数据导入到Hive Table中 导入数据有两种方式,一种是通过Load Data命令:
LOAD DATA LOCAL INPATH ‘/home/hive/test/login.log ‘ OVERWRITE INTO TABLE UserLoginLog,另外是直接通过sh命令将日志文件上传到HDFS中。
hadoop dfs -put /home/hive/test/login/* /home/hive/hivedata/login/
3.基于Hive Table进行数据分析,如分析每个区域用户登陆次数,并将结果保存至/tmp/result_out文件中
INSERT OVERWRITE LOCAL DIRECTORY ‘/tmp/result_out’ Select count(userid) from UserLoginLog group by region_id;
SELECT count(userid) FROM useractivelog JOIN
userloginlog ON (useractivelog.user_id = userloginlog.userid);

2.2 SQL优化

1.列裁剪(Column Pruning)
在读数据的时候,只读取查询中需要用到的列,而忽略其他列。例如,对于查询:
SELECT a,b FROM T WHERE e < 10;
其中,T 包含5 个列(a,b,c,d,e),列c,d 将会被忽略,只会读取a,b,e 列
这个选项默认为真: hive.optimize.cp = true
2.分区裁剪(Partition Pruning)
在查询的过程中减少不必要的分区。例如,对于下列查询:
SELECT * FROM (SELECT c1,COUNT(1)
FROM T GROUP BY c1) subq
WHERE subq.prtn = 100;

SELECT * FROM T1 JOIN
(SELECT * FROM T2) subq ON (T1.c1=subq.c2)
WHERE subq.prtn = 100;
此选项默认为真:hive.optimize.pruner=true
3.Join在使用写有Join 操作的查询语句时有一条原则:应该将条目少的表/子查询放在Join 操作符的左边。原因是在Join 操作的Reduce 阶段,位于Join 操作符左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生OOM 错误的几率。
4.合并小文件
小文件数目过多,会给HDFS 带来压力,并且严重影响处理效率,可以通过合并Map 和Reduce 的结果文件来消除这样的影响。对于小文件问题,Hadoop本身也提供了几个解决方案,分别为:Hadoop Archive,Sequence file和CombineFileInputFormat。具体的做法请参考http://dongxicheng.org/mapreduce/hdfs-small-files-solution/
5.创建索引
经测试创建索引不会提高查询速度。

2.3 基于分区优化

参考http://www.tbdata.org/archives/1765

3.1 测试环境

机器 用途 系统 硬件配制
hadoop1 Master Cenos5.S, Linux version 2.6.18-194.32.1.el5 Intel(R) Celeron(R) CPU 2.80GHz
1GMemory
hadoop2 Slave Cenos5.S, Linux version 2.6.18-194.32.1.el5 VM(Pentium(R) Dual-Core  CPU 2.5GHz)
1GMemory
hadoop3 Salve Cenos5.S, Linux version 2.6.18-194.32.1.el5 4CPU Intel(R) Xeon(R)E5606  @ 2.13GHz
4GMemory

3.2 测试数据

4月 30~6月4日共有36天的的用户登陆日志,文件大小为4.3G,6008万条数,数据是以Mysql数据文件的形式按天存储(一天数据单独存放一张表, 共有36张表)。

3.3 导入测试数据

1. 在mysql建立数据库名为hive的数据库,然后将数据文件copy到mysql数据目录的hive子目录下,这样在hive库中,就有36张表了;
2. 用脚本分别将36张表的数据导出至csv文本中,命令如下:
SELECT * FROM login_game_20110430  INTO OUTFILE ‘/var/lib/mysql/output/log1.csv’ FIELDS TERMINATED BY ‘\t’ LINES TERMINATED BY ‘\n’;
SELECT * FROM login_game_20110501  INTO OUTFILE ‘/var/lib/mysql/output/log2.csv’ FIELDS TERMINATED BY ‘\t’ LINES TERMINATED BY ‘\n’;对应的csv文件分别是log1.csv,log2.csv…….log36.csv;
3. 进入hive命令行,建立与日志文件字段相对应的表,语句如下:
CREATE TABLE UserLoginLog(userid string,char_id string,user_name string,
user_ip string,login_time string,product_id string,
region_id string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’ STORED AS TEXTFILE
LOCATION ‘/home/hive/hivedata/login/’
Location后面跟的目录就是表中数据存放在HDFS中的位置
1.       将log1.csv,log2.csv…..log36.csv批量导入到表UserLoginLog数据文件所在的目录,即创建表中所指定的目录“/home/hive/hivedata/login/
hadoop dfs -put /home/hive/test/datafrommysql/sum.csv /home/hive/hivedata/login/(上传时间为9分钟
经过如下步聚,数据已经完全导入,可以进行测试了。

3.4 测试结果

  Hive中的执行时间 Mysql中的执行时间
Select * from UserLoginLog where uid=’’ 3分4秒(on indexed)
3分39秒(indexed 创建索引需要23分钟)
47秒(no indexed)
1秒之内(indexed)
Select count(userid) from UserLoginLog 3分40秒 1秒之内
posted @ 2016-12-25 21:16  371502685  阅读(360)  评论(0编辑  收藏  举报