Flink Sql教程(1)

环境准备

安装Docker及相关镜像

  • Docker下载链接 由于买不起mac,所以挂的windows的链接,可自行去Docker官网下载其他版本。
    安装过程省略,毕竟一路下一步的东西,下面开始安装并启动kafka、mysql等服务。

  • 安装zookeeper服务

    • 因为kafka需要将许多信息固化存储在zk上,所以我们首先得安装zookeeper服务
    • 执行docker run -d --name zookeeper --publish 2181:2181 wurstmeister/zookeeper,这里将2181端口绑定到本地,之后kafka才能连上zk。这样,我们的zk就安装完毕,接下来我们开始验证是否正确启动。
    • 本地执行docker ps -a,能看到如下所示:
    PS C:\Users\tzmaj> docker ps -a
    CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                                NAMES
    2b8cd369aa3e        wurstmeister/zookeeper   "/bin/sh -c '/usr/sb…"   3 seconds ago       Up 2 seconds        22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181>2181/tcp   zookeeper
    

    第一个值是容器id,现在我们把这个id拷出来,执行docker exec -it 1bf952a747ef '/bin/bash',这样我们就进入到了容器里面。接下来进入/opt/zookeeper-3.4.13/bin目录,执行./zkCli.sh,进入zk的客户端

    root@2b8cd369aa3e:/opt/zookeeper-3.4.13/bin# ./zkCli.sh
    Connecting to localhost:2181
    2020-04-28 08:13:40,238 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
    2020-04-28 08:13:40,241 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=2b8cd369aa3e
    2020-04-28 08:13:40,241 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.7.0_65
    2020-04-28 08:13:40,243 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
    2020-04-28 08:13:40,243 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/usr/lib/jvm/java-7-openjdk-amd64/jre
    2020-04-28 08:13:40,243 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/opt/zookeeper-3.4.13/bin/../build/classes:/opt/zookeeper-3.4.13/bin/../build/lib/*.jar:/opt/zookeeper-3.4.13/bin/../lib/slf4j-log4j12-1.7.25.jar:/opt/zookeeper-3.4.13/bin/../lib/slf4j-api-1.7.25.jar:/opt/zookeeper-3.4.13/bin/../lib/netty-3.10.6.Final.jar:/opt/zookeeper-3.4.13/bin/../lib/log4j-1.2.17.jar:/opt/zookeeper-3.4.13/bin/../lib/jline-0.9.94.jar:/opt/zookeeper-3.4.13/bin/../lib/audience-annotations-0.5.0.jar:/opt/zookeeper-3.4.13/bin/../zookeeper-3.4.13.jar:/opt/zookeeper-3.4.13/bin/../src/java/lib/*.jar:/opt/zookeeper-3.4.13/bin/../conf:
    2020-04-28 08:13:40,243 [myid:] - INFO  [main:Environment@100] - Client   environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
    2020-04-28 08:13:40,244 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
    2020-04-28 08:13:40,244 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=<NA>
    2020-04-28 08:13:40,244 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Linux
    2020-04-28 08:13:40,244 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=amd64
    2020-04-28 08:13:40,244 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=4.19.76-linuxkit
    2020-04-28 08:13:40,244 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=root
    2020-04-28 08:13:40,245 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/root
    2020-04-28 08:13:40,245 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/opt/zookeeper-3.4.13/bin
    2020-04-28 08:13:40,246 [myid:] - INFO  [main:ZooKeeper@442] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@674e5e21
    Welcome to ZooKeeper!
    2020-04-28 08:13:40,268 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1029] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
    2020-04-28 08:13:40,278 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@879] - Socket connection established to localhost/127.0.0.1:2181, initiating session
    JLine support is enabled
    2020-04-28 08:13:40,300 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1303] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x100005e85070000, negotiated timeout = 30000
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:None path:null
    [zk: localhost:2181(CONNECTED) 0]
    

    接下来再执行ls /

    [zk: localhost:2181(CONNECTED) 0] ls /
    [zookeeper]
    

    看来我们的zk应该装的没什么问题,那么一路ctrl+d退到最外面

    • 如果在执行docker ps -a发现STATUS那一列显示EXIT,那说明有问题,使用docker logs CONTAINER ID查看具体日志
    • 也可以使用类似于ZooInspector或者JAVA客户端等其他方式去连接zk,来验证zk服务是否正确启动
  • 安装kafka服务

    • 执行docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=172.17.47.44:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://172.17.47.44:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka:2.11-0.11.0.3注意:此处的172.17.47.44是我本地的ip,大家在抄作业的时候,记得写上自己的名字。接下来我们开始验证kafka能否正常使用。
    • 执行docker ps -a找到kafka的容器id,然后执行docker exec -it e51c12e9a077 '/bin/bash',这样我们进入了kafka的容器里。接下来进入kafka客户端的目录/opt/kafka/bin,执行kafka-console-producer.sh --broker-list 172.17.47.44:9092 --topic mykafka,进入kafka生产者客户端。
    • 再启动一个命令行,同样进入kafka客户端目录,然后执行kafka-console-consumer.sh --bootstrap-server 172.17.47.44:9092 --topic mykafka --from-beginning,这样进入kafka消费者客户端。
    • 切回kafka生产者客户端窗口,输入我们准备好的JSON数据{"user_id": "543462", "item_id":"1715", "category_id": "1464116", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"},此时,观察kafka消费者客户端窗口,能看到一条数据被打印出来。如下所示:
    PS C:\Users\tzmaj> docker exec -it 7a58196af291 '/bin/bash'
    bash-4.4# cd /opt/kafka/bin
    bash-4.4# kafka-console-producer.sh --broker-list 172.17.47.44:9092 --topic mykafka
    >{"user_id": "543462", "item_id":"1715", "category_id": "1464116", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
    >{"user_id": "543462", "item_id":"1715", "category_id": "1464116", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
    >{"user_id": "543462", "item_id":"1715", "category_id": "1464116", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
    >{"user_id": "543462", "item_id":"1715", "category_id": "1464116", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
    
    
    PS C:\Users\tzmaj> docker exec -it 7a58196af291 '/bin/bash'
    bash-4.4# cd /opt/kafka/bin/
    bash-4.4# kafka-console-consumer.sh --bootstrap-server 172.17.47.44:9092 --topic mykafka --from-beginning
    {"user_id": "543462", "item_id":"1715", "category_id": "1464116", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
    {"user_id": "543462", "item_id":"1715", "category_id": "1464116", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
    {"user_id": "543462", "item_id":"1715", "category_id": "1464116", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
    {"user_id": "543462", "item_id":"1715", "category_id": "1464116", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
    ^CProcessed a total of 4 messages
    
    
    
    • 第一段是生产者,第二段是消费者,看样子我们能够正确的消费和生产数据。NICE!下面用JAVA测试一下能否正常消费
          Properties properties = new Properties();
          properties.put("bootstrap.servers", "172.17.47.44.:9092");
          properties.put("group.id", "test1");
          properties.put("auto.offset.reset", "earliest");
          properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
          properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    
          KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(properties);
          kafkaConsumer.subscribe(Arrays.asList("mykafka"));
          while (true) {
              ConsumerRecords<String, String> records = kafkaConsumer.poll(100);
              for (ConsumerRecord<String, String> record : records) {
                  System.out.printf(" value is =>>> %s", record.value());
              }
          }
    

    启动,然后观察控制台

    value is =>>> {"user_id": "543462", "item_id":"1715", "category_id": "1464116", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"} 
    

    能够正常消费,我们的kafka客户端也没问题

  • 安装mysql服务

    • 执行docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 mysql:5.6命令,此处的MYSQL_ROOT_PASSWORD=123456是将root密码设置为123456,大家可以根据个人喜爱自己修改

    • 使用Navicat连接我们的mysql
      mysql.png

      主机和端口分别就是我们的ip和设置的端口3306,密码就是上一步提到的MYSQL_ROOT_PASSWORD,测试连接
      mysql.png

      连接成功!接下来连入我们的mysql,并执行select CURRENT_TIMESTAMP() from dual,返回2020-04-28 07:38:48,看样子我们的mysql也没什么问题。

  • 最后,数据下载地址 UserBehavior.csv

  • 好了,我们Flink Sql教程系列第一课环境准备完成了,接下来开始正式进入Flink Sql的学习之旅。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第一章 整体介绍 2 1.1 什么是 Table API 和 Flink SQL 2 1.2 需要引入的依赖 2 1.3 两种 planner(old & blink)的区别 4 第二章 API 调用 5 2.1 基本程序结构 5 2.2 创建表环境 5 2.3 在 Catalog 中注册表 7 2.3.1 表(Table)的概念 7 2.3.2 连接到文件系统(Csv 格式) 7 2.3.3 连接到 Kafka 8 2.4 表的查询 9 2.4.1 Table API 的调用 9 2.4.2 SQL 查询 10 2.5 将 DataStream 转换成表 11 2.5.1 代码表达 11 2.5.2 数据类型与 Table schema 的对应 12 2.6. 创建临时视图(Temporary View) 12 2.7. 输出表 14 2.7.1 输出到文件 14 2.7.2 更新模式(Update Mode) 15 2.7.3 输出到 Kafka 16 2.7.4 输出到 ElasticSearch 16 2.7.5 输出到 MySql 17 2.8 将表转换成 DataStream 18 2.9 Query 的解释和执行 20 1. 优化查询计划 20 2. 解释成 DataStream 或者 DataSet 程序 20 第三章 流处理中的特殊概念 20 3.1 流处理和关系代数(表,及 SQL)的区别 21 3.2 动态表(Dynamic Tables) 21 3.3 流式持续查询的过程 21 3.3.1 将流转换成表(Table) 22 3.3.2 持续查询(Continuous Query) 23 3.3.3 将动态表转换成流 23 3.4 时间特性 25 3.4.1 处理时间(Processing Time) 25 3.4.2 事件时间(Event Time) 27 第四章 窗口(Windows) 30 4.1 分组窗口(Group Windows) 30 4.1.1 滚动窗口 31 4.1.2 滑动窗口 32 4.1.3 会话窗口 32 4.2 Over Windows 33 1) 无界的 over window 33 2) 有界的 over window 34 4.3 SQL 中窗口的定义 34 4.3.1 Group Windows 34 4.3.2 Over Windows 35 4.4 代码练习(以分组滚动窗口为例) 36 第五章 函数(Functions) 38 5.1 系统内置函数 38 5.2 UDF 40 5.2.1 注册用户自定义函数 UDF 40 5.2.2 标量函数(Scalar Functions) 40 5.2.3 表函数(Table Functions) 42 5.2.4 聚合函数(Aggregate Functions) 45 5.2.5 表聚合函数(Table Aggregate Functions) 47
### 回答1: Flink 1.14的Table API和SQL教程可以在Flink官方文档中找到,其中包括了Table API和SQL的基础概念、语法、操作符、函数等内容,还有详细的示例代码和实战案例,非常适合初学者学习和入门。另外,Flink社区也有很多优秀的博客和视频教程,可以帮助大家更深入地理解和应用Table API和SQL。 ### 回答2: Flink是一个分布式计算引擎,是Apache Hadoop生态圈中用于处理流式数据的一种解决方案。Flink支持表格API和SQL语言,使得用户可以更加简单地实现流处理任务。而在Flink 1.14中,TableAPI和SQL引擎则得到了进一步的增强。 TableAPI和SQL将无需掌握Java或Scala编程语言就可以操作表格数据。TableAPI API支持Java和Scala,SQL则支持标准的SQL语言。如果你熟悉SQL语言,那么你很容易上手使用TableAPI和SQL引擎。 Flink TableAPI和SQL支持各种类型的表格操作,包括选择、过滤、分组、排序、连接等。此外,它们还支持窗口和聚合操作。这使得用户在处理流式数据时可以更加简单易懂地进行复杂的操作。 在Flink 1.14中,TableAPI和SQL引擎还提供了一系列新功能,包括: 1. 时间特征支持——TableAPI和SQL中的数据时间戳可以通过时间特征进行定义和控制。通过时间特征,用户可以定义数据的时间属性,例如事件时间或处理时间。 2. 详细的窗口管理——当窗口中的数据到期时,Flink 1.14会自动清除过期数据,避免数据量过大导致性能下降。 3. 支持更多的流数据源——在Flink 1.14中,TableAPI和SQL引擎可以直接从Kafka、Kinesis、Hive等数据源中读取数据。这可以让用户更加方便地读取数据,而无需编写额外的代码。 TableAPI和SQL引擎对于Flink用户来说是非常重要的工具,无需掌握Java或Scala编程语言即可操作表格数据。并且在Flink 1.14中,这两个工具得到了进一步的增强,包括更好的窗口管理和更多的数据源支持。因此,学习TableAPI和SQL引擎对于想要使用Flink进行流处理的人来说是非常有益的。 ### 回答3: Flink 1.14 TableAPI和SQL是一个非常好用的数据处理工具,可帮助数据分析师快速进行数据查询、聚合和处理。下面详细介绍一下Flink 1.14的TableAPI和SQL教程。 1. 如何配置Flink 1.14的TableAPI和SQL环境? 在进行Flink 1.14的TableAPI和SQL开发之前,需要先进行环境的配置。可以在官网下载Flink的安装包,解压后找到/bin目录下的start-cluster.sh脚本进行启动。启动之后,即可通过WebUI的页面查看Flink的运行状态。 2. TableAPI的基本操作 TableAPI是Flink的一个高层次数据处理API,可以通过编写代码来进行数据的处理。TableAPI的基本操作有以下几个: (1) 创建Table,可以使用StreamTableEnvironment的fromDataStream或fromTableSource方法,将DataStream或TableSource转换成Table。 (2) Table的转换,可以使用多种转换操作,包括filter、select、orderBy、groupBy、join等。 (3) 将Table转化为DataStream,可以使用StreamTableEnvironment的toDataStream方法。 3. SQL的基本操作 SQLFlink提供的一种快速数据处理方式,用户只需要编写SQL语句即可完成数据处理。SQL的基本操作有以下几个: (1) 注册Table,可以使用StreamTableEnvironment的registerTable或registerTableSource方法,将Table或TableSource注册到环境中。 (2) 执行SQL,可以使用StreamTableEnvironment的executeSql方法,执行SQL语句并返回结果。 (3) 将结果转换为DataStream,可以使用StreamTableEnvironment的toDataStream方法。 4. 如何优化Flink 1.14的TableAPI和SQL的执行效率? 在进行TableAPI和SQL开发时,为了保证其执行效率,需要注意以下几点: (1) 避免使用复杂的JOIN操作,可以使用Broadcast和TableFunction等方式来避免JOIN操作。 (2) 注意Table的Schema定义,Schema的设计合理与否直接影响SQL性能。 (3) 避免使用无限制的聚合操作,可以进行分批次聚合来避免。 总的来说,Flink 1.14的TableAPI和SQL是非常强大的数据处理工具,能够帮助开发者快速高效的进行数据处理。上述内容是入门级别的教程,如果想要更深入的了解,可以参考官方文档进行学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值