Flink 實踐教程 - 入門(4):讀取 MySQL 資料寫入到 ES

騰訊雲大資料發表於2021-11-09

​作者:騰訊雲流計算 Oceanus 團隊

流計算 Oceanus 簡介

流計算 Oceanus 是大資料產品生態體系的實時化分析利器,是基於 Apache Flink 構建的具備一站開發、無縫連線、亞秒延時、低廉成本、安全穩定等特點的企業級實時大資料分析平臺。流計算 Oceanus 以實現企業資料價值最大化為目標,加速企業實時化數字化的建設程式。本文將為您詳細介紹如何使用 MySQL 接入資料,經過流計算 Oceanus 對資料進行處理分析(示例中採用小寫轉換函式對name欄位進行了小寫轉換),最終將處理好的資料存入 Elasticsearch 中 。

操作視訊


前置準備

1.  MySQL 叢集準備

1.1 新建 MySQL 叢集進入 MySQL 控制檯[1],點選左上方【新建】建立叢集。具體可參考官方文件 建立 mysql 例項[2]。在【資料庫管理】> 【引數設定】中設定引數 binlog_row_image=FULL,便於使用 CDC(Capture Data Change)特性,實現資料的變更實時捕獲。

1.2 準備資料

首先建立 testdb 庫,並在 testdb 庫中建立使用者 user 表,並插入資料。user 表結構:

欄位名 型別 含義
user_id int 使用者ID
user_name varchar(50) 使用者名稱
create_time timestamp 建立時間

在表中插入2條資料。

INSERT INTO `user` (`user_id`, `user_name`, `create_time`) VALUES (1001, '小明', '2021-10-01 00:00:00');
INSERT INTO `user` (`user_id`, `user_name`, `create_time`) VALUES (1002, 'TONY', '2021-10-02 00:00:00');

  

1.3 設定引數

點選例項 ID,在例項詳情頁面點選【資料庫管理】進入【引數設定】皮膚,設定binlog_row_image=FULL來開啟資料庫變化的同步。

通過 MySQL 整合資料到流計算 Oceanus (Flink) 叢集,可以使用 flink-connector-jdbc 或者 flink-connector-mysq-cdc。使用 MySQL-cdc 特性時,flink-connector-mysq-cdc 聯結器需要設定 MySQL 資料庫的引數 binlog_row_image=FULL。

2. 建立流計算 Oceanus 叢集

進入流計算 Oceanus 控制檯[3],點選左側【叢集管理】,點選左上方【建立叢集】,具體可參考流計算 Oceanus 官方文件建立獨享叢集[4]。

建立流計算 Oceanus 叢集和 MySQL 叢集時所選 VPC 必須是同一 VPC。

3. 建立 Elasticsearch 叢集

進入 Elasticsearch 控制檯[5],點選左上方【新建】,建立 Elasticsearch 例項,具體操作請訪問建立 Elasticsearch 叢集[6]。

建立 ES 叢集和流計算 Oceanus 叢集時所選私有網路 VPC 必須是同一 VPC。

 

流計算 Oceanus 作業

1. 建立 Source

CREATE TABLE `user_source` (
    `user_id` int,
    `user_name` varchar(50),
    PRIMARY KEY (`user_id`) NOT ENFORCED -- 如果要同步的資料庫表定義了主鍵, 則這裡也需要定義
) WITH (
    'connector' = 'mysql-cdc',      -- 必須為 'mysql-cdc'
    'hostname' = '10.0.0.158',      -- 資料庫的 IP
    'port' = '3306',                -- 資料庫的訪問埠
    'username' = 'root',            -- 資料庫訪問的使用者名稱(需要提供 SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT, SELECT, RELOAD 許可權)
    'password' = 'yourpassword',    -- 資料庫訪問的密碼
    'database-name' = 'testdb',     -- 需要同步的資料庫
    'table-name' = 'user'           -- 需要同步的資料表名
);

  

2. 建立 Sink

-- Elasticsearch 只能作為資料目的表(Sink)寫入
-- 參見 https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/connect.html#elasticsearch-connector

CREATE TABLE es_sink (
    `user_id` INT,
    `user_name` VARCHAR
) WITH (
    'connector.type' = 'elasticsearch',    -- 輸出到 Elasticsearch
    'connector.version' = '6',             -- 指定 Elasticsearch 的版本, 例如 '6', '7'. 
    'connector.hosts' = 'http://10.0.0.175:9200', 
    'connector.index' = 'User',     
    'connector.document-type' = 'user',  
    'connector.username' = 'elastic',  
    'connector.password' = 'yourpassword', 

    'update-mode' = 'upsert',              -- 捕捉資料庫變化時,需使用 'upsert' 模式 
    'connector.key-delimiter' = '$',       -- 可選引數, 複合主鍵的連線字元 (預設是 _ 符號)
    'connector.key-null-literal' = 'n/a',  -- 主鍵為 null 時的替代字串,預設是 'null'
    'connector.connection-max-retry-timeout' = '300', -- 每次請求的最大超時時間 (ms)
    'format.type' = 'json'                 -- 輸出資料格式, 目前只支援 'json'
);

  

3. 編寫業務 SQL

insert into es_sink
(
    select user_id,
    LOWER(user_name) -- LOWER()函式會將使用者名稱轉換為小寫
    from user_source
);

  

4. 選擇 Connector

點選【儲存】>【釋出草稿】執行作業。

請根據實際購買的 Elasticsearch 版本選擇對應的 Connector ,1.13 版本之後無需選擇可自動匹配 Connector。

5. 資料查詢

進入 Elasticsearch 控制檯[5],點選之前購買的 Elasticsearch 例項,點選右上角【Kibana】,進入 Kibana 查詢資料。具體查詢方法請參考通過 Kibana 訪問叢集[7]。

 

總結

本示例用 MySQL 聯結器持續整合資料庫資料變化記錄,經過流計算 Oceanus 實現最基礎的資料轉換功能,最後 Sink 到Elasticsearch 中,使用者無需提前在 Elasticsearch 中建立索引。另外,ES 作為Source/Sink , 使用時間戳 timestamp 型別欄位時長度需指定,如:timestamp(3)

 

參考閱讀

[1]: MySQL 控制檯:https://console.cloud.tencent.com/cdb  

[2]: 建立 mysql 例項:https://cloud.tencent.com/document/product/236/46433  

[3]: 流計算 Oceanus 控制檯:https://console.cloud.tencent.com/oceanus/overview  

[4]: 建立 Oceanus 獨享叢集:https://cloud.tencent.com/document/product/849/48298

[5]: Elasticsearch 控制檯:https://console.cloud.tencent.com/es  

[6]: 建立 Elasticsearch 叢集:https://cloud.tencent.com/document/product/845/19536

[7]: 通過 Kibana 訪問叢集:https://cloud.tencent.com/document/product/845/19541  

 

 

Flink 實踐教程 - 入門(4):讀取 MySQL 資料寫入到 ES

關注“騰訊雲大資料”公眾號,技術交流、最新活動、服務專享一站 Get~

 

 

流計算 Oceanus 限量秒殺專享活動火爆進行中↓↓

 

 

Flink 實踐教程 - 入門(4):讀取 MySQL 資料寫入到 ES

相關文章