Flink SQL 连接Hive并写入/读取数据

1. 添加依赖

下载后把flink-sql-connector-hive-2.2.0_2.11-1.13.0.jar放到flink的lib目录下

2. 创建blink版本的批处理Table执行环境

EnvironmentSettings bbSettings = EnvironmentSettings.newInstance()
                .useBlinkPlanner()
                .inBatchMode()
                .build();
TableEnvironment bbTableEnv = TableEnvironment.create(bbSettings);
  • 经过实际测试,目前HiveTableSink 不支持流式写入(未实现 AppendStreamTableSink),必须是批处理环境才可以往hive里面写入数据,而不能将流式数据写入hive。例如将kafka创建一张临时表,然后将表中的数据流持续插入hive,这是不可以的,官网上1.11版本通过flink sql-client可以实现hive的流式写入,还有待验证。

3、连接文件系统,创建hive catalog,对表进行操作,类似于Spark on Hive,flink可以直接获取Hive的元数据,并使用flink进行计算。

        // 连接外部文件
        bbTableEnv.connect(new FileSystem().path("file:///E:/d.txt"))
                .withFormat(new Csv().fieldDelimiter(','))
                .withSchema(new Schema().field("id", DataTypes.STRING()))
                .createTemporaryTable("output");

        // 设置 hive 方言
        bbTableEnv.getConfig().setSqlDialect(SqlDialect.HIVE);
        // 获取hive-site.xml目录
        String hiveConfDir = Thread.currentThread().getContextClassLoader().getResource("").getPath().substring(1);
        HiveCatalog hive = new HiveCatalog("hive", "warningplatform", hiveConfDir);
        bbTableEnv.registerCatalog("hive", hive);

        bbTableEnv.useCatalog("hive");
        bbTableEnv.useDatabase("warningplatform");

        bbTableEnv.executeSql("insert into  test select id from    default_catalog.default_database.output");

  • 通过bbTableEnv.connect()去创建临时表的方式已经过时了,建议使用bbTableEnv.executeSql()的方式,通过DDL去创建临时表,临时表到底是属于哪一个catalog目前还不太确定,到底是什么规则目前还不清楚。 查资料得知,临时表与单个Flink会话的生命周期相关,临时表始终存储在内存中。 永久表需要一个catalog来管理表对应的元数据,比如hive metastore,该表将一直存在,直到明确删除该表为止。 因此猜测:default_catalog是存储在内存中,如果在切换成hive catalog之前创建临时表,那我们就可以使用default_catalog.default_database.tableName来获取这个临时表。 如果切换了catalog再去创建临时表,那我们就无法获取到临时表了,因为它不在default_catalog中,而且保存在内存里面,直接查询临时表会去当前的catalog里面去查找临时表,因此一定要在default_catalog 里面创建临时表。 而临时视图好像是存储在当前的catalog里面

  • 通过bbTableEnv.createTemporaryView()创建的视图则是属于当前的database的

bbTableEnv.createTemporaryView("output",bbTableEnv.sqlQuery("select * from default_catalog.default_database.output"));

  • 注意1.11版本的执行sql的方法发生了改变,通过执行环境的executeSql(),executeInsert()等来进行插入或者执行sql语句

public static void main(String[] args) throws Exception {

    ParameterTool params = ParameterTool.fromArgs(args);
    EnvironmentSettings settings = EnvironmentSettings
            .newInstance()
            .useBlinkPlanner() // 使用BlinkPlanner
            .inBatchMode() // Batch模式,默认为StreamingMode
            .build();

    TableEnvironment tableEnv = TableEnvironment.create(settings);
    String name = "myhive";                                                             // Catalog名称,定义一个唯一的名称表示
    String defaultDatabase = params.get("defaultDatabase");                             // 默认数据库名称
    String hiveConfDir = params.get("hiveConf");                                        // hive-site.xml路径
    String version = "2.1.1";                                                           // Hive版本号
    HiveCatalog hive = new HiveCatalog(name, defaultDatabase, hiveConfDir, version);
    tableEnv.registerCatalog("myhive", hive);
    tableEnv.useCatalog("myhive");

    TableResult result;
    String SelectTables_sql ="select * from test.testdata";
    result = tableEnv.executeSql(SelectTables_sql);
    result.print();
}

四、启动集群,提交任务

1、进入flink的目录下执行 bin/start-cluster.sh

2、登录rest.address : rest.port查看网页是否正常运行

3、执行命令提交任务

flink/flink-1.13.1/bin/flink run -c org.example.FlinkHiveIntegration flink/job/flinkcommonjob-1.1.jar -hiveConf /etc/hive/conf.cloudera.hive/ -defaultDatabase test

五、报错处理

Caused by: java.lang.NoClassDefFoundError: Lorg/apache/hadoop/mapred/JobConf;

解决方法:补充hadoop-mapreduce-client-core-3.0.0.jar包

扫描二维码关注公众号,回复: 13184801 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_22473611/article/details/121168025