写点什么

6W+ 字记录实验全过程 | 探索 Alluxio 经济化数据存储策略

作者:Alluxio
  • 2022 年 7 月 20 日
  • 本文字数:19851 字

    阅读完需:约 65 分钟

6W+字记录实验全过程 | 探索Alluxio经济化数据存储策略


探索背景

随着大数据应用的不断发展,数据仓库、数据湖的大数据实践层出不穷;无论是电信、金融、政府,各个行业的大数据热潮蓬勃发展。在过去的 4-5 年中,我们不断看到企业用户大数据膨胀问题日益加剧,大数据创新下数据存储成本呈现线性增长,使得企业对于大数据的应用开始变得谨慎、变向放缓了企业内部数据化转型的速度。


核心的挑战:如何更加经济地构建数据湖存储体系。


大数据存储引擎从 2006 年发布以来,百花齐放,计算侧 MapReduce、Spark、Hive、Impala、Presto、Storm、Flink 的问世不断突破应用领域,不过在大数据存储方面反而显得慎重与沉稳。在过去十多年,在 Apache Hadoop 生态被广泛提及的主要还是 HDFS 与 Ozone。


HDFS

Hadoop HDFS 是一种分布式文件系统,旨在在商用硬件上运行以提高其普适性。它与现有的分布式文件系统有很多相似之处。但是,HDFS 的特点也是鲜明的:具备高度容错性、旨在部署在低成本硬件、允许水平扩缩容。HDFS 提供对应用程序数据访问的高吞吐量,适用于需要处理海量数据集的应用服务。


Ozone

Apache Ozone 是一种高度可扩展的分布式存储,适用于分析、大数据和云原生应用程序。Ozone 支持 S3 兼容对象 API 以及 Hadoop 兼容文件系统协议。它针对高效的对象存储和文件系统操作进行了优化。


经济化数据存储策略,主要体现在两个关键特性上,只要实现了,其他的增强都会如虎添翼:

  1. 使用最合适的存储系统存储对应的数据分块;

  2. 数据存储策略对上层应用的侵入性越低越好;


比如 HDFS 典型场景下使用 3 副本的策略,一方面是确保数据块的高可用性,同时多个副本也可以更好地保障数据局部性的要求,提高数据访问的吞吐量;为了更好地提供数据服务,硬件环境也会选用相对更好的磁盘;对于早期的大数据实践而言,标准统一的软硬件选择可以提高对新技术栈的推动,但是随着数据的不断积累,很多数据的访问频率呈现指数级下降,尤其是针对合规检查的冷数据,不仅仅占据了生产集群的大量空间,可能一年到头都没有被访问过一次。这是对资源的极大浪费。


大数据发展的现阶段,精细化数据存储被提上了议程。需要一种分层的存储体系,在维系现有计算性能的同时,将温、冷数据实现对上层应用透明的自主迁移,控制数据存储与维护的成本。

关键特性验证

通过这篇文章,我们希望可以对经济化数据存储策略做一个初步探索,首先我们将先前提到的两个关键特性具象化,然后通过几组实验对技术可行性进行一个讨论。

关键特性一:使用一套存储系统作为热数据系统;使用另一套存储系统作为冷数据系统;

关键特性二:统一命名空间同时兼容多套存储系统,通过统一命名空间对上层应用提供数据访问服务;


技术选择:

  • 计算引擎: Hive (大部分企业用户使用 SQL 引擎作为数据开发工具)

  • 存储引擎: HDFS/Ozone (业界常用的 Apache 生态存储)

  • 数据编排引擎: Alluxio (第三方开源组件,兼容大部分 Apache 生态组件)


Hive

Apache Hive ™ 数据仓库软件有助于使用 SQL 读取、写入和管理驻留在分布式存储中的大型数据集。结构可以投影到已经存储的数据上。提供了一个命令行工具和 JDBC 驱动程序允许用户连接到 Hive。


关于 Alluxio

“Alluxio 数据编排系统”是全球首个分布式超大规模数据编排系统,孵化于加州大学伯克利分校 AMP 实验室。自项目开源以来,已有超过来自 300 多个组织机构的 1200 多位贡献者参与开发。Alluxio 能够在跨集群、跨区域、跨国家的任何云中将数据更紧密地编排到接近数据分析和 AI/ML 应用程序的集群中,从而向上层应用提供内存级别的数据访问速度。


作为大数据生态系统中的存储与计算分离技术标准,在阿里云、腾讯云、华为云、金山云等国内顶级云厂商服务中得到生产检验,是建设企业私有云的基石和核心技术。2021 年成立后,先后荣登“中关村国际前沿科技创新大赛大数据与云计算领域 TOP10”、“2021 投资界数字科技 VENTURE50”、“科创中国”开源创新榜等多项榜单。


技术可行性研究,我们分两个阶段进行:

阶段一:使用同一类型的存储系统 HDFS,实现不同 HDFS 系统之间的冷热分层【模拟场景:使用新的 HDFS3.0 EC 或者用磁盘密集型的机器专门搭建冷数据 HDFS】

阶段二:使用不同类型的存储系统,使用 HDFS 作为热数据存储系统;使用 Ozone 作为冷数据存储系统 【模拟场景:HDFS 负责热数据/Ozone 负责冷数据】


验证步骤

部署架构


软件版本:

  • 计算引擎:Hive 2.3.9

  • 存储引擎:Hadoop 2.10.1,Ozone 1.2.1,Alluxio 2.8

  • 所有组件均为单机模式部署集群规划:


实验一:基于 Alluxio 实现跨 HDFS 的透明数据冷热分层

Step 1: 在 Hive 中创建库、分区表,默认数据存储在 HDFS_1 上

create database test location "/user/hive/test.db";create external table test.test_part(value string) partitioned by (dt string);


#创建库

hive> create database test location '/user/hive/test.db';

OK

Time taken: 1.697 seconds

hive>


#创建表

hive> create external table test.test_part(value string) partitioned by (dt string);

OK

Time taken: 0.607 seconds

hive>

Step 2: Alluxio Union URI 实现跨 HDFS 集群统一命名空间集成

alluxio fs mount--option alluxio-union.hdfs1.uri=hdfs://namenode_1:8020/user/hive/test.db/test_part--option alluxio-union.hdfs2.uri=hdfs://namenode_2:8020/user/hive/test.db/test_part--option alluxio-union.priority.read=hdfs1,hdfs2--option alluxio-union.collection.create=hdfs1/user/hive/test.db/test_part union://test_part/
复制代码

#以 Alluxio Union URI 方式挂载测试目录

[root@ip-172-31-17-3 ~]# alluxio fs mkdir /user/hive/test.dbSuccessfully created directory /user/hive/test.db[root@ip-172-31-17-3 conf]# alluxio fs mount \--option alluxio-union.hdfs1.uri=hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/test.db/test_part \--option alluxio-union.hdfs2.uri=hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_part \--option alluxio-union.priority.read=hdfs1,hdfs2 \--option alluxio-union.collection.create=hdfs1 \/user/hive/test.db/test_part union://test_part/Mounted union://test_part/ at /user/hive/test.db/test_part[root@ip-172-31-17-3 ~]#
复制代码

Step 3: 修改 Hive 表路径为 Union URI 路径,屏蔽跨异构存储的技术细节

alter table test.test_part set location "alluxio://alluxio:19998/user/hive/test.db/test_part";
复制代码


#修改 Hive 表格对应的路径

hive> alter table test.test_part set location "alluxio://ip-172-31-17-3.us-west-2.compute.internal:19998/user/hive/test.db/test_part";OKTime taken: 0.143 secondshive>
复制代码

Step 4: 模拟数据

mkdir dt\=2022-06-0{1..6}echo 1abc > dt\=2022-06-01/000000_0echo 2def > dt\=2022-06-02/000000_0echo 3ghi > dt\=2022-06-03/000000_0echo 4jkl > dt\=2022-06-04/000000_0echo 5mno > dt\=2022-06-05/000000_0echo 6pqr > dt\=2022-06-06/000000_0hdfs dfs -put dt\=2022-06-0{1..3} hdfs://namenode_1:8020/user/hive/test.db/test_parthdfs dfs -put dt\=2022-06-0{4..6} hdfs://namenode_2:8020/user/hive/test.db/test_part 
复制代码


[root@ip-172-31-17-3 ~]# mkdir dt=2022-06-0{1..6}[root@ip-172-31-17-3 ~]# echo 1abc > dt=2022-06-01/000000_0[root@ip-172-31-17-3 ~]# echo 2def > dt=2022-06-02/000000_0[root@ip-172-31-17-3 ~]# echo 3ghi > dt=2022-06-03/000000_0[root@ip-172-31-17-3 ~]# echo 4jkl > dt=2022-06-04/000000_0[root@ip-172-31-17-3 ~]# echo 5mno > dt=2022-06-05/000000_0[root@ip-172-31-17-3 ~]# echo 6pqr > dt=2022-06-06/000000_0
复制代码


#将模拟数据分别存入 hdfs1、hdfs2


[root@ip-172-31-17-3 ~]# hdfs dfs -put dt=2022-06-0{1..3} hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/test.db/test_part[root@ip-172-31-17-3 ~]# hdfs dfs -mkdir -p hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_part[root@ip-172-31-17-3 ~]# hdfs dfs -put dt=2022-06-0{4..6} hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_part
复制代码


#查询 hdfs1 和 hdfs2,确认数据存入完成


[root@ip-172-31-17-3 ~]# hdfs dfs -ls hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/test.db/test_partFound 3 itemsdrwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 08:09 hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/test.db/test_part/dt=2022-06-01drwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 08:09 hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/test.db/test_part/dt=2022-06-02drwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 08:09 hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/test.db/test_part/dt=2022-06-03[root@ip-172-31-17-3 ~]# hdfs dfs -ls hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_partFound 3 itemsdrwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 08:10 hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_part/dt=2022-06-04drwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 08:10 hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_part/dt=2022-06-05drwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 08:10 hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_part/dt=2022-06-06
复制代码


#通过查询 alluxio Union URI 再次确认数据存入 hdfs1 和 hdfs2,以及 Union URI 跨存储关联生效


[root@ip-172-31-17-3 ~]# alluxio fs ls /user/hive/test.db/test_partdrwxr-xr-x  root           hdfsadmingroup               1       PERSISTED 07-13-2022 08:09:19:243  DIR /user/hive/test.db/test_part/dt=2022-06-02drwxr-xr-x  root           hdfsadmingroup               1       PERSISTED 07-13-2022 08:09:19:219  DIR /user/hive/test.db/test_part/dt=2022-06-01drwxr-xr-x  root           hdfsadmingroup               1       PERSISTED 07-13-2022 08:10:49:740  DIR /user/hive/test.db/test_part/dt=2022-06-06drwxr-xr-x  root           hdfsadmingroup               1       PERSISTED 07-13-2022 08:10:49:721  DIR /user/hive/test.db/test_part/dt=2022-06-05drwxr-xr-x  root           hdfsadmingroup               1       PERSISTED 07-13-2022 08:10:49:698  DIR /user/hive/test.db/test_part/dt=2022-06-04drwxr-xr-x  root           hdfsadmingroup               1       PERSISTED 07-13-2022 08:09:19:263  DIR /user/hive/test.db/test_part/dt=2022-06-03[root@ip-172-31-17-3 ~]#
复制代码

Step 5: 刷新 Hive 表元数据

MSCK REPAIR TABLE test.test_part;
复制代码


hive> MSCK REPAIR TABLE test.test_part;OKPartitions not in metastore:    test_part:dt=2022-06-01 test_part:dt=2022-06-02 test_part:dt=2022-06-03 test_part:dt=2022-06-04 test_part:dt=2022-06-05 test_part:dt=2022-06-06Repair: Added partition to metastore test.test_part:dt=2022-06-01Repair: Added partition to metastore test.test_part:dt=2022-06-02Repair: Added partition to metastore test.test_part:dt=2022-06-03Repair: Added partition to metastore test.test_part:dt=2022-06-04Repair: Added partition to metastore test.test_part:dt=2022-06-05Repair: Added partition to metastore test.test_part:dt=2022-06-06Time taken: 1.677 seconds, Fetched: 7 row(s)
复制代码


#通过 select 方式观察到 Hive 元数据刷新后,alluxio union URI 关联生效体现到 Hive 表中


hive> select * from test.test_part;OK1abc    2022-06-012def    2022-06-023ghi    2022-06-034jkl    2022-06-045mno    2022-06-056pqr    2022-06-06Time taken: 1.624 seconds, Fetched: 6 row(s)hive>
复制代码

Step 6: 配置冷热自动分层策略

alluxio fs policy add /user/hive/test.db/test_part "ufsMigrate(olderThan(2m), UFS[hdfs1]:REMOVE, UFS[hdfs2]:STORE)"
复制代码


#设置策略:冷数据(本例中按生成超过 2 分钟的数据)自动从热存储(hdfs1)迁移到冷存储(hdfs2)


[root@ip-172-31-17-3 ~]# alluxio fs policy add /user/hive/test.db/test_part "ufsMigrate(olderThan(2m), UFS[hdfs1]:REMOVE, UFS[hdfs2]:STORE)"Policy ufsMigrate-/user/hive/test.db/test_part is added to /user/hive/test.db/test_part.  
复制代码


#通过 Alluxio 命令行查看策略设置成功与否

[root@ip-172-31-17-3 ~]# alluxio fs policy listid: 1657700423909name: "ufsMigrate-/user/hive/test.db/test_part"path: "/user/hive/test.db/test_part"created_at: 1657700423914scope: "RECURSIVE"condition: "olderThan(2m)"action: "DATA(UFS[hdfs1]:REMOVE, UFS[hdfs2]:STORE)"[root@ip-172-31-17-3 ~]
复制代码


##策略生效后分别查看 hdfs1 和 hdfs2,可以观察到 hdfs1 里面超过 2 分钟的数据都迁移到 hdfs2 中

[root@ip-172-31-17-3 logs]# hdfs dfs -ls hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/test.db/test_part[root@ip-172-31-17-3 logs]# hdfs dfs -ls hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_partFound 6 itemsdrwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 08:26 hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_part/dt=2022-06-01drwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 08:26 hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_part/dt=2022-06-02drwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 08:26 hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_part/dt=2022-06-03drwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 08:10 hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_part/dt=2022-06-04drwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 08:10 hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_part/dt=2022-06-05drwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 08:10 hdfs://ip-172-31-19-127.us-west-2.compute.internal:8020/user/hive/test.db/test_part/dt=2022-06-06[root@ip-172-31-17-3 logs]
复制代码


##策略生效,冷数据自动迁移过程中和完成后查 Hive 都得到如下预期查询结果:

hive> select * from test.test_part;OK1abc    2022-06-012def    2022-06-023ghi    2022-06-034jkl    2022-06-045mno    2022-06-056pqr    2022-06-06Time taken: 0.172 seconds, Fetched: 6 row(s)hive>
复制代码


最后,我们将实验一的两个步骤:(1)通过 Alluxio 的 Union URI 实现跨两个 HDFS 存储系统的 Hive 表的数据联邦,和(2)通过 Alluxio 实现跨两个 HDFS 存储系统的透明数据冷热分层,在图 1 和图 2 中分别以简化示意图的方式展示,便于更好的理解实验目标、过程和结果。


图 1:通过 Alluxio 的 Union URI 实现跨两个 HDFS 存储系统的 Hive 表的数据联邦的示意图


图 2:通过 Alluxio 实现跨两个 HDFS 存储系统的透明数据冷热分层示意图


下一组实验只是将上一组实验设定中的两个 HDFS 存储系统更改成了两个异构存储系统 HDFS(热存储)和 Ozone(冷存储),从透明冷热分层功能层面效果是相同的。


实验二:基于 Alluxio 实现跨异构存储(HDFS 和 Ozone)的透明数据冷热分层

step 1 : hive 创建库、表

create database hdfsToOzone location '/user/hive/hdfsToOzone.db';create external table hdfsToOzone.test(value string) partitioned by (dt string);
复制代码


#创建库

hive> create database hdfsToOzone location '/user/hive/hdfsToOzone.db';OKTime taken: 0.055 secondshive>#创建表hive> create external table hdfsToOzone.test(value string) partitioned by (dt string);OKTime taken: 0.1 secondshive>
复制代码

step 2: Alluxio Union URI 实现跨 HDFS/Ozone 集群统一命名空间集成

alluxio fs mount--option alluxio-union.hdfs.uri=hdfs://HDFS1:8020/user/hive/hdfsToOzone.db/test--option alluxio-union.ozone.uri=o3fs://bucket.volume/hdfsToOzone.db/test--option alluxio-union.priority.read=hdfs,ozone--option alluxio-union.collection.create=hdfs--option alluxio.underfs.hdfs.configuration=/mnt1/ozone-1.2.1/etc/hadoop/ozone-site.xml/user/hive/hdfsToOzone.db/test union://HDFS_TO_OZONE/
复制代码

#在 Ozone 中使用命令行工具创建 volume、bucket

[root@ip-172-31-19-127 ~]# ozone sh volume create /v-alluxio[root@ip-172-31-19-127 ~]# ozone sh bucket create /v-alluxio/b-alluxio[root@ip-172-31-19-127 ~]# ozone fs -mkdir -p o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/test[root@ip-172-31-19-127 ~]
复制代码


##先在 Alluxio 中创建实验目录,然后以 Union URI 方式挂载目录

[root@ip-172-31-17-3 ~]# alluxio fs mkdir /user/hive/hdfsToOzone.dbSuccessfully created directory /user/hive/hdfsToOzone.db[root@ip-172-31-17-3 ~]# alluxio fs mount \--option alluxio-union.hdfs.uri=hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/hdfsToOzone.db/test \--option alluxio-union.ozone.uri=o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/test \--option alluxio-union.priority.read=hdfs,ozone \--option alluxio-union.collection.create=hdfs \--option alluxio.underfs.hdfs.configuration=/mnt1/ozone-1.2.1/etc/hadoop/ozone-site.xml \/user/hive/hdfsToOzone.db/test union://HDFS_TO_OZONE/Mounted union://HDFS_TO_OZONE/ at /user/hive/hdfsToOzone.db/test[root@ip-172-31-17-3 ~]#
复制代码

step 3: 修改 Hive 表路径为 Union URI 路径,屏蔽跨异构存储的技术细节

alter table hdfsToOzone.test set location "alluxio://alluxio:19998/user/hive/hdfsToOzone.db/test";
复制代码


#修改 Hive 表格对应的路径

hive> alter table hdfsToOzone.test set location "alluxio://ip-172-31-17-3.us-west-2.compute.internal:19998/user/hive/hdfsToOzone.db/test";OKTime taken: 1.651 secondshive>
复制代码

step 4: 模拟数据

ozone fs -put dt=2022-06-0{1..3} o3fs://b-alluxio.v-alluxio.ozone:9862/hdfsToOzone.db/testhdfs dfs -put dt=2022-06-0{4..6} hdfs://HDFS1:8020/user/hive/hdfsToOzone.db/test
复制代码


#将数据存入 ozone

[root@ip-172-31-19-127 ~]# ozone fs -put dt=2022-06-0{1..3} o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/test2022-07-13 10:00:38,920 [main] INFO impl.MetricsConfig: Loaded properties from hadoop-metrics2.properties2022-07-13 10:00:38,981 [main] INFO impl.MetricsSystemImpl: Scheduled Metric snapshot period at 10 second(s).2022-07-13 10:00:38,981 [main] INFO impl.MetricsSystemImpl: XceiverClientMetrics metrics system started2022-07-13 10:00:39,198 [main] INFO metrics.MetricRegistries: Loaded MetricRegistries class org.apache.ratis.metrics.impl.MetricRegistriesImpl
复制代码


#通过命令行查询 ozone,确认数据存入完成

[root@ip-172-31-19-127 ~]# ozone fs -ls o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/testFound 3 itemsdrwxrwxrwx   - root root          0 2022-07-13 10:00 o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/test/dt=2022-06-01drwxrwxrwx   - root root          0 2022-07-13 10:00 o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/test/dt=2022-06-02drwxrwxrwx   - root root          0 2022-07-13 10:00 o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/test/dt=2022-06-03[root@ip-172-31-19-127 ~]
复制代码


##将数据存入 hdfs1,并通过命令行查询 hdfs1,确认数据存入完成

[root@ip-172-31-17-3 ~]# hdfs dfs -put dt=2022-06-0{4..6} hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/hdfsToOzone.db/test[root@ip-172-31-17-3 ~]# hdfs dfs -ls hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/hdfsToOzone.db/testFound 3 itemsdrwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 10:06 hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/hdfsToOzone.db/test/dt=2022-06-04drwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 10:06 hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/hdfsToOzone.db/test/dt=2022-06-05drwxr-xr-x   - root hdfsadmingroup          0 2022-07-13 10:06 hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/hdfsToOzone.db/test/dt=2022-06-06[root@ip-172-31-17-3 ~]
复制代码

##通过 Alluxio 命令行查询,再次确认数据存入 hdfs1 和 ozone,以及 Union URI 跨存储关联生效

[root@ip-172-31-17-3 ~]# alluxio fs ls /user/hive/hdfsToOzone.db/testdrwxrwxrwx  root           root                         0       PERSISTED 07-13-2022 10:00:40:670  DIR /user/hive/hdfsToOzone.db/test/dt=2022-06-02drwxrwxrwx  root           root                         0       PERSISTED 07-13-2022 10:00:38:691  DIR /user/hive/hdfsToOzone.db/test/dt=2022-06-01drwxr-xr-x  root           hdfsadmingroup               0       PERSISTED 07-13-2022 10:06:29:206  DIR /user/hive/hdfsToOzone.db/test/dt=2022-06-06drwxr-xr-x  root           hdfsadmingroup               0       PERSISTED 07-13-2022 10:06:29:186  DIR /user/hive/hdfsToOzone.db/test/dt=2022-06-05drwxr-xr-x  root           hdfsadmingroup               0       PERSISTED 07-13-2022 10:06:29:161  DIR /user/hive/hdfsToOzone.db/test/dt=2022-06-04drwxrwxrwx  root           root                         0       PERSISTED 07-13-2022 10:00:40:762  DIR /user/hive/hdfsToOzone.db/test/dt=2022-06-03[root@ip-172-31-17-3 ~]#
复制代码

step 5: 刷新 Hive 表元数据

MSCK REPAIR TABLE hdfsToOzone.test;
复制代码


hive> MSCK REPAIR TABLE hdfsToOzone.test;OKPartitions not in metastore:    test:dt=2022-06-01      test:dt=2022-06-02      test:dt=2022-06-03      test:dt=2022-06-04      test:dt=2022-06-05      test:dt=2022-06-06Repair: Added partition to metastore hdfsToOzone.test:dt=2022-06-01Repair: Added partition to metastore hdfsToOzone.test:dt=2022-06-02Repair: Added partition to metastore hdfsToOzone.test:dt=2022-06-03Repair: Added partition to metastore hdfsToOzone.test:dt=2022-06-04Repair: Added partition to metastore hdfsToOzone.test:dt=2022-06-05Repair: Added partition to metastore hdfsToOzone.test:dt=2022-06-06Time taken: 0.641 seconds, Fetched: 7 row(s)hive>
复制代码


#通过 select 方式观察到 hive 元数据刷新后,alluxio union URI 关联生效体现到 hive 表中

hive> select * from hdfsToOzone.test ;OK1abc    2022-06-012def    2022-06-023ghi    2022-06-034jkl    2022-06-045mno    2022-06-056pqr    2022-06-06Time taken: 0.156 seconds, Fetched: 6 row(s)hive>
复制代码

step 6: 配置策略

alluxio fs policy add /user/hive/hdfsToOzone.db/test" ufsMigrate(olderThan(2m), UFS[hdfs]:REMOVE, UFS[ozone]:STORE)"
复制代码


#设置策略:冷数据(本例中按生成超过 2 分钟的数据)自动从热存储(hdfs1)迁移到冷存储(ozone)

[root@ip-172-31-17-3 ~]# alluxio fs policy add /user/hive/hdfsToOzone.db/test/ "ufsMigrate(olderThan(2m), UFS[hdfs]:REMOVE, UFS[ozone]:STORE)"Policy ufsMigrate-/user/hive/hdfsToOzone.db/test is added to /user/hive/hdfsToOzone.db/test.
复制代码


#通过 Alluxio 命令行查看策略设置成功与否

[root@ip-172-31-17-3 ~]# alluxio fs policy listid: 1657707130843name: "ufsMigrate-/user/hive/hdfsToOzone.db/test"path: "/user/hive/hdfsToOzone.db/test"created_at: 1657707130843scope: "RECURSIVE"condition: "olderThan(2m)"action: "DATA(UFS[hdfs]:REMOVE, UFS[ozone]:STORE)"[root@ip-172-31-17-3 ~]#
复制代码


#策略生效后分别查看 hdfs1 和 ozone,可以观察到 hdfs1 里面超过 2 分钟的数据都迁移到 ozone 中

[root@ip-172-31-17-3 ~]# ozone fs -ls o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/testFound 6 itemsdrwxrwxrwx   - root root          0 2022-07-13 10:00 o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/test/dt=2022-06-01drwxrwxrwx   - root root          0 2022-07-13 10:00 o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/test/dt=2022-06-02drwxrwxrwx   - root root          0 2022-07-13 10:00 o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/test/dt=2022-06-03drwxrwxrwx   - root root          0 2022-07-13 10:21 o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/test/dt=2022-06-04drwxrwxrwx   - root root          0 2022-07-13 10:21 o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/test/dt=2022-06-05drwxrwxrwx   - root root          0 2022-07-13 10:21 o3fs://b-alluxio.v-alluxio/hdfsToOzone.db/test/dt=2022-06-06[root@ip-172-31-17-3 ~]# hdfs dfs -ls hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/user/hive/hdfsToOzone.db/test[root@ip-172-31-17-3 ~]
复制代码


##策略生效,冷数据自动迁移过程中和完成后查 hive 都得到如下预期查询结果:

hive> select * from hdfsToOzone.test ;OK1abc    2022-06-012def    2022-06-023ghi    2022-06-034jkl    2022-06-045mno    2022-06-056pqr    2022-06-06Time taken: 0.144 seconds, Fetched: 6 row(s)hive>
复制代码

实验小结

可以看出,实验二的执行过程和效果展示和实验一几乎是如出一辙,除了冷数据存储系统从 hdfs2 切换成了一个异构存储系统 Ozone。


通过实验,我们充分验证了 Alluxio 数据编排是如何成功将上层应用 (比如基于 Hive 的数仓建设) 与底层数据持久化策略 (使用 hdfs 或者 Ozone, 是否进行冷热分层等) 解耦合的。同时也体现了 Alluxio 对于异构存储系统的通用性和易用性。


最后希望这篇文章对各位如何使用 Alluxio 经济化数据存储策略有所启迪。


附录

Alluxio 集成 Hive 及 HDFS 的方式 Alluxio 配置
echo 'export ALLX_HOME=/mnt1/alluxio' >> ~/.bashrcecho 'export PATH=$PATH:$ALLX_HOME/bin' >> ~/.bashrc
复制代码


alluxio.master.hostname=ip-172-31-17-3.us-west-2.compute.internal                                                                                                                                                         alluxio.underfs.address=hdfs://ip-172-31-30-130.us-west-2.compute.internal:8020/alluxio alluxio.worker.tieredstore.level0.dirs.path=/alluxio/ramdisk
alluxio.worker.memory.size=4Galluxio.worker.tieredstore.levels=1alluxio.worker.tieredstore.level0.alias=MEMalluxio.user.file.readtype.default=CACHEalluxio.user.file.writetype.default=ASYNC_THROUGHalluxio.security.login.impersonation.username=_HDFS_USER_alluxio.master.security.impersonation.yarn.groups=*alluxio.master.security.impersonation.hive.groups=*alluxio.user.metrics.collection.enabled=truealluxio.user.block.size.bytes.default=64MB
######## Explore ########alluxio.user.block.write.location.policy.class=alluxio.client.block.policy.DeterministicHashPolicyalluxio.user.ufs.block.read.location.policy=alluxio.client.block.policy.DeterministicHashPolicyalluxio.user.ufs.block.read.location.policy.deterministic.hash.shards=1alluxio.user.file.persist.on.rename=truealluxio.master.persistence.blacklist=.staging,_temporary,.tmpalluxio.user.file.passive.cache.enabled=false
复制代码


Hive 客户端 core-site.xml

cp /hadoop_home/etc/hadoop/core-site.xml /hive_home/conf
复制代码
拷贝 jar 分别到 hadoop 和 hive home 下的 lib 子目录中
cp /<PATH_TO_ALLUXIO>/client/alluxio-enterprise-2.8.0-1.0-client.jar /hadoop_home/share/lib cp /<PATH_TO_ALLUXIO>/client/alluxio-enterprise-2.8.0-1.0-client.jar /hive_home/lib
复制代码
配置 alluxio 文件系统

vim /hive_home/conf/core-site.xml <property> <name>fs.alluxio.impl</name> <value>alluxio.hadoop.FileSystem</value></property><property> <name>alluxio.master.rpc.addresses</name> <value>ip-172-31-17-3.us-west-2.compute.internal:19998</value></property>
复制代码

HDFS 授权

查看 hdfs 超级用户
vim /hadoop_home/etc/hadoop/hdfs-site.xml<property><name>dfs.permissions.superusergroup</name><value>hdfsadmingroup</value></property>
复制代码
将用户 Alluxio 增加到 supergroup
groupadd hdfsadmingroupusermod -a -G hdfsadmingroup root
复制代码
同步系统的权限信息到 HDFS
su - hdfs -s /bin/bash -c "hdfs dfsadmin -refreshUserToGroupsMappings"
复制代码
开启 hdfs acl
vim /hadoop_home/etc/hadoop/hdfs-site.xml<property><name>dfs.permissions.enabled</name><value>true</value></property><property><name>dfs.namenode.acls.enabled</name><value>true</value></property> su - hdfs -s /bin/bash -c "hdfs dfs -setfacl -R -m user:root:rwx /"
复制代码


Ozone 部署

配置文件

wget https://dlcdn.apache.org/ozone/1.2.1/ozone-1.2.1.tar.gz echo 'export OZONE_HOME=/mnt1/ozone-1.2.1' >> ~/.bashrcecho 'export PATH=$PATH:$OZONE_HOME/bin:$OZONE_HOME/sbin' >> ~/.bashrc 
复制代码


##在 ozone-site.xml 中加入必要配置信息

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><configuration><property><name>ozone.om.address</name><value>ip-172-31-19-127.us-west-2.compute.internal:9862</value></property><property><name>ozone.metadata.dirs</name><value>/mnt/ozone-1.2.1/metadata/ozone</value></property><property><name>ozone.scm.client.address</name><value>ip-172-31-19-127.us-west-2.compute.internal:9860</value></property><property><name>ozone.scm.names</name><value>ip-172-31-19-127.us-west-2.compute.internal</value></property><property><name>ozone.scm.datanode.id.dir</name><value>/mnt/ozone-1.2.1/metadata/ozone/node</value></property><property><name>ozone.om.db.dirs</name><value>/mnt/ozone-1.2.1/metadata/ozone/omdb</value></property><property><name>ozone.scm.db.dirs</name><value>/mnt/ozone-1.2.1/metadata/ozone/scmdb</value></property><property><name>hdds.datanode.dir</name><value>/mnt/ozone-1.2.1/datanode/data</value></property><property><name>ozone.om.ratis.enable</name><value>false</value></property><property><name>ozone.om.http-address</name><value>ip-172-31-19-127.us-west-2.compute.internal:9874</value></property><property><name>ozone.s3g.domain.name</name><value>s3g.internal</value></property><property><name>ozone.replication</name><value>1</value></property></configuration> 
复制代码


初始化与启动(按照顺序)

ozone scm --initozone --daemon start scmozone om --initozone --daemon start om ozone --daemon start datanodeozone --daemon start s3g 
复制代码


ozone 使用操作

#创建名称为 v-alluxio 的 volume

[root@ip-172-31-19-127 ~]# ozone sh volume create /v-alluxio[root@ip-172-31-19-127 ~]#
复制代码


#在 v-alluxio 下创建名为 b-alluxio 的 bucket

[root@ip-172-31-19-127 ~]# ozone sh bucket create /v-alluxio/b-alluxio [root@ip-172-31-19-127 ~]#
复制代码


#查看 bucket 的相关信息

[root@ip-172-31-19-127 ~]# ozone sh bucket info /v-alluxio/b-alluxio                                                                                                                                                        {                                                                                                                                                                                                                          "metadata" : { },                                                                                                                                                                                                        "volumeName" : "v-alluxio",                                                                                                                                                                                              "name" : "b-alluxio",                                                                                                                                                                                                    "storageType" : "DISK",                                                                                                                                                                                                  "versioning" : false,                                                                                                                                                                                                    "usedBytes" : 30,                                                                                                                                                                                                        "usedNamespace" : 6,                                                                                                                                                                                                     "creationTime" : "2022-07-13T09:11:37.403Z",                                                                                                                                                                             "modificationTime" : "2022-07-13T09:11:37.403Z",                                                                                                                                                                         "quotaInBytes" : -1,                                                                                                                                                                                                     "quotaInNamespace" : -1,                                                                                                                                                                                                 "bucketLayout" : "LEGACY"                                                                                                                                                                                               }                                                                                                                                                                                                                         [root@ip-172-31-19-127 ~]#
复制代码


#创建 key,并放入相应的内容

[root@ip-172-31-19-127 ~]# touch Dockerfile[root@ip-172-31-19-127 ~]# ozone sh key put /v-alluxio/b-alluxio/Dockerfile Dockerfile[root@ip-172-31-19-127 ~]#
复制代码


#列出 bucket 下所有的 key

[root@ip-172-31-19-127 ~]# ozone sh key list /v-alluxio/b-alluxio/{                                                                                                                                                                                                                          "volumeName" : "v-alluxio",                                                                                                                                                                                              "bucketName" : "b-alluxio",                                                                                                                                                                                              "name" : "Dockerfile",                                                                                                                                                                                                   "dataSize" : 0,                                                                                                                                                                                                          "creationTime" : "2022-07-13T14:37:09.761Z",                                                                                                                                                                             "modificationTime" : "2022-07-13T14:37:09.801Z",                                                                                                                                                                         "replicationConfig" : {                                                                                                                                                                                                    "replicationFactor" : "ONE",                                                                                                                                                                                             "requiredNodes" : 1,                                                                                                                                                                                                     "replicationType" : "RATIS"                                                                                                                                                                                            },                                                                                                                                                                                                                       "replicationFactor" : 1,                                                                                                                                                                                                 "replicationType" : "RATIS"                                                                                                                                                                                             }[root@ip-172-31-19-127 ~]#
复制代码


#查看 key 的相关信息

[root@ip-172-31-19-127 ~]# ozone sh key info /v-alluxio/b-alluxio/Dockerfile                                                                                                                                                {                                                                                                                                                                                                                          "volumeName" : "v-alluxio",                                                                                                                                                                                              "bucketName" : "b-alluxio",                                                                                                                                                                                              "name" : "Dockerfile",                                                                                                                                                                                                   "dataSize" : 0,                                                                                                                                                                                                          "creationTime" : "2022-07-13T14:37:09.761Z",                                                                                                                                                                             "modificationTime" : "2022-07-13T14:37:09.801Z",                                                                                                                                                                         "replicationConfig" : {                                                                                                                                                                                                    "replicationFactor" : "ONE",                                                                                                                                                                                             "requiredNodes" : 1,                                                                                                                                                                                                     "replicationType" : "RATIS"                                                                                                                                                                                            },                                                                                                                                                                                                                       "ozoneKeyLocations" : [ ],                                                                                                                                                                                               "metadata" : { },                                                                                                                                                                                                        "replicationFactor" : 1,                                                                                                                                                                                                 "replicationType" : "RATIS"                                                                                                                                                                                             }                                                                                                                                                                                                                         [root@ip-172-31-19-127 ~]#
复制代码


Alluxio 挂载 ozone


#方式一

[root@ip-172-31-17-3 ~]# alluxio fs mount /ozone o3fs://b-alluxio.v-alluxio.ip-172-31-19-127.us-west-2.compute.internal:9862/                                                                                                                          Mounted o3fs://b-alluxio.v-alluxio.ip-172-31-19-127.us-west-2.compute.internal:9862/ at /ozone                                                                                                                                                         [root@ip-172-31-17-3 ~]#
复制代码


#方式二(带 option 的 mount)

[root@ip-172-31-17-3 ~]# alluxio fs mount \                                                                                                                                                                               > --option alluxio.underfs.hdfs.configuration=/mnt1/ozone-1.2.1/etc/hadoop/ozone-site.xml \                                                                                                                               > /ozone1 o3fs://b-alluxio.v-alluxio/                                                                                                                                                                                     Mounted o3fs://b-alluxio.v-alluxio/ at /ozone1                                                                                                                                                                            [root@ip-172-31-17-3 ~]# 
复制代码


#验证 Ozone 挂载是否成功

[root@ip-172-31-17-3 ~]# alluxio fs ls /                                                                                                                                                                                                                                                                          drwxrwxrwx  root           root                         0       PERSISTED 01-01-1970 00:00:00:000  DIR /ozone1                                                                                                                                                                                                                         drwxrwxrwx  root           root                         0       PERSISTED 01-01-1970 00:00:00:000  DIR /ozone                                                                                                                                                                                                           [root@ip-172-31-17-3 ~]#
复制代码


发布于: 2022 年 07 月 20 日阅读数: 6
用户头像

Alluxio

关注

还未添加个人签名 2022.01.04 加入

Alluxio是全球首个面向基于云原生数据分析和人工智能的开源的资料编排技术!能够在跨集群、跨区域、跨国家的任何云中将数据更紧密地编排接近数据分析和AI/ML应用程序,从而向上层应用提供内存速度的数据访问。

评论

发布
暂无评论
6W+字记录实验全过程 | 探索Alluxio经济化数据存储策略_数据湖_Alluxio_InfoQ写作社区