再去打开本地的HOST文件,加入127.0.01 myhbase,如果少了这一步操作,而且你的FLINK任务没开INFO级别的日志,那么你会发现你的任务一直没有输出,也不报错。开了INFO之后,能看到client.RpcRetryingCaller - Call exception, tries=10, retries=35, started=47363 ms ago, cancelled=false, msg=can not resolve myhbase,16020,1590717943339 row 't2,1589186680,99999999999999' on table 'hbase:meta' at region=hbase:meta,,1.1588230740, hostname=myhbase,16020,1590717943339, seqNum=0大概意思就是在hbase:meta也就是HBASE的元数据里面,找不到myhbase
贴一下完整代码
package FlinkSql;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.java.StreamTableEnvironment;
import org.apache.flink.types.Row;
public class FlinkSql06 {
public static final String KAFKA_TABLE_SOURCE_DDL_01 = "" +
"CREATE TABLE t1 ( \n" +
"afterColumns ROW(created STRING,extra ROW(canGiving BOOLEAN),`parameter` ARRAY <INT>) ,\n" +
"beforeColumns STRING ,\n" +
"tableVersion ROW(binlogFile STRING,binlogPosition INT ,version INT) ,\n" +
"p AS PROCTIME(),\n"+
"touchTime bigint \n" +
") WITH (\n" +
" 'connector.type' = 'kafka', -- 指定连接类型是kafka\n" +
" 'connector.version' = '0.11', -- 与我们之前Docker安装的kafka版本要一致\n" +
" 'connector.topic' = 'json_parse', -- 之前创建的topic \n" +
" 'connector.properties.group.id' = 'flink-test-0', -- 消费者组,相关概念可自行百度\n" +
" 'connector.startup-mode' = 'earliest-offset', --指定从最早消费\n" +
" 'connector.properties.zookeeper.connect' = 'localhost:2181', -- zk地址\n" +
" 'connector.properties.bootstrap.servers' = 'localhost:9092', -- broker地址\n" +
" 'format.type' = 'json' -- json格式,和topic中的消息格式保持一致\n" +
")";
public static final String HBASE_TABLE_DIM_DDL = "" +
"CREATE TABLE t2 (\n" +
"rowkey String,\n" +
"f1 ROW<col1 String>\n" +
") WITH (\n" +
" 'connector.type' = 'hbase', -- required: specify this table type is hbase\n" +
" 'connector.version' = '1.4.3', -- required: valid connector versions are \"1.4.3\"\n" +
" 'connector.table-name' = 't2', -- required: hbase table name\n" +
" 'connector.zookeeper.quorum' = 'localhost:2182', -- required: HBase Zookeeper quorum configuration\n" +
" 'connector.zookeeper.znode.parent' = '/hbase' -- optional: the root dir in Zookeeper for HBase cluster.\n" +
")";
public static void main(String[] args) throws Exception {
//构建StreamExecutionEnvironment
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//构建EnvironmentSettings 并指定Blink Planner
EnvironmentSettings bsSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build();
//构建StreamTableEnvironment
StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, bsSettings);
//执行DDL
tEnv.sqlUpdate(KAFKA_TABLE_SOURCE_DDL_01);
tEnv.sqlUpdate(HBASE_TABLE_DIM_DDL);
//注意FOR SYSTEM_TIME AS OF a.p AS b 的用法,左表需要用proctime,我在DDL指定了,大家记得看好
Table table = tEnv.sqlQuery("select a.* ,b.* from t1 a left join t2 FOR SYSTEM_TIME AS OF a.p AS b on a.afterColumns.created = b.rowkey");
//转成流输出
tEnv.toAppendStream(table, Row.class).print().setParallelism(1);
env.execute("Flink Sql 06");
}
}
windows跑的时候可能会出现Could not locate executable null\bin\winutils.exe in the Hadoop binaries,首先得去下载HADOOP客户端,这里有所有的HADOOP版本,我用的是2.7的版本,然后配置一下HADOOP_HOME环境变量。配置完可能得重启,不然IDEA里面的环境变量不生效。也可以在类的启动配置里面指定一下环境变量HADOOP_HOME=D:\hadoop-2.7.0\hadoop-2.7.0。然后去这里下载exe文件,并且丢到HADOOP_HOME的bin路径下,比如我的就是D:\hadoop-2.7.0\hadoop-2.7.0\bin里面。再执行任务,就能看到正常输出了