flink 1.11 application模式提交hive任务遇到的坑

背景

flink在1.11 版本提供了一个新的提交任务模式–Applicaton模式,具体的使用可以参考 [详解flink 1.11中的新部署模式-Application模式],使用该模式将会在集群的master节点提交任务,减少per job模式客户端和服务器之间的网络传输,减少了客户端的压力,缩短了任务提交的时间。

此外对于大数据而言,hive是一个非常重要的仓库,flink也提供了与hive的集成,具体的使用方式可以参考官网 [1]。

一个简单的使用hive的例子:

EnvironmentSettings settings = EnvironmentSettings.newInstance().inBatchMode().build();
TableEnvironment tableEnv = TableEnvironment.create(settings);

String name            = "myhive";
String defaultDatabase = "mydatabase";
String hiveConfDir     = "/opt/hive-conf"; // a local path
String version         = "2.3.4";

HiveCatalog hive = new HiveCatalog(name, defaultDatabase, hiveConfDir, version);
tableEnv.registerCatalog("myhive", hive);

// set the HiveCatalog as the current catalog of the session
tableEnv.useCatalog("myhive");

我们看到在构造HiveCatalog的时候,需要提供一个本地的hive配置路径,也就是hiveConfDir变量,但是我们刚才提到,当我们用applicatio模式提交的时候,程序是在集群的master节点提交的,而集群上可能没有hive的配置,无法填写hive的本地路径。这个时候我们就无法用application模式来提交集成了hive的flink任务了。

方案

原因探索

我们先来看看源码里,程序需要这个hive的配置文件做什么。

	public HiveCatalog(String catalogName, @Nullable String defaultDatabase, @Nullable String hiveConfDir) {
		this(catalogName, defaultDatabase, hiveConfDir, HiveShimLoader.getHiveVersion());
	}

	public HiveCatalog(String catalogName, @Nullable String defaultDatabase, @Nullable String hiveConfDir, String hiveVersion) {
		this(catalogName,
			defaultDatabase == null ? DEFAULT_DB : defaultDatabase,
			createHiveConf(hiveConfDir),
			hiveVersion,
			false);
	}

	@VisibleForTesting
	protected HiveCatalog(String catalogName, String defaultDatabase, @Nullable HiveConf hiveConf, String hiveVersion,
			boolean allowEmbedded) {
			    .....................
			}

我们看到,HiveCatalog有两个public的构造方法,传进来的参数hiveConfDir就是通过createHiveConf方法构造出来HiveConf对象,而最终都是调用了protedted类型的构造方法。

添加带有HiveConf的构造方法

综合考虑了一下,我们可以修改一下源码,给现有的HiveCatalog类添加一个带有HiveConf对象的public类型的构造方法,然后给HiveConf对象添加一些和hive连接的必要的参数,比如hive.metastore.uris、hive.metastore.warehouse.dir,这样就能解决我们的问题了。

	public HiveCatalog(String catalogName, @Nullable String defaultDatabase, @Nullable HiveConf hiveConf, String hiveVersion) {
		this(catalogName,
		     defaultDatabase == null ? DEFAULT_DB : defaultDatabase,
		     hiveConf,
		     hiveVersion,
		     false);
	}
	

在我们自己的代码中可以这样使用

        String name            = "myhive";
        String defaultDatabase = "mydatabase";
        String version         = "2.3.4";
		HiveConf hiveConf = new HiveConf();
		hiveConf.setVar(HiveConf.ConfVars.METASTOREURIS,"thrift://localhost:9083");
		hiveConf.setVar(HiveConf.ConfVars.METASTOREWAREHOUSE,"hdfs://localhost/user/hive/warehouse");

		HiveCatalog hive = new HiveCatalog(name, defaultDatabase, hiveConf, version);
		
	

引用:
[1]. https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/hive/

更多精彩内容,欢迎关注我的公众号【大数据技术与应用实战】
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka SQL Connector是Apache Kafka社区提供的一个工具,用于将Kafka消息流转换成关系型数据,并支持在SQL中进行查询、聚合和窗口操作。Flink是一个流处理框架,可以实现实时的数据处理和计算。在Flink 1.11版本中,可以使用Kafka SQL Connector将Kafka消息流集成到Flink中,并直接在Flink SQL中进行流处理和分析。 使用Kafka SQL Connector需要进行以下步骤: 1. 安装Kafka SQL Connector 需要下载并安装Kafka SQL Connector包,可以从Apache官网或者Kafka社区下载。 2. 将Kafka SQL Connector添加到Flink Classpath中 可以通过修改flink-conf.yaml文件或使用--classpath参数将Kafka SQL Connector添加到Flink Classpath中。 3. 创建Kafka数据源 可以使用Flink提供的Kafka连接器,从Kafka中读取数据流,并转换成Flink DataStream。代码示例: ```java Properties props = new Properties(); props.setProperty("bootstrap.servers", "localhost:9092"); props.setProperty("group.id", "test"); FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>("my-topic", new SimpleStringSchema(), props); DataStream<String> stream = env.addSource(consumer); ``` 4. 创建Kafka SQL表 使用CREATE TABLE语句,将Kafka数据流转换成Kafka SQL表。代码示例: ```sql CREATE TABLE kafka_table ( `key` STRING, `value` STRING, `timestamp` TIMESTAMP(3) METADATA, WATERMARK FOR `timestamp` AS `timestamp` - INTERVAL '5' SECOND ) WITH ( 'connector' = 'kafka', 'topic' = 'my-topic', 'properties.bootstrap.servers' = 'localhost:9092', 'properties.group.id' = 'test', 'format' = 'json' ) ``` 5. 在Flink SQL中进行数据处理和分析 可以使用Flink SQL语句,在Kafka SQL表上进行数据处理和分析。代码示例: ```sql SELECT COUNT(*) FROM kafka_table WHERE `key` = 'foo' ``` 以上就是使用Kafka SQL Connector在Flink 1.11中将Kafka消息流集成到Flink中的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值