flink教程-application模式提交集成hive的flink任务

457 阅读2分钟
  • 背景
  • 方案

背景

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/

更多精彩内容,欢迎关注我的公众号【大数据技术与应用实战】