如何将阿里云EMR中的Hive表数据迁移为Iceberg表?

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: Hive表如何迁移到Iceberg表

背景


某客户现在有大量Hive表存放在阿里云EMR集群之上,考虑到Iceberg在ACID、变更、近实时等方面做的更好(把Hive表迁移成Iceberg表的收益,参考文章 从Hive表切换到Iceberg表的收益探讨 https://www.yuque.com/huzijin-og9kx/gywdy7/hafnp9 ) 。

客户想把他们的Hive表迁移到阿里云EMR的Iceberg表。那么,此时应该如何操作呢?

操作流程

限制:

  • 目前只支持将Parquet/Avro/Orc三种文件格式的Hive表迁移成Iceberg表;
  • 建议采用EMR-5.5.0及以上版本,因为spark和iceberg的集成都相对完善。


注意:以下流程适用于选择HiveMetastore元数据的阿里云EMR集群。

第一步  创建Hive原始数据


创建一个测试用的Hive表来验证我们的迁移流程。(如下语句在spark-sql中执行)

-- 创建 hive_src 表CREATETABLE IF NOT EXISTS hive_src (    id INT,    data STRING
) STORED AS parquet
  LOCATION 'oss://emr-iceberg/migration/hive_src';-- 写入 4 条测试数据INSERTINTO hive_src VALUES(1,'AAA'),(2,'BBB'),(3,'CCC'),(4,'DDD');-- 复制数次测试数据INSERTINTO hive_src SELECT*FROM hive_src;INSERTINTO hive_src SELECT*FROM hive_src;INSERTINTO hive_src SELECT*FROM hive_src;INSERTINTO hive_src SELECT*FROM hive_src;



在迁移到Iceberg操作完成之前,我们查看这个Hive表的元数据信息如下:

hive>desc formatted hive_src;OK
# col_name              data_type            comment             
id                    intdata                  string                                   
# Detailed Table Information     
Database:            default               
OwnerType:            USER                   
Owner:                root                   
CreateTime:          Tue Mar 0116:16:52 CST 2022LastAccessTime:UNKNOWNRetention:0Location:            oss://emr-iceberg/migration/hive_src  
Table Type:          EXTERNAL_TABLE        
Table Parameters: EXTERNAL             TRUE numFiles             16 spark.sql.create.version3.2.0 spark.sql.sources.schema{\"type\":\"struct\",\"fields\":[{\"name\":\"id\",\"type\":\"integer\",\"nullable\":true,\"metadata\":{}},{\"name\":\"data\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]} totalSize            12046                transient_lastDdlTime  1646122742          # Storage Information    SerDe Library:        org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe  InputFormat:          org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat  OutputFormat:        org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat  Compressed:          No                    Num Buckets:          -1                     Bucket Columns:      []                    Sort Columns:        []                    Storage Desc Params:      serialization.format 1                   Time taken: 0.042 seconds, Fetched: 31 row(s)


可以看到,这个表是一个Hive表,而不是Iceberg表。


第二步 启动spark-sql命令行

打开加载iceberg extensions插件的spark-sql命令行如下:

spark-sql --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
--conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog \
--conf spark.sql.catalog.spark_catalog.type=hive \
--conf spark.sql.catalog.hive=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.hive.type=hive \
--conf spark.sql.catalog.hive.uri=thrift://emr-header-1.cluster-286818:9083 \
--conf spark.sql.catalog.hive.warehouse=oss://emr-iceberg/migration/iceberg_dst

其中 spark.sql.catalog.hive.uri 的值(对应HiveMetastore的thrift server地址)通过如下方式获取:

[root@emr-header-1 ~]# cat $HIVE_CONF_DIR/hive-site.xml  | grep metastore.uri -1  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://emr-header-1.cluster-286818:9083</value>


第三步 执行Hive表迁移到Iceberg的操作

spark-sql> CALL hive.system.migrate('spark_catalog.default.hive_src');16Time taken:1.769 seconds, Fetched 1 row(s)

在执行完这个迁移命令之后,再次打开Hive的命令行,可以查看hive_src表的元数据信息如下:

desc formatted hive_src ;OK
# col_name              data_type            comment             
id                    intdata                  string                                   
# Detailed Table Information     
Database:            default               
OwnerType:            USER                   
Owner:                root                   
CreateTime:          Tue Mar 0116:20:18 CST 2022LastAccessTime:      Wed Jan 1415:32:23 CST 1970Retention:2147483647Location:            oss://emr-iceberg/migration/hive_src  
Table Type:          EXTERNAL_TABLE        
Table Parameters: EXTERNAL             TRUE metadata_location    oss://emr-iceberg/migration/hive_src/metadata/00000-d82097f0-790d-4dad-935c-9d8482c848f9.metadata.json migrated             true numFiles             16 numRows              512 schema.name-mapping.default[{                               \"field-id\" : 1,                                \"names\" : [ \"id\" ]                             }, {                                               \"field-id\" : 2,                                \"names\" : [ \"data\" ]                             } ]                  table_type           ICEBERG              totalSize            12046                transient_lastDdlTime  1646122818          # Storage Information    SerDe Library:        org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe   InputFormat:          org.apache.hadoop.mapred.FileInputFormat   OutputFormat:        org.apache.hadoop.mapred.FileOutputFormat   Compressed:          No                    Num Buckets:          0                     Bucket Columns:      []                    Sort Columns:        []                    Time taken: 0.051 seconds, Fetched: 38 row(s)

这里可以明显地看出,里面有一个字段 table_type=ICEBERG 表明这个表是一个Iceberg。另外,我们查看Iceberg对应的OSS目录如下:

第四步:用Hive表方式和Iceberg表方式分别查询这个表。

首先,我们采用Hive表的方式来查询这个表:

spark-sql>select*from hive.default.hive_srclimit3;1 AAA
2 BBB
3 CCC
Time taken:0.319 seconds, Fetched 3 row(s)

可以看出,虽然这个表已经为iceberg表重新生成了metadata,但是该表依然可以通过原先的hive方式来查询。

然后,我们采用Iceberg表的方式来查询这个表:

spark-sql>select*from spark_catalog.default.hive_srclimit3;1 AAA
2 BBB
3 CCC
Time taken:0.427 seconds, Fetched 3 row(s)


总结


目前在阿里云EMR集群上,可以非常方便地将hive表切换成iceberg表,只需要执行一条命令即可。而且即使一个Hive表有数十PB,整个迁移过程也是非常快速的,因为本质上Hive表迁移到Iceberg表只需要重新为Iceberg表生成一遍metadata即可,不需要做任何实质上的数据文件迁移。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
3月前
|
分布式计算 大数据 MaxCompute
EMR Remote Shuffle Service实践问题之阿里云RSS的开源计划内容如何解决
EMR Remote Shuffle Service实践问题之阿里云RSS的开源计划内容如何解决
|
1月前
|
SQL 存储 缓存
阿里云EMR StarRocks X Paimon创建 Streaming Lakehouse
本文介绍了阿里云EMR StarRocks在数据湖分析领域的应用,涵盖StarRocks的数据湖能力、如何构建基于Paimon的实时湖仓、StarRocks与Paimon的最新进展及未来规划。文章强调了StarRocks在极速统一、简单易用方面的优势,以及在数据湖分析加速、湖仓分层建模、冷热融合及全链路ETL等场景的应用。
252 2
阿里云EMR StarRocks X Paimon创建 Streaming Lakehouse
|
24天前
|
SQL 存储 缓存
降本60% ,阿里云 EMR StarRocks 全新发布存算分离版本
阿里云 EMR Serverless StarRocks 现已推出全新存算分离版本,该版本不仅基于开源 StarRocks 进行了全面优化,实现了存储与计算解耦架构,还在性能、弹性伸缩以及多计算组隔离能力方面取得了显著进展。
253 6
|
28天前
|
SQL 存储 缓存
阿里云EMR StarRocks X Paimon创建 Streaming Lakehouse
讲师焦明烨介绍了StarRocks的数据湖能力,如何使用阿里云EMR StarRocks构建基于Paimon的极速实时湖仓,StarRocks与Paimon的最新进展及未来规划。
119 3
|
2月前
|
SQL 分布式计算 Serverless
阿里云 EMR Serverless Spark 版正式开启商业化
阿里云 EMR Serverless Spark 版正式开启商业化,内置 Fusion Engine,100% 兼容开源 Spark 编程接口,相比于开源 Spark 性能提升300%;提供 Notebook 及 SQL 开发、调试、发布、调度、监控诊断等一站式数据开发体验!
146 3
阿里云 EMR Serverless Spark 版正式开启商业化
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
50 3
|
2月前
|
SQL 存储 NoSQL
阿里云 EMR StarRocks 在七猫的应用和实践
本文整理自七猫资深大数据架构师蒋乾老师在 《阿里云 x StarRocks:极速湖仓第二季—上海站》的分享。
253 2
|
3月前
|
存储 分布式计算 大数据
大数据革新在即,阿里云EMR如何布局DeltaLake引领行业潮流?
【8月更文挑战第26天】大数据时代,实时处理与分析能力对企业至关重要。Delta Lake 作为高性能、可靠且支持 ACID 事务的开源存储层,已成为业界焦点。阿里云 EMR 深度布局 Delta Lake,计划深化集成、强化数据安全、优化实时性能,并加强生态建设与社区贡献。通过与 Spark 的无缝对接及持续的技术创新,阿里云 EMR 致力于提供更高效、安全的数据湖解决方案,引领大数据处理领域的发展新方向。
49 3
|
3月前
|
存储 分布式计算 监控
揭秘阿里云EMR:如何巧妙降低你的数据湖成本,让大数据不再昂贵?
【8月更文挑战第26天】阿里云EMR是一种高效的大数据处理服务,助力企业优化数据湖的成本效益。它提供弹性计算资源,支持根据需求调整规模;兼容并优化了Hadoop、Spark等开源工具,提升性能同时降低资源消耗。借助DataWorks及Data Lake Formation等工具,EMR简化了数据湖构建与管理流程,实现了数据的统一化治理。此外,EMR还支持OSS、Table Store等多种存储选项,并配备监控优化工具,确保数据处理流程高效稳定。通过这些措施,EMR帮助企业显著降低了数据处理和存储成本。
127 3
|
3月前
|
安全 数据管理 大数据
数据湖的未来已来:EMR DeltaLake携手阿里云DLF,重塑企业级数据处理格局
【8月更文挑战第26天】在大数据处理领域,阿里云EMR与DeltaLake的集成增强了数据处理能力。进一步结合阿里云DLF服务,实现了数据湖的一站式管理,自动化处理元数据及权限控制,简化管理流程。集成后的方案提升了数据安全性、可靠性和性能优化水平,让用户更专注业务价值。这一集成标志着数据湖技术向着自动化、安全和高效的未来迈出重要一步。
74 2