大資料開發實戰 Stream SQL實時開發一

2021-09-24 17:04:56 字數 4435 閱讀 5718

流計算sql通常是乙個類sql的宣告式語言,主要用於對流式資料(streams)的持續性查詢,目的是在常見流計算平台和框架(如storm、spark streaming、flink、beam等)的底層api上,

通過使用簡易通用的的sql語言構建sql抽象層,降低實時開發的門檻。

流計算sql的原理其實很簡單,就是在sql和底層的流計算引擎之間架起一座橋梁---流計算sql被使用者提交,被sql引擎層翻譯為底層的api並在底層的流計算引擎上執行。比如對storm

來說,會自動翻譯成storm的任務拓撲並在storm集群上執行。

流計算sql引擎是流計算sql的核心,主要負責對使用者sql輸入進行語法分析、語義分析、邏輯計畫生成、邏輯計畫執行、物理執行計畫生成等操作。而真正執行計算的是底層的流計算平台。

不同於離線任務,實時的資料是不斷流入的,所以為了使用sql來對流處理進行抽象,流計算sql也引入了「表」的概念,不過這裡的表是動態表。

流計算sql的架構如下:

sql層:流計算sql給使用者的介面,它提供過濾、轉換、關聯、聚合、視窗、select、union、split等各種功能。

sql引擎層:負責sql解析/校驗、邏輯計畫生成優化和物理計畫執行等。

流計算引擎層:具體執行sql引擎層生成的執行計畫。

目前流計算sql在各個計算框架的進度和支援力度不一。

storm sql還只是乙個實驗性的功能。flink sql是flink大力推廣的核心api。flink是乙個原生的開源流計算引擎,而且目前還沒有其它開源流計算引擎能提供比flink 更優秀的流

計算sql框架和語法等,所以flink sql實際上在定義流計算sql的標註。

阿里雲stream sql 的底層就是flink引擎(實際是blink,也就是alibaba flink),可以認為blink是flink的企業版本,

阿里雲提供了stream sql 開發的完整環境,包括stream sql語法、ide開發工具、除錯及運維等。下面具體介紹概念和語法

3.1、stream sql 源表

stream sql 通常將源頭資料抽象為源表,就像乙個storm任務必須至少定義乙個spout,乙個stream sql 任務必須至少定義乙個源表。

定義stream sql 源表的語法如下:

create table tablename

(columnname datatype [,columnname datatype]*)

[with (propertyname=propertyvalue [,propertyname=propertyvalue ] * )];

如下面的例子建立了乙個datahub型別的源表

create table datahub_stream(

name varchar,

age bigint,

birthday bigint)

with (

type ='datahub',

endpoint =『

project='blink-datahub_test',

topic ='test_topic_1',

accessid =0i70rrfjd1obawas',

accesskey ='yf60ewurseo1uan4ninvqpj2zhcfhu',

starttime='2018-08-20 00:00:00'

其中的type表示流式資料的源頭型別,可以為datahub,也可以為日誌或訊息中介軟體等,type下面的各個引數型別的不同而不同,它們共同確定了此type的某個源頭型別。

此外,阿里雲stream sql底層流計算引擎是flink/blink,因此其支援水位線機制。

定義水位線的語法如下:

watermark  [watermarkname] for

as withoffset(,offset)

比如watermark for rowtime as withoffset(rowtime,4000)就對源頭資料列rowtime定義了固定延遲4s的水位線。

3.2 、stream sql 結果表

有源表,就是結果表,stream sql定義結果表的語法如下:

create table tablename

(columnname datatype [,columnname datatype]*)

[with (propertyname=propertyvalue [,propertyname=propertyvalue ] * )];

stream sql的結果表支援各種型別,包括類似mysql的rds、類似hbase的tablestore、類似訊息佇列的messagequeue的,下面以rds來介紹stream sql 結果表的具體語法:

create table rds_output(

id int,

len int,

content varchar,

primary key(id,len)

) with (

type ='rds',

url='jdbc:mysql:******',

tablename='test4',

username='test',

password='***x'

在上述**中,結果表的type不同,相應後面的其它引數也不一樣,具體可用參考阿里雲幫助文件。

3.3、stream sql維度表

流計算sql的維度表資料一類特殊的外部資料,相對流資料來說,他比較穩定且變化緩慢,是靜態或準靜態資料,作為join / left outer join的右表使用。需要特別注意的是,

維度表在流計算中不允許作為from 後面的資料儲存。流計算中對於from子句後對接的資料儲存一定是流式資料儲存,即 select * from dim_table是不被允許的。

阿里雲stream sql中沒有專門為維度表設計的ddl語法,使用標準的create table語法即可,但是需要額外增加一行period for system_time的宣告,這行宣告定義了

維度表的變化週期,即表明該表是一張會變化的表。

乙個簡單的維度表定義例項如下,type後面的語法類似源表定義,

create table white_list (

id varchar,

name varchar,

age int,

primary key(id),  --用作維度表,必須有宣告的主鍵

period for system_time ---定義了維度表的變化週期

) with (

type = '***',

3.4、stream sql 臨時表

在實際的實時開發中,經常發現業務邏輯的複雜性使得只用乙個stream sql來完成所有的業務邏輯基本是不可能的,而必須拆分為多個sql共同完成,此時就需要定義中間臨時表(

在阿里雲stream sql 中也叫view,即檢視)。在stream sql中定義臨時表的語法如下:

create view viewname

[ (columnname[,columnname]*])]

as querystatement;

但需要注意的是,stream sql臨時表僅用於輔助計算邏輯表達的記憶體邏輯中間狀態,其物理是並不存在,也不會產生資料的物理儲存。當然,臨時表也不占用系統空間。乙個臨時表的例子

如下:create view largeorders(r, t, c, u) as

select rowtime, productid, c, units

from orders;

3.5、stream sql dml

stream sql語法和sql標準語法絕大部分都是相同的,下面僅著重介紹insert操作

insert操作的語法:

insert into tablename

[ ( columnname[,columnname]* )]

querystatement;

流計算不支援單獨select操作,當前在執行select查詢之前必須執行insert操作將結果儲存起來。同時,需要注意的是,乙個sql檔案支援多個源表輸入和多個結果表輸出。

只有result表和tmp表可以執行insert操作,且每張表只能執行一次insert操作,dim 表和stream表不能執行insert操作。

普通的select操作是從幾張表中讀資料,但查詢的物件也可以是另乙個select操作,也就是子查詢,但要注意子查詢必須加別名,例項如下:

insert into result_table

select * from (

select t.a,   sum(t.b) as sum_b,   from t1 t   

group by t.a

) t1

where t1.sum_b>100;

初探大資料 開發環境介紹 實戰一

使用環境 1 centos 6.4 2 hadoop版本對比及選擇 生產較多的cdh版本 cdh5.7.0 cdh 5.7.0 生產或者測試環境選擇對應cdh版本時,一定要採用尾號是一樣的版本 為什麼很多公司選擇hadoop作為大資料平台的解決方案?1 原始碼開源 2 社群活躍 參與者很多 spar...

《實戰大資料》前言

實戰大資料 資料是重要資產 已成為大家的共識,眾多公司爭相分析 挖掘大資料背後的資訊財富。本書在這個背景下,對目前大資料及其相關技術的發展進行總結,理論聯絡實踐,既不缺乏理論深度又具有實用價值。前言隨著雲時代的來臨,大資料 big data 也吸引了越來越多的關注。大資料目前已經成為it領域最為流行...

大資料實戰 Hive 技巧實戰

select address from test where dt 20210218 union all select address from test where dt 20210218 address m a m a m b m b m b m b select address from te...