1.13.6版本 flink sql 写hive 任务正常,hdfs上有文件,但是发现缺乏_SUCCESS 标记文件,与hive分区也没有创建 ,有谁知道什么原因?
楼主你好,在将Flink SQL任务写入Hive表时,确保要遵循以下几个步骤:
在Flink任务中设置Hive配置:Flink SQL任务写入Hive表需要使用Hive metastore,因此需要在Flink任务中设置Hive相关配置,包括Hive metastore的地址、用户名、密码等。示例代码如下:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);
tEnv.getConfig().getConfiguration().setString("table.exec.hive.metastore.uris", "thrift://<metastore_host>:9083");
tEnv.getConfig().getConfiguration().setString("table.exec.hive.metastore.username", "<hive_username>");
tEnv.getConfig().getConfiguration().setString("table.exec.hive.metastore.password", "<hive_password>");
在Flink任务中创建Hive表:在Flink任务中创建Hive表,需要指定表的名称、字段、分区等信息,并且需要在表创建之前先创建分区。示例代码如下:
CREATE TABLE hive_table (
id INT,
name STRING,
age INT
) PARTITIONED BY (dt STRING, hr STRING) STORED AS PARQUET TBLPROPERTIES ('partition.time-extractor.timestamp-pattern'='$dt $hr:00:00');
ALTER TABLE hive_table ADD IF NOT EXISTS PARTITION (dt='2022-01-01', hr='00');
在Flink任务中将数据写入Hive表:在Flink任务中将数据写入Hive表,需要指定表的名称、分区等信息。示例代码如下:
INSERT INTO hive_table PARTITION (dt='2022-01-01', hr='00')
SELECT id, name, age FROM source_table;
根据您的描述,您的Flink任务已经成功将数据写入HDFS,但是缺少_SUCCESS标记文件,并且Hive分区也没有被创建。这可能是以下几个原因导致的:
权限问题:在将数据写入HDFS和Hive时,需要确保具有足够的权限。请确保Flink任务运行的用户具有写入HDFS和Hive的权限。
配置问题:在将数据写入Hive时,需要在Flink任务中正确配置Hive metastore的地址、用户名、密码等信息。请确保配置信息正确。
分区信息不匹配:在将数据写入Hive分区时,需要确保分区信息与表定义一致。请检查Flink任务中分区信息的定义是否与Hive表一致。
Hive metastore问题:在将数据写入Hive时,需要使用Hive metastore,如果metastore出现问题,可能会导致写入失败。请检查Hive metastore的状态,并确保正常运行。
针对以上可能导致数据写入Hive失败的原因,您可以尝试以下排查和解决方法:
检查Flink任务运行的用户是否具有写入HDFS和Hive的权限。
检查Flink任务中Hive metastore的配置信息是否正确。
检查Flink任务中分区信息的定义是否与Hive表一致。
检查Hive metastore的状态,并确保正常运行。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。