【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據

在實驗以前,仍是簡單介紹一下Redshift吧,至於數據倉庫基礎知識和原理就不在這裏展開了。 html

Amazon Redshift 是一種運行快速、徹底託管的 PB 級數據倉庫,讓您能夠經過簡單而經濟高效的方式使用現有商業智能工具來分析全部數據。一般能夠進行 3 倍壓縮,以顯著下降成本。使用標準的 PostgreSQL JDBC 和 ODBC 驅動程序。篇幅緣由先說兩個特性,具體能夠去官網查找。node

  • 數據倉庫優化
    使用了列式存儲、數據壓縮及區域映射,能夠減小執行查詢所需的 I/O 數量。Amazon Redshift 採用了大規模並行處理 (MPP) 數據倉庫架構,能夠對 SQL 操做進行並行分佈處理,以便利用全部可用資源。
  • 可擴展
    能或容量需求發生變化時,輕鬆更改雲數據倉庫中的節點數量或類型。經過密集存儲 (DS) 節點,您可以以很是低的價格使用硬盤 (HDD) 建立超大型數據倉庫。經過密集計算 (DC) 節點,您可使用高速 CPU、大量 RAM 和固態硬盤 (SSD) 建立超高性能數據倉庫。web

    實驗包括:

    1. 建立一個Amazon Redshift集羣
    2. 經過SQL客戶端鏈接Amazon Redshift
    3. 加載S3的數據到Amazon Redshift
    4. 查詢Amazon Redshift中的數據
    5. 監控Amazon Redshift的性能

【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據


Task1:建立一個Amazon Redshift集羣

【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據


Nodes 爲2個
下拉到Database configuration 中:
Database name:lab
Master user name:master
Master user password:Redshift123
而後建立(或選擇)一個具備S3 full access的role。
若是沒有建立一個:sql

{
"Version": "2012-10-17",
"Statement": [
{
"Action": "s3:",
"Resource": "
",
"Effect": "Allow"
}
]
}數據庫

在Cluster permission 中選擇剛剛建立的role:Redshift-Role
Copy這個role的ARN,咱們後面會用獲得:arn:aws:iam::303364507332:role/Redshift-Rolesession


【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
其餘設置:注意選擇的Security Group 放行inbound TCP 5439端口:架構


【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
開始建立:
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
建立完成後的狀態:
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據dom


【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據

Task2: 連接Amazon Redshift

有兩種大類方式鏈接Redshift集羣, 我兩種方法都簡單介紹一下:
一:使用AWS console 直接Query cluster。
二:使用DB client,好比pgweb去鏈接,注意端口號是5439。
第一種方法,直接點Redshifit上的,Query cluster 輸入相關數據庫名稱,用戶和臨時密碼就能夠登陸進去並執行Query語句。
(注意,要用臨時密碼登陸)ide

Task3:加載S3的數據到Amazon Redshift

先建立數據倉庫的表, copy如下代碼到Redshift的Query editor中 並run:
(注意,建立的表在public的schema中)工具

CREATE TABLE flights (
year smallint,
month smallint,
day smallint,
carrier varchar(80) DISTKEY,
origin char(3),
dest char(3),
aircraft_code char(3),
miles int,
departures int,
minutes int,
seats int,
passengers int,
freight_pounds int
);
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
返回的結果:
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
而後,Copy這段代碼到Query editor中 並run :
(注意:IAM_ROLE 後邊替換成本身的IAM ARN,'arn:aws:iam::303364507332:role/Redshift-Role’ )
COPY flights
FROM 's3://us-west-2-aws-training/awsu-spl/spl-17/4.2.6.prod/data/flights-usa'
IAM_ROLE 'arn:aws:iam::303364507332:role/Redshift-Role'
GZIP
DELIMITER ','
REMOVEQUOTES
REGION 'us-west-2’;
(注意,若是這個query很快就執行完了,而後運行sql的時候沒有查詢到數據,請檢查你的role是否add成功。)
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
這個代碼執行須要一點時間(2分鐘左右,我用海外的Redshift,1分44秒搞定。爲啥這麼快?看數據源的地址。),由於會copy 6GB的數據包括了 23個CSV數據文件,數據統計了1990-2012年美聯航的數據(96825753條數據)。
執行的時候,數據是並行加載從S3中加載到Redshift集羣的。
當咱們建立一個表的時候咱們能夠指定分區鍵,此次實驗中分區鍵是 carrier varchar(80) DISTKEY,
因此當數據加載到表中時,每一行的數據會根據分區鍵分配到各個node slices中。在前面Redshift的架構中也有講過,選擇一個合適的分區鍵能夠很好的提高咱們的查詢效率和並行數據加載的速度。
通過2-5鐘的等待時間,完成數據的copy
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
能夠先用DB client 工具查看一下,數據是這樣子的(九千多萬條數據):
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據

Task4:Run Queries:

SELECT COUNT() FROM flights;
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
作數據分析或數據探索,理解每個字段表明的含義十分重要,字段註釋以下:
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
1.先隨機找出flights表中的10條數據。
SELECT

FROM flights
ORDER BY random()
LIMIT 10;
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
2.找出 出發次數最多的 top10 的Airline公司並groupby carrier。
SELECT
carrier,
SUM (departures)
FROM flights
GROUP BY carrier
ORDER BY 2 DESC
LIMIT 10;
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
其實還有不少能夠寫,在對應企業具體需求的時候,老闆們會有不少想法,好比,
他還想知道載客量最多的TOP3的航空公司都有哪些?

Task 5: Joining tables

表關聯查詢,跟關係型數據庫的方法差很少,我在前面的課程中有講過。數據倉庫的概念實際就是數據庫的升級版本,更龐大的數據,更多維度的分析。
咱們再建立一張table,並定義它的Schema:
CREATE TABLE aircraft (
aircraft_code CHAR(3) SORTKEY,
aircraft VARCHAR(100)
);
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
而後往表中注入數據,跟以前的步驟同樣,COPY命令到Query editor中:
COPY aircraft
FROM 's3://us-west-2-aws-training/awsu-spl/spl-17/4.2.6.prod/data/lookup_aircraft.csv'
IAM_ROLE 'arn:aws:iam::283565736923:role/Redshift-Role'
IGNOREHEADER 1
DELIMITER ','
REMOVEQUOTES
TRUNCATECOLUMNS
REGION 'us-west-2’;
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
咱們先隨機查一下新建立的table中的隨機10條數據:
SELECT *
FROM aircraft
ORDER BY random()
LIMIT 10;
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
返回的結果:
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
這個表咱們發現,包含兩個字段,一個是aircraft code,另外一個是aircraft。這個aircraft code同時也是flights表中的字段。那麼咱們就能夠把他們作關聯join,作不少維度的查詢了。(JOIN aircraft using (aircraft_code))
執行SQL:飛行次數(別名爲trips)TOP10 的aircraft(應該是航班號)。
SELECT
aircraft,
SUM(departures) AS trips
FROM flights
JOIN aircraft using (aircraft_code)
GROUP BY aircraft
ORDER BY trips DESC
LIMIT 10;
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
後面的步驟是使用DB client(pgweb去鏈接,注意端口號是5439),感興趣同窗再用它作一遍,也能夠忽略。直接跳到Task6:性能分析

Host地址在Redshift的
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
而後Run Query 就會有一個名爲flights的表建立完成:

Task6: 加載數據:

而後執行COPY命令
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據

Task7:Run Queries:

運行SQL:SELECT COUNT() FROM flights;
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
SELECT
FROM flightsORDER BY random()LIMIT 10;
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
SELECT carrier, SUM (departures)FROM flightsGROUP BY carrierORDER BY 2 DESCLIMIT 10;
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據

Task8:性能分析

這個SQL須要用DB clinet去Run,由於Redshift query editor不支持multiple sql。ERROR: Multiple sql statements are not allowed.
SET enable_result_cache_for_session TO OFF;

EXPLAIN
SELECT
aircraft,
SUM(departures) AS trips
FROM flights
JOIN aircraft using (aircraft_code)
GROUP BY aircraft
ORDER BY trips DESC
LIMIT 10;
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
什麼意思呢?這句SQL主要是分析每個邏輯步驟中query所消耗的時長。何時執行SUM,它的COST是?何時執行JOIN,它的COST是?對應優化SQL的查詢性能十分重要。
數據壓縮和列式存儲
這兩點是數據倉庫查詢效率比傳統關係型數據庫快的主要緣由。
執行這條SQL,咱們來分析一下:
ANALYZE COMPRESSION flights;
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
Encoding 是壓縮方式,Est_reduction_pct 表明壓縮率。是否是很驚人?!
具體能夠參考:https://docs.aws.amazon.com/zh_cn/redshift/latest/dg/r_ANALYZE_COMPRESSION.html

Task9:從已有的表中建立新的表。

目的是爲了進一步分析,好比我想分析有多少飛往洛杉磯的乘客?TOP10最受歡迎的飛往Las Vegas的航班是?
好,咱們開始,建立一個airport的table,並定義SORTKEY:
CREATE TABLE airports (
airport_code CHAR(3) SORTKEY,
airport varchar(100)
);

COPY airports
FROM 's3://us-west-2-aws-training/awsu-spl/spl-17/4.2.6.prod/data/lookup_airports.csv'
IAM_ROLE 'arn:aws:iam::488279654332:role/Redshift-Role'
IGNOREHEADER 1
DELIMITER ','
REMOVEQUOTES
TRUNCATECOLUMNS
REGION 'us-west-2';
建立一個Las Vegas 航班的table.
CREATE TABLE vegas_flights
DISTKEY (origin)
SORTKEY (origin)
AS
SELECT
flights.*,
airport
FROM flights
JOIN airports ON origin = airport_code
WHERE dest = 'LAS’;
而後咱們找到TOP10最受歡迎的飛往Las Vegas的航班是?
SELECT
airport,
to_char(SUM(passengers), '999,999,999') as passengers
FROM vegas_flights
GROUP BY airport
ORDER BY SUM(passengers) desc
LIMIT 10;
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據

Task10:檢查磁盤空間和數據分佈

SELECT
owner AS node,
diskno,
used,
capacity,
used/capacity::numeric * 100 as percent_used
FROM stv_partitions
WHERE host = node
ORDER BY 1, 2;
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
Used:Megabytes,多少MB磁盤使用
Capacity:磁盤空間。
Percent_used:用了多少。這裏node0 用了0.54%,node1 用了 0.42%。

Task11:監控與維護

每個Query的執行狀況:
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
集羣的監控概況:
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
對現有集羣的配置與更改:
加密、快照、還原、修改配置信息等等都在這裏了。
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據
建立報警:
【AWS徵文】[數據倉庫]Redshift 動手實驗---分析美聯航airline數據好,沒想到一步一步的作,寫了這麼多。最後別忘了關閉集羣,土豪隨意。

相關文章
相關標籤/搜索