概要
由于flink可以接入非常多的数据源,1.11版本后基于catalog也能连接hive了,那么实时数仓以flink作为数据采集工具,将是一个方便可行的方案。实时数仓的数据载体一般是kafka,但是数据采集实时离线可以沿用一套flink的数据采集,在同步到kafka的时候,顺便写一份数据到hive上,就不需要t+1天才能看到hive的源数据。
配置json文件
参考alibaba开发的datax数据同步工具,及目前的flinkx数据同步工具,以json文件作为配置文件,主要分为reader模块,writer模块。这里也给一个我的demo
{
"reader":{
"name":"kafkareader",
"bootstrapServers":"hadoop-01:6667",
"topic":"MicsDataPointForCop",
"group":"test0420-02"
},
"writer":{
"name":"printwriter"
}
}
连接数据源
- hive
hive数据源和其他数据源不一样,它基于catalog连接,HiveCatalog通过读取hive-site.xml文件,连接hive,
//创建HiveCatalog,指定hive配置文件路径
HiveCatalog hive = new HiveCatalog(catalogName, database, hiveConfDir,version);
streamTableEnvironment.registerCatalog(catalogName, hive);
//指定catalog name,hive数据库
streamTableEnvironment.useCatalog(catalogName);
streamTableEnvironment.getConfig().setSqlDialect(SqlDialect.HIVE);
streamTableEnvironment.useDatabase(database);
flink sql可以直接读取hive的表了
- txt文件
可以实现SourceFunction接口,读取文件为DataStreamSource - kafka
FlinkKafkaConsumer读取,读取为DataStreamSource
String bootstrapServers=jsonObject.getJSONObject("reader").getString("bootstrapServers");
String topic=jsonObject.getJSONObject("reader").getString("topic");
String groupID=jsonObject.getJSONObject("reader").getString("group");
Properties properties = new Properties();
properties.setProperty("bootstrap.servers",bootstrapServers);
properties.setProperty("group.id",groupID);
SourceFunction<String> consumer =
new FlinkKafkaConsumer<String>(topic, new SimpleStringSchema(), properties).setStartFromEarliest();
数据同步
flink可以基于sink,用datastream的方式写入,也可以用tablesql的方式写入。
sink的话,就是实现SinkFunction,然后执行整体
sql的话,将各个data流注册为table,然后用sql insert的方式插入
踩坑
hive写入分区的话,默认的话,不会刷新分区,就会出现hdfs有数据,但是hive上查不到数据。
一定要执行这个语句,更新hive元数据
"alter table "+hiveTableName+" set TBLPROPERTIES ('sink.partition-commit.policy.kind'='metastore')";