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类型的构造方法。
综合考虑了一下,我们可以修改一下源码,给现有的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/