前言
关于Alluxio的操作一定要推荐一把官网文档,里面官网的文档我个人觉得是最好的,这次操作整合的目标也是把官网的例子在自己的环境中跑成功。
环境准备
Hive针对不管是hdfs也好,还是alluxio也好其实都是一个client的操作,针对配置目标也是让hive可以正常读写alluxio的路径就行。
根据自己的环境情况,在conf/hive-env.sh设置设置client jar包:
$ export HIVE_AUX_JARS_PATH=/<PATH_TO_ALLUXIO>/client/alluxio-2.2.0-client.jar:${HIVE_AUX_JARS_PATH}
本地的目标是在hive中建立一个表,需要用到数据,我下载了一个小的:
wget http://files.grouplens.org/datasets/movielens/ml-100k.zip
解压之后如下,后面需要用到里面的数据:
[hdfs@daas-service-01 ml-100k]$ pwd /home/hdfs/ml-100k [hdfs@daas-service-01 ml-100k]$ ll total 15776 -rwxr-x--- 1 hdfs hdfs 716 Jul 20 2000 allbut.pl -rwxr-x--- 1 hdfs hdfs 643 Jul 20 2000 mku.sh -rw-r----- 1 hdfs hdfs 6750 Jan 30 2016 README -rw-r----- 1 hdfs hdfs 1586544 Mar 9 2001 u1.base -rw-r----- 1 hdfs hdfs 392629 Mar 9 2001 u1.test -rw-r----- 1 hdfs hdfs 1583948 Mar 9 2001 u2.base -rw-r----- 1 hdfs hdfs 395225 Mar 9 2001 u2.test -rw-r----- 1 hdfs hdfs 1582546 Mar 9 2001 u3.base -rw-r----- 1 hdfs hdfs 396627 Mar 9 2001 u3.test -rw-r----- 1 hdfs hdfs 1581878 Mar 9 2001 u4.base -rw-r----- 1 hdfs hdfs 397295 Mar 9 2001 u4.test -rw-r----- 1 hdfs hdfs 1581776 Mar 9 2001 u5.base -rw-r----- 1 hdfs hdfs 397397 Mar 9 2001 u5.test -rw-r----- 1 hdfs hdfs 1792501 Mar 9 2001 ua.base -rw-r----- 1 hdfs hdfs 186672 Mar 9 2001 ua.test -rw-r----- 1 hdfs hdfs 1792476 Mar 9 2001 ub.base -rw-r----- 1 hdfs hdfs 186697 Mar 9 2001 ub.test -rw-r----- 1 hdfs hdfs 1979173 Jul 20 2000 u.data -rw-r----- 1 hdfs hdfs 202 Jul 20 2000 u.genre -rw-r----- 1 hdfs hdfs 36 Jul 20 2000 u.info -rw-r----- 1 hdfs hdfs 236344 Jul 20 2000 u.item -rw-r----- 1 hdfs hdfs 193 Jul 20 2000 u.occupation -rw-r----- 1 hdfs hdfs 22628 Jul 20 2000 u.user
建立Hive内部表关联alluxio
建立内部表的操作实现的是hive的表直接关联到alluxio上,这个的效果是相当于一张内存表,需要做的操作是把表的LOCATION指向alluxio即可:
执行命令,把数据复制到alluxio上:
[hdfs@daas-service-01 alluxio]$ ./bin/alluxio fs copyFromLocal /home/hdfs/ml-100k/u.user alluxio://daas-service-01:19998/ml-100k Copied file:///home/hdfs/ml-100k/u.user to alluxio://daas-service-01:19998/ml-100k
我们查看alluxio ui:
建立hive表,把路径关联上即可,和hdfs上的表操作差不多
hive> CREATE TABLE u_user ( > userid INT, > age INT, > gender CHAR(1), > occupation STRING, > zipcode STRING) > ROW FORMAT DELIMITED > FIELDS TERMINATED BY '|' > STORED AS TEXTFILE > LOCATION 'alluxio://daas-service-01:19998/ml-100k'; OK Time taken: 3.485 seconds
建立Hive外部表关联alluxio操作
外部表关联就是表和数据只是关联关系,调整location就行
hive> CREATE EXTERNAL TABLE u_user_2 ( > userid INT, > age INT, > gender CHAR(1), > occupation STRING, > zipcode STRING) > ROW FORMAT DELIMITED > FIELDS TERMINATED BY '|' > STORED AS TEXTFILE > LOCATION 'alluxio://daas-service-01:19998/ml-100k'; OK
其实只要指定location就行,其他的话和以前没啥区别~
调整原有hdfs上的表读取alluxio
场景是以前的hive表是直接读取hdfs的,现在需要调整为alluxio,这个场景带来的效果是,第一次读取表的时候还是读取hdfs,但是读取完成时候,数据hdfs上加载到alluxio上,这个操作的前提是alluxio的根路径需要和hdfs的根路径关联,这个需要补充的是这里只要实现hdfs的路径和alluxio是重叠的,alluxio可以感知到路径被读取了,需要调整配置,重启alluxio
alluxio.master.mount.table.root.ufs=hdfs://daas-service-01/
接下来的是表的操作,首先是建立一张普通表:
CREATE TABLE u_user_3 ( userid INT, age INT, gender CHAR(1), occupation STRING, zipcode STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' STORED AS TEXTFILE ;
再导入数据:
LOAD DATA LOCAL INPATH '/home/hdfs/ml-100k/u.user' OVERWRITE INTO TABLE u_user_3;
Time taken: 0.196 seconds, Fetched: 5 row(s) hive> desc formatted u_user_3; OK # col_name data_type comment userid int age int gender char(1) occupation string zipcode string # Detailed Table Information Database: default Owner: hdfs CreateTime: Sun Mar 29 09:07:06 CST 2020 LastAccessTime: UNKNOWN Retention: 0 Location: hdfs://daas-service-01/bip/hive_warehouse/u_user_3 ......
这里只是普通操作,数据还是存储在hdfs中,接下来需要修改表的存储路径到alluxio中:
alter table u_user_3 set location "alluxio://daas-service-01:19998/bip/hive_warehouse/u_user_3";
我们再对这个表查询:
select count(*) from u_user_3;
我们再去alluxio中可以看到表数据被cache住了
我们可以在hive执行日志中看到读取了alluxio的数据了
alluxio表调整回hdfs
这个其实是一个逆操作,只需要把表的location调整回去就好了
alter table u_user_3 set location "hdfs://daas-service-01/bip/hive_warehouse/u_user_3";
小总结
- alluxio操作其实挺实在的,就是路径之间的切换,操作起来不是很困难
- 操作的时候需要注意查看hive输出的日志,对着日志去解决问题
- 我测试下来数据虽然在内存,但是并没有多大的提速,分析下来发现当前的配置仅仅读hdfs的操作是快速,涉及mr和临时数据耗时其实没有变化,后续接着深入研究