Hive 跨文件系统存储数据

2023-11-20 15:41:12 浏览数 (3)

说明

本文操作基于 弹性 MapReduce(EMR)

知识储备

Hive指定表的存储路径: hive可以在创建表的时候通过location指定表的存储路径,若不指定localtion则文件默认存储在hive-site.xml配置文件中hive.metastore.warehouse.dir配置项指向的路径。 此外,Hive的分区表还可以指定分区的存储路径。通过如下语句可以给分区指定:

1. 添加分区并指定location。例如:

代码语言:javascript复制
alter table test add partition (b=1) location 'path_to_dir';

2. 修改已有分区的location。例如:

代码语言:javascript复制
alter table test partition (b=1) set location 'path_to_dir';

使用场景

分区表可以是外表也可以是内表。实际业务场景中常常将时间列作为分区的依据,时间久远的历史数据是冷数据,而新数据是热数据。可能有以下几个原因希望将部分数据存储到cos上:

  1. 历史数据一般很少修改,很适合放在cos上(读取性能更优),且cos比hdfs更经济。
  2. hdfs的存储的数据太多容易导致datanode进程挂掉。

实操过程

1. hive建表

代码语言:javascript复制
create table test (a int) partitioned by (b int);

2. 添加分区

代码语言:javascript复制
alter table test add partition (b=1) location 'cosn://qiushan-1314/hive/test/b=1'

3. 插入数据

代码语言:javascript复制
insert into test partition (b=1) values (1);
insert into test partition (b=1) values (2);
insert into test partition (b=1) values (3);

发现此处插入的数据仍存储在hdfs上

代码语言:javascript复制
“Moving data to directory hdfs://HDFS3758/hive/test/b=1/.hive-staging_hive_2019-08-28_15-11-56_214_8585498400588849067-1/-ext-10000
Loading data to table default.test partition (b=1)”

4. 修改分区地址

代码语言:javascript复制
alter table test partition (b=1) set LOCATION 'cosn://qiushan-1314/hive/test/b=1'

5. 迁移分区数据

代码语言:javascript复制
hadoop distcp /usr/hive/warehouse/test/b=1 cosn://qiushan-1314/hive/tes

6. 删除hdfs上分区数据

代码语言:javascript复制
hadoop fs -rm -r /usr/hive/warehouse/test/b=1

7. 查询分区数据

代码语言:javascript复制
select * from test where b = 1;

缺陷

  1. insert操作可以成功执行,但数据依然存储在表的location指向的目录下;
  2. load操作无法执行
代码语言:javascript复制
Failed with exception Wrong FS: cosn://qiushan-1314/hive/test/b=1, expected: hdfs://10.10.10.10:4007

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

邀请人:岳涛,社区ID:7348459

0 人点赞