ablog

不器用で落着きのない技術者のメモ

細かすぎて伝わらない Amazon Redshift のシステムテーブル/ビュー選手権: SYS_QUERY_DETAIL に plan_node_id 列が追加された

AWS エンジニアの皆様、AWS サービスアップデートのキャッチアップおつかれさまです。
このエントリは AWS Analytics Advent Calendar 2024 の4日目の記事です。
昨日は 大薗さんの状況に合わせて、とても素晴らしい食事プランを提案してくれる 有益なエントリでした!

AWS Summit Tokyo 2023 で "Amazon Redshift クエリパフォーマンスチューニング Deep Dive" というタイトルで、Amazon Redshift でシステムテーブル/ビューを使ってシステマチックにクエリのボトルネックを特定・チューニングする手法を発表しましたが、最近のすばらしいアップデートを共有します。

SYS_QUERY_DETAIL に plan_node_id 列が追加された


これまで クエリのボトルネック分析で、どのセグメント、ステップで時間を要しているか特定した後、実行計画のどのオペレーションと対応するかはオペレーションの名前で紐づける必要がありましたが、SYS_QUERY_DETAIL に plan_node_id 列が追加され機械的に実行計画 SYS_QUERY_EXPLAIN の plan_node_id 列と結合してマッピングできるようになりました。

tpch_100gb awsuser 20241204_15:27:57 =# select a.query_id, a.stream_id, a.segment_id, a.step_id, a.step_name, a.duration, a.input_bytes, a.output_bytes, a.input_rows, a.output_rows, b.plan_parent_id, substring(b.plan_node,1,100) plan_node
from sys_query_detail a, sys_query_explain b
where  a.query_id = 3178
and a.query_id = b.query_id
and b.plan_node_id = a.plan_node_id
order by a.query_id, a.stream_id, a.segment_id, a.step_id;
 query_id | stream_id | segment_id | step_id | step_name  | duration | input_bytes | output_bytes | input_rows | output_rows | plan_parent_id |                                           plan_node
----------+-----------+------------+---------+------------+----------+-------------+--------------+------------+-------------+----------------+-----------------------------------------------------------------------------------------------
     3178 |         0 |          0 |       0 | scan       |  1612796 |           0 |    269433360 |   10745485 |     7484260 |              5 |                     ->  XN Seq Scan on lineitem  (cost=0.00..120535.76 rows=8035718 width=40)
     3178 |         0 |          0 |       2 | distribute |  1612796 |           0 |    179622240 |          0 |     7484260 |              2 |         ->  XN Hash Join DS_DIST_INNER  (cost=172290.28..9643380731.17 rows=8035718 width=56)
     3178 |         0 |          1 |       0 | scan       |  1627169 |           0 |    179622240 |          0 |     7484260 |              2 |         ->  XN Hash Join DS_DIST_INNER  (cost=172290.28..9643380731.17 rows=8035718 width=56)
     3178 |         0 |          1 |       2 | hash       |  1627169 |           0 |    239496320 |          0 |     7484260 |              3 |               ->  XN Hash  (cost=120535.76..120535.76 rows=8035718 width=40)
     3178 |         1 |          2 |       0 | scan       |   939133 |           0 |    753563993 |   20000000 |    18560685 |              3 |               ->  XN Seq Scan on part  (cost=0.00..200000.00 rows=20000000 width=32)
     3178 |         1 |          2 |       3 | hashjoin   |   939133 |           0 |            0 |          0 |     7484260 |              2 |         ->  XN Hash Join DS_DIST_INNER  (cost=172290.28..9643380731.17 rows=8035718 width=56)
     3178 |         1 |          2 |       6 | aggregate  |   939133 |           0 |          768 |          0 |          16 |              1 |   ->  XN Aggregate  (cost=9643420909.76..9643420909.78 rows=1 width=56)
     3178 |         2 |          3 |       0 | scan       |     2445 |           0 |          768 |          0 |          16 |              1 |   ->  XN Aggregate  (cost=9643420909.76..9643420909.78 rows=1 width=56)
     3178 |         2 |          3 |       1 | return     |     2445 |           0 |          768 |          0 |          16 |              1 |   ->  XN Aggregate  (cost=9643420909.76..9643420909.78 rows=1 width=56)
     3178 |         2 |          4 |       0 | scan       |     1577 |           0 |          768 |          0 |          16 |              1 |   ->  XN Aggregate  (cost=9643420909.76..9643420909.78 rows=1 width=56)
     3178 |         2 |          4 |       1 | aggregate  |     1577 |           0 |           48 |          0 |           1 |              1 |   ->  XN Aggregate  (cost=9643420909.76..9643420909.78 rows=1 width=56)
     3178 |         3 |          5 |       0 | scan       |      191 |           0 |           48 |          0 |           1 |              1 |   ->  XN Aggregate  (cost=9643420909.76..9643420909.78 rows=1 width=56)
(12 rows)

Time: 9170.031 ms (00:09.170)

明日今日は @tdmnishi さんの Amazon DataZone 経由で SageMaker Canvas へデータインポート #AWS - Qiita です、いってらっしゃい!

参考

アドベントカレンダー」(Advent Calendar)とは、クリスマスまでの期間(待降節アドベント)をより楽しく過ごすため、12月1日から24日までの間カウントダウンしていく“日めくりカレンダー”のことです。
(中略)
IT業界では、このアドベントカレンダーの風習に習って、12月1〜24日の間、何かのテーマや、何らかの制限事項(縛り)を設けてWebにコラム記事を書くというイベントを楽しむようになりました(なかには25日や年末まで続けるものもあるようです)。

師走を楽しもう。技術系アドベントカレンダーの魅力とは:安藤幸央ランダウン(59) - @IT

師走を楽しもう。技術系アドベントカレンダーの魅力とは:安藤幸央のランダウン(59) - @IT

ファイルリストを連番順でソートする

"ls -1|sort -V" で OK。

  • Vオプションがないとき
$ ls -1|sort|head -10
orders.tbl.1
orders.tbl.10
orders.tbl.100
orders.tbl.101
orders.tbl.102
orders.tbl.103
orders.tbl.104
orders.tbl.105
orders.tbl.106
orders.tbl.107
  • Vオプションがあるとき
$ ls -1|sort -V|head -10
orders.tbl.1
orders.tbl.2
orders.tbl.3
orders.tbl.4
orders.tbl.5
orders.tbl.6
orders.tbl.7
orders.tbl.8
orders.tbl.9
orders.tbl.10

Okta から Redshift に SSO する

要件

  • クライアントPCから MFA して Redshift に認証したい。
  • Okta の認証で MFA して、SSO して Redshift に認証したい。

EC2(Amazon Linux 2023)に EBS ボリュームをアタッチした手順

EC2(c5.4xlarge/Amazon Linux 2023)に EBS ボリューム(st1)をアタッチして xfs でフォーマットしてマウントした手順。

前提

手順

EBS ボリュームを作成する
  • EBS ボリュームを作成する。
  • 作成した EBS ボリュームを EC2 にアタッチする。
EC2 でファイルシステムをフォーマットしてマウントする
  • アタッチした EBS ボリュームの NVMe デバイス名を確認する。
$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1       259:0    0  50G  0 disk
├─nvme0n1p1   259:2    0  50G  0 part /
├─nvme0n1p127 259:3    0   1M  0 part
└─nvme0n1p128 259:4    0  10M  0 part /boot/efi
nvme1n1       259:1    0  10T  0 disk
[ec2-user@ip-10-0-12-234 ~]$ sudo lsblk -f
NAME          FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme0n1
├─nvme0n1p1   xfs          /     af805cc0-8447-4b55-8c57-ea294e4bea9c   47.6G     5% /
├─nvme0n1p127
└─nvme0n1p128 vfat   FAT16       94FC-EE88                               8.7M    13% /boot/efi
nvme1n1
  • NVMe ボリューム名とブロックデバイス名の対応を確認する。
$ sudo /sbin/ebsnvme-id /dev/nvme1n1
Volume ID: vol-0ad46191e2316f4df
sdb
  • xfs でフォーマットする。
$ sudo mkfs -t xfs /dev/sdb
meta-data=/dev/sdb               isize=512    agcount=32, agsize=83886080 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1
data     =                       bsize=4096   blocks=2684354560, imaxpct=5
         =                       sunit=1      swidth=1 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=521728, version=2
         =                       sectsz=512   sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
  • マウントポイントを作成してマウントする。
$ sudo mkdir /data
$ sudo mount /dev/sdb /data
  • マウントできていることを確認する。
$ mount
...
/dev/nvme1n1 on /data type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,sunit=8,swidth=8,noquota)
  • 再起動してもマウントされるよう設定する。
$ sudo cp /etc/fstab /etc/fstab.orig
  • NVMe デバイスの UUID を確認する。
$ sudo blkid
...
/dev/nvme1n1: UUID="c36a424f-a3f2-4447-a1cc-41f11c7f310d" BLOCK_SIZE="512" TYPE="xfs"
  • /etc/fstab に以下を追記する。
$ sudo vim /etc/fstab
...
UUID=c36a424f-a3f2-4447-a1cc-41f11c7f310d  /data  xfs  defaults,nofail  0  2

AWS認定 AI Practitioner の勉強

メモ

Redshift のユーザー名にハイフンとドットを使えるか

Redshift のユーザー名にハイフンとドットを使えることを確認したログをメモ。

[ec2-user@ip-172-31-0-101 ~]$ psql "host=redshift-cluster-poc-central.********.ap-northeast-1.redshift.amazonaws.com user=awsuser dbname=dev port=5439" 
Timing is on.
psql (13.7, server 8.0.2)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

awsuser 10:52 =# create user "ichiro-.suzuki" password 'Password123';
CREATE USER
Time: 324.729 ms
awsuser 10:53 =# select * from pg_user;                         
           usename            | usesysid | usecreatedb | usesuper | usecatupd |  passwd  | valuntil |               useconfig               
------------------------------+----------+-------------+----------+-----------+----------+----------+---------------------------------------

(中略)

 ichiro-.suzuki               |      199 | f           | f        | f         | ******** |          | 
(25 rows)

Time: 4.930 ms
awsuser 10:53 =# \q                                                  
[ec2-user@ip-172-31-0-101 ~]$ psql "host=redshift-cluster-poc-central.********.ap-northeast-1.redshift.amazonaws.com user=ichiro-.suzuki dbname=dev port=5439" 
Password for user ichiro-.suzuki: 
Timing is on.
psql (13.7, server 8.0.2)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

ichiro-.suzuki 10:54 => select current_user;
  current_user  
----------------
 ichiro-.suzuki
(1 row)

Time: 5.003 ms
ichiro-.suzuki 10:54 => 

AWS CLI でRedshift の設定を確認する

AWS CLI でRedshift の設定を確認する

aws redshift describe-clusters --cluster-identifier <cluster id>
aws redshift  describe-logging-status --cluster-identifier <cluster id>