Hive整合Alluxio实操

前言

关于Alluxio的操作一定要推荐一把官网文档,里面官网的文档我个人觉得是最好的,这次操作整合的目标也是把官网的例子在自己的环境中跑成功。
官网Hive整合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";

小总结

  1. alluxio操作其实挺实在的,就是路径之间的切换,操作起来不是很困难
  2. 操作的时候需要注意查看hive输出的日志,对着日志去解决问题
  3. 我测试下来数据虽然在内存,但是并没有多大的提速,分析下来发现当前的配置仅仅读hdfs的操作是快速,涉及mr和临时数据耗时其实没有变化,后续接着深入研究
发布了48 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zhuxuemin1991/article/details/105169579