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

文章目录

  • 背景
  • 方案
    • 原因探索
    • 添加带有HiveConf的构造方法

背景

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/

更多精彩内容,欢迎关注我的公众号【大数据技术与应用实战】
flink 1.11 application模式提交hive任务遇到的坑_第1张图片

你可能感兴趣的:(flink)