在实验以前,仍是简单介绍一下Redshift吧,至于数据仓库基础知识和原理就不在这里展开了。 html
Amazon Redshift 是一种运行快速、彻底托管的 PB 级数据仓库,让您能够经过简单而经济高效的方式使用现有商业智能工具来分析全部数据。一般能够进行 3 倍压缩,以显著下降成本。使用标准的 PostgreSQL JDBC 和 ODBC 驱动程序。篇幅缘由先说两个特性,具体能够去官网查找。node
可扩展
能或容量需求发生变化时,轻松更改云数据仓库中的节点数量或类型。经过密集存储 (DS) 节点,您可以以很是低的价格使用硬盘 (HDD) 建立超大型数据仓库。经过密集计算 (DC) 节点,您可使用高速 CPU、大量 RAM 和固态硬盘 (SSD) 建立超高性能数据仓库。web
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
其余设置:注意选择的Security Group 放行inbound TCP 5439端口:架构
开始建立:
建立完成后的状态:dom
有两种大类方式链接Redshift集群, 我两种方法都简单介绍一下:
一:使用AWS console 直接Query cluster。
二:使用DB client,好比pgweb去链接,注意端口号是5439。
第一种方法,直接点Redshifit上的,Query cluster 输入相关数据库名称,用户和临时密码就能够登陆进去并执行Query语句。
(注意,要用临时密码登陆)ide
先建立数据仓库的表, 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
);
返回的结果:
而后,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成功。)
这个代码执行须要一点时间(2分钟左右,我用海外的Redshift,1分44秒搞定。为啥这么快?看数据源的地址。),由于会copy 6GB的数据包括了 23个CSV数据文件,数据统计了1990-2012年美联航的数据(96825753条数据)。
执行的时候,数据是并行加载从S3中加载到Redshift集群的。
当咱们建立一个表的时候咱们能够指定分区键,此次实验中分区键是 carrier varchar(80) DISTKEY,
因此当数据加载到表中时,每一行的数据会根据分区键分配到各个node slices中。在前面Redshift的架构中也有讲过,选择一个合适的分区键能够很好的提高咱们的查询效率和并行数据加载的速度。
通过2-5钟的等待时间,完成数据的copy
能够先用DB client 工具查看一下,数据是这样子的(九千多万条数据):Task4:Run Queries:
SELECT COUNT() FROM flights;
作数据分析或数据探索,理解每个字段表明的含义十分重要,字段注释以下:
1.先随机找出flights表中的10条数据。
SELECT
FROM flights
ORDER BY random()
LIMIT 10;
2.找出 出发次数最多的 top10 的Airline公司并groupby carrier。
SELECT
carrier,
SUM (departures)
FROM flights
GROUP BY carrier
ORDER BY 2 DESC
LIMIT 10;
其实还有不少能够写,在对应企业具体需求的时候,老板们会有不少想法,好比,
他还想知道载客量最多的TOP3的航空公司都有哪些?Task 5: Joining tables
表关联查询,跟关系型数据库的方法差很少,我在前面的课程中有讲过。数据仓库的概念实际就是数据库的升级版本,更庞大的数据,更多维度的分析。
咱们再建立一张table,并定义它的Schema:
CREATE TABLE aircraft (
aircraft_code CHAR(3) SORTKEY,
aircraft VARCHAR(100)
);
而后往表中注入数据,跟以前的步骤同样,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’;
咱们先随机查一下新建立的table中的随机10条数据:
SELECT *
FROM aircraft
ORDER BY random()
LIMIT 10;
返回的结果:
这个表咱们发现,包含两个字段,一个是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;
后面的步骤是使用DB client(pgweb去链接,注意端口号是5439),感兴趣同窗再用它作一遍,也能够忽略。直接跳到Task6:性能分析
Host地址在Redshift的
而后Run Query 就会有一个名为flights的表建立完成:
而后执行COPY命令
运行SQL:SELECT COUNT() FROM flights;
SELECT FROM flightsORDER BY random()LIMIT 10;
SELECT carrier, SUM (departures)FROM flightsGROUP BY carrierORDER BY 2 DESCLIMIT 10;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;
什么意思呢?这句SQL主要是分析每个逻辑步骤中query所消耗的时长。何时执行SUM,它的COST是?何时执行JOIN,它的COST是?对应优化SQL的查询性能十分重要。
数据压缩和列式存储
这两点是数据仓库查询效率比传统关系型数据库快的主要缘由。
执行这条SQL,咱们来分析一下:
ANALYZE COMPRESSION flights;
Encoding 是压缩方式,Est_reduction_pct 表明压缩率。是否是很惊人?!
具体能够参考:https://docs.aws.amazon.com/zh_cn/redshift/latest/dg/r_ANALYZE_COMPRESSION.htmlTask9:从已有的表中建立新的表。
目的是为了进一步分析,好比我想分析有多少飞往洛杉矶的乘客?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;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;
Used:Megabytes,多少MB磁盘使用
Capacity:磁盘空间。
Percent_used:用了多少。这里node0 用了0.54%,node1 用了 0.42%。Task11:监控与维护
每个Query的执行状况:
集群的监控概况:
对现有集群的配置与更改:
加密、快照、还原、修改配置信息等等都在这里了。
建立报警:好,没想到一步一步的作,写了这么多。最后别忘了关闭集群,土豪随意。