flink sql kafka写数据到hive

step1:flink连接hive配置

  1. 首先确保启动hive metastore远程服务
  2. flink安装目录下新建文件夹hive-conf,然后vi hive-site.xml,配置hive仓库地址和metastore远程服务连接地址。(此配置为了在flink集群中启动hive客户端来远程访问hive metastore服务)具体如下:
  • 新建hive-conf文件夹:
    flink sql kafka写数据到hive_第1张图片
  • hive-site.xml配置
<configuration>
	<property>
		<name>hive.metastore.uris</name>
		<value>thrift://ip:9083</value>
	</property>
	<property>
		<name>hive.metastore.warehouse.dir</name>
		<value>/user/hive/warehouse</value> 
	</property>
</configuration>
~
  1. 导包到flink lib目录下
  • 官网下载flink连接hive对应版本所需的jar包 ->所需jar包官网链接
    flink sql kafka写数据到hive_第2张图片
    官网推荐使用flink捆绑好的jar包,用这一个包就可以了,如果你的hive版本与上图hive版本不符,则按照下图导入相关版本的hive jar包

    将hive lib目录下的 hive-exec-2.2.0.jar 导入flink lib目录下(不同hive版本所需的jar不一样,具体以官网为准)
    flink sql kafka写数据到hive_第3张图片

  • sql-client-defaults.yaml文件配置,配置HiveCatalog。
    flink sql kafka写数据到hive_第4张图片

  • 配置Hadoop相关依赖
    配置环境变量:export HADOOP_CLASSPATH=hadoop classpath 即可。

注意:hadoop classpath不是一个路径,他是一个命令

step2: flink连接kafka配置

  1. 导入连接kafka相关jar包
  • flink-sql-connector-kafka_2.11-1.12.0.jar
  • flink-streaming-java_2.11-1.12.0.jar
  • flink-streaming-scala_2.11-1.12.0.jar
  • flink-table-api-java-bridge_2.11-1.12.0.jar
  • flink-table-common-1.12.0.jar
  • flink-table-blink_2.11-1.12.0.jar
step3: 重启集群

这一步非常重要,做完上述步骤之后,如果你以为完事大吉了,那就大错特错了。此时如果不重启集群,你就启动sql-client,然后建hive表,kafka表进行操作的话,你会发现你导入的包根本不起作用,他会报ClassNotFound异常

step4: 新建hive表
SET table.sql-dialect=hive; //执行这条命令才能在sql-client新建hive表
CREATE TABLE test_hive_table (
	   id STRING,
	   name STRING
) PARTITIONED BY (time STRING) STORED AS orc TBLPROPERTIES (
  'partition.time-extractor.timestamp-pattern'='$state', //抽取事件时间戳,作为事件时间
  'sink.partition-commit.trigger'='partition-time', //有两种分区提交方式,根据机器处理时间(process-time)和分区时间(partition-time)
  'sink.partition-commit.delay'='0s', //延迟多久提交
  'sink.partition-commit.policy.kind'='metastore,success-file' //分区提交策略
);
step5: 新建kafka表
SET table.sql-dialect=default; //记得从hive模式切换回来
CREATE TABLE kafkaTable (
	   time STRING,
	   id STRING,
	   name STRING
) WITH (
 'connector' = 'kafka',
 'topic' = 'kafka_test',
 'properties.bootstrap.servers' = 'ip:9092',
 'properties.group.id' = 'testGroup',
 'scan.startup.mode' = 'latest-offset',
 'format' = 'json'
);

至此执行:insert into test_hive_table select * from kafkaTable; 就可以提交任务了。

写入hive表的相关配置(即写入文件系统的相关配置)
  1. 文件滚动策略
key default Type Description
sink.rolling-policy.file-size 128MB 文件大小 文件滚动的最大值
sink.rolling-policy.rollover-interval 30 min 持续时间 文件句柄保持打开状态的最长持续时间,'sink.rolling-policy.check-interval‘配置会定期检查文件句柄状态
sink.rolling-policy.check-interval 1 min 持续时间 检查文件句柄状态的时间间隔
  1. 文件压缩
key default Type Description
auto-compaction false Boolean 如果开启压缩,则在sink的时候会生成临时文件,checkpoint完成后,将压缩临时文件,临时文件在压缩前不可见
compaction.file-size none 文件大小 压缩目标文件大小,默认值为滚动文件大小。
  1. 分区提交

写入分区后,通常需要通知下游应用程序。例如,将分区信息提交到Hive Metastore,或者文件夹中生成一个_SUCCESS文件。文件系统接收器包含允许配置自定义策略的分区提交功能。提交的动作是基于组合triggers和policies。
triggers: 分区的提交时间可以通过水印以及从分区中提取的时间来确定,也可以通过处理时间来确定。
policies: 如何提交分区,内置的策略支持成功文件和Metastore的提交,您还可以实施自己的策略,例如触发配置单元的分析以生成统计信息或合并小文件等。

3.1	 分区提交触发器
key default Type Description
sink.partition-commit.trigge process-time String process-time: 基于机器时间,它既不需要提取时间戳,也不需要水印。一旦当前系统时间超过创建分区的系统时间加上延迟时间,便提交分区。partition-time: 基于从分区中提取的时间,需要生成水印,一旦水印超过从分区提取的时间加上延迟 ,便提交分区。
sink.partition-commit.delay 0s 持续时间 直到此延迟时间到达,分区才会提交。 如果是每日分区,则应为“ 1 d”;如果是每小时分区,则应为“ 1 h”。
  1. 如果要让下游尽快看到该分区,无论其数据是否完整:

‘sink.partition-commit.trigger’=‘process-time’(默认值)
‘sink.partition-commit.delay’=‘0s’(默认值)一旦分区中有数据,它将立即提交。注意:分区可能被多次提交。

  1. 如果要让下游仅在分区数据完成后才看到该分区,并且您的作业已生成水印,则可以从分区值中提取时间:

‘sink.partition-commit.trigger’=‘partition-time’
‘sink.partition-commit.delay’=‘1h’(如果您的分区是每小时的分区,则取决于您的分区类型,则为’1h’)这是提交分区的最准确方法,它将尝试确保已提交的分区尽可能完整的数据。

  1. 如果要让下游仅在其数据完成但没有水印时才能看到该分区,或者无法从分区值中提取时间,请执行以下操作:

‘sink.partition-commit.trigger’=‘process-time’(默认值)
‘sink.partition-commit.delay’=‘1h’(如果您的分区是每小时分区,则为’1h’,取决于您的分区类型)尝试准确地提交分区,但是数据延迟或故障转移将导致过早的分区提交。

如果应该将一条记录写入已提交的分区中,那么该记录将被写入其分区中,然后将再次触发该分区的提交

3.2 分区时间提取器
key default Type Description
partition.time-extractor.kind default String 用于提取分区值中提取时间,支持默认和自定义,默认情况下可以配置timestamp格式,自定义需要开发配置提取器类
partition.time-extractor.class (none) String 自定义提取器类需要实现PartitionTimeExtractor 接口
partition.time-extractor.timestamp-pattern (none) String 默认方式允许用户使用分区字段来获取合法的时间戳模式。 默认支持’yyyy-mm-dd hh:mm:ss’。 如果应该从单个分区字段“ dt”中提取时间戳,则可以配置:“ $ dt”。 如果应从多个分区字段中提取时间戳,例如说“年”,“月”,“天”和“小时”,则可以配置:“ $ year- $ month- $ day $ hour:00:00”。 如果应该从两个分区字段“ dt”和“ hour”中提取时间戳,则可以配置:“ $ dt $ hour:00:00”。
3.3	 分区提交策略

分区提交策略定义了提交分区时采取的操作。
metastore策略: 只有hive表支持metastore策略,文件系统才能通过目录结构管理分区。
success file策略: 它将在与该分区相对应的目录中写入一个空文件。

key default Type Description
sink.partition-commit.policy.kind (none) String 提交分区的策略是通知下游应用程序该分区已完成写入,该分区已准备好被读取。 metastore:将分区添加到metastore。 只有hive表支持metastore策略,文件系统通过目录结构管理分区。 success文件:将“ _success”文件添加到目录中。 两者可以同时配置:“metastore,_SUCCESS”。 自定义策略:使用策略类创建提交策略。 支持配置多个策略
sink.partition-commit.policy.class (none) String 自定义策略需要实现PartitionCommitPolicy interface.接口
sink.partition-commit.success-file.name _SUCCESS String 文件提交策略默认值 _SUCCESS

你可能感兴趣的:(flink,flink,kafka,hive)