Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Iceberg---基础知识 #93

Open
AronChung opened this issue Jan 11, 2021 · 0 comments
Open

Iceberg---基础知识 #93

AronChung opened this issue Jan 11, 2021 · 0 comments
Labels
Iceberg 数据湖
Projects

Comments

@AronChung
Copy link
Owner

AronChung commented Jan 11, 2021

Iceberg不需要很大的开销,就能修改数据,而不需要重写表数据或迁移到新表
Iceberg模式更新是元数据更改。数据文件不急于重写。

Iceberg保证正确性的方式:

使用唯一的ID来跟踪表中的每一列。添加列时,将为其分配新的ID,因此不会错误地使用现有数据。

隐藏分区的处理

采用隐藏分区的方式,可以在现有表中更新Iceberg表分区,因为查询不会直接引用分区值。
当您开发分区规范时,使用较早规范编写的旧数据将保持不变。使用新规范以新布局写入新数据。每个分区版本的元数据分别保存。因此,当您开始编写查询时,您将获得拆分计划。在这里,每个分区布局都使用为特定分区布局派生的过滤器分别计划文件。这是一个虚构示例的直观表示:
image

2008年的数据按月划分。从2009年开始,将更新该表,以便按天对数据进行分区。两种分区布局都可以共存于同一张表中。
Iceberg使用隐藏分区,因此您无需为特定分区布局编写查询就可以很快。相反,您可以编写查询来选择所需的数据,然后Iceberg会自动修剪不包含匹配数据的文件。
分区演变是一个元数据操作,不会急于重写文件。

扫描规划

扫描计划是在表中查找查询所需文件的过程。
Iceberg表中的计划适合单个节点,因为Iceberg的元数据除过滤不包含匹配数据的数据文件外,还可用于修剪不需要的元数据文件。
通过单个节点的快速扫描计划可以:

  • 降低延迟的SQL查询–通过消除分布式扫描来计划分布式扫描
  • 从任何客户端访问–独立进程可以直接从Iceberg表读取数据

元数据过滤

Iceberg使用两个级别的元数据来跟踪快照中的文件。

  • 清单文件存储数据文件列表,以及每个数据文件的分区数据和列级统计信息
  • 一个清单列表清单的存储快照的列表,值的每个分区领域的区间上沿
    为了进行快速扫描计划,Iceberg首先使用清单清单中的分区值范围过滤清单。然后,它读取每个清单以获取数据文件。使用此方案,清单清单可作为清单文件的索引,从而可以在不读取所有清单的情况下进行计划。
    除了分区值范围外,清单清单还存储清单中添加或删除的文件数,以加快快照过期之类的操作。

数据过滤

清单文件包括分区数据元组和每个数据文件的列级统计信息。
在计划期间,查询谓词会自动转换为分区数据上的谓词,并首先应用于过滤数据文件。接下来,使用列级值计数,空计数,下限和上限来消除无法与查询谓词匹配的文件。
通过在计划时使用上限和下限来过滤数据文件,Iceberg使用群集数据来消除拆分而无需运行任务。在某些情况下,性能提高了10倍。

测试

iceberg-spark3-runtime-0.10.0.jar放到spark的jars中
脚本:

## hive
CREATE EXTERNAL TABLE zcm_test 
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler' 
LOCATION 'hdfs://nameservice1/user/hive/warehouse/iceberg.db/zcm_test';

## spark
spark-sql --packages org.apache.iceberg:iceberg-spark3-runtime:0.10.0 \
    --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog \
    --conf spark.sql.catalog.spark_catalog.type=hive \
    --conf spark.sql.catalog.local=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.local.type=hadoop \
    --conf spark.sql.catalog.local.warehouse=hdfs://nameservice1/apps/iceberg/warehouse/zcm_test

spark-sql > create table zcm_test(id int ,name string) using iceberg ;

insert into zcm_test values(1,'AaronChung'),(2,'Charlin'),(3,'特离谱') ;

以上脚本是在spark中执行的,若此时用hive执行select,则查不到表数据;
执行insert,会出现

hive> insert into zcm_test values(4,'AaronChung'),(5,'Charlin'),(6,'特离谱') ;
FAILED: SemanticException [Error 10055]: Line 1:12 Output Format must implement HiveOutputFormat, otherwise it should be either IgnoreKeyTextOutputFormat or SequenceFileOutputFormat 'zcm_test': The class is class org.apache.hadoop.mapred.FileOutputFormat

iceberg重复插入数据,会在后面append,而不会替换。

1	马云
2	马蓉
3	马保国
4	AaronChung
5	Charlin
6	特离谱
4	AaronChung
5	Charlin
6	特离谱
@AronChung AronChung added the Iceberg 数据湖 label Jan 11, 2021
@AronChung AronChung added this to 数据湖 in My Blog Jun 29, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Iceberg 数据湖
Projects
My Blog
  
数据湖
Development

No branches or pull requests

1 participant