Flink采用HiveCatalog作为表元数据持久化的介质。对于同时部署了Hive和Flink的公司来说,可以方便管理元数据,而对于只部署了Flink的公司来说,HiveCatalog也是Flink唯一支持的元数据持久化的介质。不将元数据持久化的时候,开发过程中的每个地方都需要使用DDL重新将Kafka等数据源的数据注册到临时的Catalog中,浪费了很多精力和时间。
HiveCatalog可用于处理两种类型的表:Hive兼容表和通用表。 就存储层中的元数据和数据而言,兼容Hive的表是以兼容Hive的方式存储的表。 因此,通过Flink创建的Hive兼容表可以从Hive端查询。
另一方面,通用表特定于Flink。 使用HiveCatalog创建通用表时,我们只是使用HMS来保留元数据。 虽然这些表格对Hive可见,但Hive不太可能能够理解元数据。 因此,在Hive中使用此类表会导致未定义的行为。
下面将通过一个简单的例子,演示将Kafa作为数据源,并将元数据保存到Hive metastore中,使用flink sql直接读取kafka。测试环境和代码工程与Flink访问Kerberos环境下的Hive一致,此处不再重复。
在maven工程的pom文件中添加以下依赖
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-csv</artifactId>
<version>${flink.version}</version>
</dependency>
注册并使用当前Catalog
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
EnvironmentSettings settings = EnvironmentSettings.newInstance()
.useBlinkPlanner()
.inStreamingMode()
.build();StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env, settings);
new KerberosAuth().kerberosAuth(false); //认证
HiveCatalog hive = getHiveCatalog(); //获取hivecatalog
tableEnv.registerCatalog("myhive", hive);
tableEnv.useCatalog("myhive");
tableEnv.useDatabase("test01");
注册kafka数据源
tableEnv.sqlUpdate("create table mytable(name STRING,cTime STRING,url STRING) WITH (\n" +
" 'connector.type' = 'kafka',\n" +
" 'connector.version' = 'universal',\n" +
" 'connector.topic' = 'flink-in',\n" +
" 'connector.properties.zookeeper.connect' = '10.5.13.99:2181',\n" +
" 'connector.properties.bootstrap.servers' = 'kafka1.pc.com:9092,kafka2.pc.com:9092,kafka3.pc.com:9092',\n" +
" 'connector.properties.group.id' = 'testGroup', \n" +
" 'connector.startup-mode' = 'earliest-offset', \n" +
" 'format.type' = 'csv',\n" +
" 'update-mode' = 'append'\n" +
")");
读取kafka数据
注册之后,可以直接读取,不需要再次定义。
Table table = tableEnv.sqlQuery("select name from mytable");
tableEnv.toRetractStream(table,Row.class).print();
参考: