Apache Iceberg对接Flinksql测试
最新更新
https://blog.csdn.net/weixin_49218925/article/details/114833693
Apache Iceberg简介
我们可以简单理解为他是基于计算层(flink , spark)和存储层(orc,parqurt)的一个中间层,
我们在hive建立一个iceberg格式的表。用flink或者spark写入iceberg,然后再通过其他方式来读
取这个表,比如spark,flink,presto等。
○ 在文件Format(parquet/avro/orc等)之上实现Table语义。
■ 支持定义和变更Schema
■ 支持Hidden Partition和Partition变更
■ ACID语义
■ 历史版本回溯
○ 特点
■ 借助partition和columns统计信息实现分区裁剪
■ 不绑定HDFS,可拓展到S3/OSS等
■ Serializable Isolation
■ 容许多个writer并发写入。乐观锁机制解决冲突。
○ iceberg文件目录
1 环境准备:
1.1 所需组件版本
■ Flink:1.11.1
■ Prestosql:320
■ Hive:2.11
■ Jdk :1.8
■ Hadoop:3.0.0
■ iceberg:0.10.0
■ 所用jar:Iceberg-flink-runtime-a1867ee.dirty.jar(下载源码手动编译的iceberg的0.10.0版本,也可从官网下载)
1.2 flink安装与使用的注意事项:
○ 下载安装包:flink-1.11.1-bin-scala_2.11.tgz
○ 下载jar包:flink-connector-hive_2.11-1.11.2.jar,并放入flink的lib下。
○ 将手动编译的iceberg的Iceberg-flink-runtime-a1867ee.dirty.jar拷贝到flink所在节点。
○ Flink对接hive:拷贝hive-common、hive-exec、hive-metastore、hive-shims-common、libfb303、 libthrift、 guava、servlet-api到flink的lib下。
○ standalone启动flink服务:start-cluster.sh
○ 启动flink sql client:sql-client.sh embedded -j ‘../iceberg-flink-runtime.jar’.
2 flink对接iceberg
2.1 flinksql操作iceberg
2.1.1 创建iceberg的catalog
2.1.2 创建iceberg表
2.1.3 flinksql写入数据到iceberg表
2.1.4 修改表属性
2.1.5 flinksql删除表、库和catalog
2.1.6 flinksql暂不支持对column的操作,可通过flink api操作。
2.1.7 对于iceberg的查询,也可通过presto、spark查询。
presto的配置iceberg.properties 如下:
connector.name=iceberg
hive.metastore.uri=thrift://元数据IP:9083
2.2 flink api操作iceberg
public class Flink2Iceberg{
public static void main(String[] args) throws Exception{
StreamExecutionEnvironment env =
StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
env.enableCheckpointing(10000);
StreamTableEnvironment tenv = StreamTableEnvironment.create(env);
tenv.executeSql("CREATE CATALOG iceberg WITH (\n" +
" 'type'='iceberg',\n" +
" 'catalog-type'='hive'," +
" 'hive-conf-dir'='/Users/user/work/hive/conf/'" +
")");
tenv.useCatalog("iceberg");
tenv.executeSql("CREATE DATABASE iceberg_db");
tenv.useDatabase("iceberg_db");
tenv.executeSql("CREATE TABLE sourceTable (\n" +
" userid int,\n" +
" f_random_str STRING\n" +
") WITH (\n" +
" 'connector' = 'datagen',\n" +
" 'rows-per-second'='100',\n" +
" 'fields.userid.kind'='random',\n" +
" 'fields.userid.min'='1',\n" +
" 'fields.userid.max'='100',\n" +
"'fields.f_random_str.length'='10'\n" +
")");
tenv.executeSql(
"insert into iceberg.iceberg_db.iceberg_001 select * from iceberg.iceberg_db.sourceTable");
}
}