ablog

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

Redshift で分散スタイル変更時の VACUUM 要否

Redshift で分散スタイル変更時の VACUUM 要否を確認してみた。

EVEN分散->KEY分散に変更した場合

  • テーブル作成
dev=# drop table public.customer cascade;
dev=# create table public.customer 
(
  c_custkey      integer not null,
  c_name         varchar(25) not null,
  c_address      varchar(25) not null,
  c_city         varchar(10) not null,
  c_nation       varchar(15) not null,
  c_region       varchar(12) not null,
  c_phone        varchar(15) not null,
  c_mktsegment   varchar(10) not null
)
diststyle even
compound sortkey(c_nation,c_region);
  • データロード
dev=# copy customer from 's3://awssampledb-yoheia/ssbgz/customer'
iam_role 'arn:aws:iam::123456789012:role/redshift-spectrum-s3-fullaccess'
gzip compupdate off region 'ap-northeast-1';
  • VACUUM
dev=# vacuum full public.customer;
  • ANALYZE する
dev=# set analyze_threshold_percent to 0;
dev=# analyze public.customer;
  • svv_table_info 取得
dev=# select diststyle, sortkey1, tbl_rows, unsorted from svv_table_info where schema = 'public' and "table" = 'customer';
 diststyle | sortkey1 | tbl_rows | unsorted 
-----------+----------+----------+----------
 EVEN      | c_nation |  3000000 |     0.00
(1 row)
  • KEY分散に変更
dev=# alter table public.customer alter diststyle key distkey c_custkey;
  • ANALYZE する
dev=# set analyze_threshold_percent to 0;
dev=# analyze public.customer;
  • svv_table_info 取得
dev=# select diststyle, sortkey1, tbl_rows, unsorted from svv_table_info where schema = 'public' and "table" = 'customer';
   diststyle    | sortkey1 | tbl_rows | unsorted 
----------------+----------+----------+----------
 KEY(c_custkey) | c_nation |  3000000 |     0.00
(1 row)

KEY分散->EVEN分散に変更した場合

  • EVEN分散に変更
dev=# alter table public.customer alter diststyle even;
  • ANALYZE する。
dev=# set analyze_threshold_percent to 0;
dev=# analyze public.customer;
  • ソートキーでソートされているか確認する
dev=# select diststyle, sortkey1, tbl_rows, unsorted from svv_table_info where schema = 'public' and "table" = 'customer';
 diststyle | sortkey1 | tbl_rows | unsorted 
-----------+----------+----------+----------
 EVEN      | c_nation |  3000000 |     0.00
(1 row)

KEY分散->ALL分散に変更した場合

  • KEY分散に変更
dev=# alter table public.customer alter diststyle key distkey c_custkey;
  • ALL分散に変更
dev=# alter table public.customer alter diststyle all;
  • ANALYZE する
dev=# set analyze_threshold_percent to 0;
dev=# analyze public.customer;
  • ソートキーでソートされているか確認する
dev=# select diststyle, sortkey1, tbl_rows, unsorted from svv_table_info where schema = 'public' and "table" = 'customer';
 diststyle | sortkey1 | tbl_rows | unsorted 
-----------+----------+----------+----------
 ALL       | c_nation |  3000000 |     0.00
(1 row)

EVEN分散->ALL分散に変更した場合

  • EVEN分散に変更
dev=# alter table public.customer alter diststyle even;
  • ALL分散に変更
dev=# alter table public.customer alter diststyle all;
  • ANALYZE する
dev=# set analyze_threshold_percent to 0;
dev=# analyze public.customer;
  • ソートキーでソートされているか確認する
dev=# select diststyle, sortkey1, tbl_rows, unsorted from svv_table_info where schema = 'public' and "table" = 'customer';
 diststyle | sortkey1 | tbl_rows | unsorted 
-----------+----------+----------+----------
 ALL       | c_nation |  3000000 |     0.00
(1 row)

環境

  • ra3.4xlarge 2 ノード
  • バージョン
dev=# select version();
                                                          version                                                          
---------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.38698
(1 row)

Redshift で SPLIT_TO_ARRAY 関数でデリミタ区切りのリストを横縦変換する

  • テーブルのフィールドにカンマ区切りのデータを登録する。
dev=# create table pivot_test (id int, txt varchar);
CREATE TABLE
dev=# insert into pivot_test values (1,'AZ, Sidmar,1'),(2,'Kaihatsu,Suarez,9'),(3,'Azuma,Neymar,11'),(4,'OZ,Iniesta,8');
INSERT 0 4
dev=# select * from pivot_test;
 id | txt
----+-------------------
 1  | AZ, Sidmar,1
 2  | Kaihatsu,Suarez,9
 3  | Azuma,Neymar,11
 4  | OZ,Iniesta,8

  • Using SPLIT_TO_ARRAY to change one varchar column to array
 dev=# select id,SPLIT_TO_ARRAY(txt,',') array from pivot_test;
 id |           array           
----+---------------------------
  1 | ["AZ","Sidmar","1"]
  2 | ["Kaihatsu","Suarez","9"]
  3 | ["Azuma","Neymar","11"]
  4 | ["OZ","Iniesta","8"]
(4 rows)
  • Using UNNEST
dev=# select sub_query.id, split_array from (select id,SPLIT_TO_ARRAY(txt,',') array from pivot_test) sub_query, sub_query.array split_array;
 id | split_array 
----+-------------
  1 | "AZ"
  1 | "Sidmar"
  1 | "1"
  2 | "Kaihatsu"
  2 | "Suarez"
  2 | "9"
  3 | "Azuma"
  3 | "Neymar"
  3 | "11"
  4 | "OZ"
  4 | "Iniesta"
  4 | "8"
(12 rows)

Redsfhit でどのグループにユーザーが所属しているか確認する

  • クエリ
select pg_user.usename, pg_user.usesysid, pg_group.groname, pg_group.grolist from pg_user,pg_group;
  • 実行結果
           usename            | usesysid |          groname           | grolist 
------------------------------+----------+----------------------------+---------
 rdsdb                        |        1 | dwh_batch_group            | {136}
 awsuser                      |      100 | dwh_batch_group            | {136}
 dwh_batch_user_01            |      136 | dwh_batch_group            | {136}
 short_dwh_tools_user_01      |      137 | dwh_batch_group            | {136}
 short_users_l1_user_01       |      138 | dwh_batch_group            | {136}
 short_users_l2_user_01       |      139 | dwh_batch_group            | {136}
 short_application_l2_user_01 |      140 | dwh_batch_group            | {136}
 rdsdb                        |        1 | short_dwh_tools_group      | {137}
 awsuser                      |      100 | short_dwh_tools_group      | {137}
 dwh_batch_user_01            |      136 | short_dwh_tools_group      | {137}
 short_dwh_tools_user_01      |      137 | short_dwh_tools_group      | {137}
 short_users_l1_user_01       |      138 | short_dwh_tools_group      | {137}
 short_users_l2_user_01       |      139 | short_dwh_tools_group      | {137}
 short_application_l2_user_01 |      140 | short_dwh_tools_group      | {137}
 rdsdb                        |        1 | short_users_l1_group       | {138}
 awsuser                      |      100 | short_users_l1_group       | {138}
 dwh_batch_user_01            |      136 | short_users_l1_group       | {138}
 short_dwh_tools_user_01      |      137 | short_users_l1_group       | {138}
 short_users_l1_user_01       |      138 | short_users_l1_group       | {138}
 short_users_l2_user_01       |      139 | short_users_l1_group       | {138}
 short_application_l2_user_01 |      140 | short_users_l1_group       | {138}
 rdsdb                        |        1 | short_users_l2_group       | {139}
 awsuser                      |      100 | short_users_l2_group       | {139}
 dwh_batch_user_01            |      136 | short_users_l2_group       | {139}
 short_dwh_tools_user_01      |      137 | short_users_l2_group       | {139}
 short_users_l1_user_01       |      138 | short_users_l2_group       | {139}
 short_users_l2_user_01       |      139 | short_users_l2_group       | {139}
 short_application_l2_user_01 |      140 | short_users_l2_group       | {139}
 rdsdb                        |        1 | short_application_l2_group | {140}
 awsuser                      |      100 | short_application_l2_group | {140}
 dwh_batch_user_01            |      136 | short_application_l2_group | {140}
 short_dwh_tools_user_01      |      137 | short_application_l2_group | {140}
 short_users_l1_user_01       |      138 | short_application_l2_group | {140}
 short_users_l2_user_01       |      139 | short_application_l2_group | {140}
 short_application_l2_user_01 |      140 | short_application_l2_group | {140}
(35 rows)

AWS CLI v2 のページャーを無効化する

Config で設定

恒久的にページ分割を無効化したい場合は、~/.aws/config ファイルに以下のように書きます。

  • ~/.aws/config
[default]
cli_pager=
export コマンドで設定

一時的にページ分割を無効化したい場合は、export や setx コマンドで以下のように設定します。

$ export AWS_PAGER="
Windows
C:\> setx AWS_PAGER “"
AWS CLI v2 でページ分割(less)を無効化できることを最近知った件 | DevelopersIO

Redshift のパラメータグループを AWS CLI で設定する

  • マネコンでパラメータグループやワークロード設定を行う。
  • 設定したパラメータを表示する
% aws redshift describe-cluster-parameters --parameter-group-name poc-auto-wlm
(中略)
        {
            "ParameterName": "max_concurrency_scaling_clusters",
            "ParameterValue": "3",
            "Description": "The maximum concurrency scaling clusters can be used.",
            "Source": "user",
            "DataType": "integer",
            "AllowedValues": "0-10",
            "ApplyType": "static",
            "IsModifiable": true
        },
(中略)
        {
            "ParameterName": "wlm_json_configuration",
            "ParameterValue": "[{\"user_group\":[\"dwh_batch_group\"],\"query_group\":[],\"auto_wlm\":true,\"queue_type\":\"auto\",\"name\":\"main_queue\",\"concurrency_scaling\":\"off\",\"priority\":\"high\",\"rules\":[{\"rule_name\":\"long_query_main_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":10800}],\"action\":\"abort\"},{\"rule_name\":\"temp_usage_main_queue\",\"predicate\":[{\"metric_name\":\"query_blocks_read\",\"operator\":\">\",\"value\":5120}],\"action\":\"abort\"}]},{\"user_group\":[\"short_dwh_tools_group\",\"short_users_L2_group\",\"short_application_L2_group\"],\"query_group\":[],\"auto_wlm\":true,\"queue_type\":\"auto\",\"name\":\"dwh_tool_queue\",\"rules\":[{\"rule_name\":\"long_query_dwh_tool_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":10800}],\"action\":\"abort\"},{\"rule_name\":\"temp_usage_dwh_tool_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":5120}],\"action\":\"abort\"}]},{\"user_group\":[\"short_users_L1_group\"],\"query_group\":[],\"auto_wlm\":true,\"queue_type\":\"auto\",\"name\":\"user_queue\",\"concurrency_scaling\":\"off\",\"priority\":\"low\",\"rules\":[{\"rule_name\":\"long_query_user_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":10800}],\"action\":\"abort\"},{\"rule_name\":\"temp_usage_user_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":5120}],\"action\":\"abort\"}]},{\"auto_wlm\":true,\"user_group\":[],\"query_group\":[],\"name\":\"Default queue\",\"concurrency_scaling\":\"off\",\"rules\":[{\"rule_name\":\"long_query_default_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":10800}],\"action\":\"abort\"},{\"rule_name\":\"temp_usage_default_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":5120}],\"action\":\"abort\"}]},{\"short_query_queue\":true}]",
            "Description": "wlm json configuration",
            "Source": "user",
            "DataType": "string",
            "ApplyType": "dynamic",
            "IsModifiable": true
        }
    ]
}
  • 設定したいパラメータ設定をコピーしてパラメータを JSON で定義する
    • redshift_parameter-group_config.json
[
  {
    "ParameterName": "max_concurrency_scaling_clusters",
    "ParameterValue": "3"
  },
  {
    "ParameterName": "wlm_json_configuration",
    "ParameterValue": "[{\"user_group\":[\"dwh_batch_group\"],\"query_group\":[],\"auto_wlm\":true,\"queue_type\":\"auto\",\"name\":\"main_queue\",\"concurrency_scaling\":\"off\",\"priority\":\"high\",\"rules\":[{\"rule_name\":\"long_query_main_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":10800}],\"action\":\"abort\"},{\"rule_name\":\"temp_usage_main_queue\",\"predicate\":[{\"metric_name\":\"query_blocks_read\",\"operator\":\">\",\"value\":5120}],\"action\":\"abort\"}]},{\"user_group\":[\"short_dwh_tools_group\",\"short_users_L2_group\",\"short_application_L2_group\"],\"query_group\":[],\"auto_wlm\":true,\"queue_type\":\"auto\",\"name\":\"dwh_tool_queue\",\"rules\":[{\"rule_name\":\"long_query_dwh_tool_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":10800}],\"action\":\"abort\"},{\"rule_name\":\"temp_usage_dwh_tool_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":5120}],\"action\":\"abort\"}]},{\"user_group\":[\"short_users_L1_group\"],\"query_group\":[],\"auto_wlm\":true,\"queue_type\":\"auto\",\"name\":\"user_queue\",\"concurrency_scaling\":\"off\",\"priority\":\"low\",\"rules\":[{\"rule_name\":\"long_query_user_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":10800}],\"action\":\"abort\"},{\"rule_name\":\"temp_usage_user_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":5120}],\"action\":\"abort\"}]},{\"auto_wlm\":true,\"user_group\":[],\"query_group\":[],\"name\":\"Default queue\",\"concurrency_scaling\":\"off\",\"rules\":[{\"rule_name\":\"long_query_default_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":10800}],\"action\":\"abort\"},{\"rule_name\":\"temp_usage_default_queue\",\"predicate\":[{\"metric_name\":\"query_execution_time\",\"operator\":\">\",\"value\":5120}],\"action\":\"abort\"}]},{\"short_query_queue\":true}]"
  }
]
  • AWS CLI でパラメータグループを作成する。
# パラメータグループを作成する
$ aws redshift create-cluster-parameter-group --parameter-group-name poc-auto-wlm --parameter-group-family redshift-1.0 --description desc-poc-auto-wlm
# JSON の定義を設定する
$ aws redshift modify-cluster-parameter-group --parameter-group-name poc-auto-wlm --parameters file://redshift_parameter-group_config.json
# クラスターにパラメータグループをアタッチする
$ aws redshift  modify-cluster --cluster-identifier redshift-cluster-poc-2 --cluster-parameter-group-name poc-auto-wlm
# クラスターを再起動する
$ aws redshift reboot-cluster --cluster-identifier redshift-cluster-poc-2
  • AWS CLI でパラメータグループを削除する。
# クラスターのパラメータグループの設定をデフォルトに戻す
$ aws redshift  modify-cluster --cluster-identifier redshift-cluster-poc-2 --cluster-parameter-group-name default.redshift-1.0
# パラメータグループを削除する
$ aws redshift delete-cluster-parameter-group --parameter-group-name poc-auto-wlm
# クラスターを再起動する
$ aws redshift reboot-cluster --cluster-identifier redshift-cluster-poc-2

git rm で fatal: pathspec did not match any files と怒られる

事象

git rm でファイルを削除しようとすると、"fatal: pathspec 'ファイルパス' did not match any files" と怒られる。

% git rm ./.DS_Store    
fatal: pathspec './.DS_Store' did not match any files

原因

  • Gitに登録していないファイルのため。普通にファイルを削除すればよい。
% rm .DS_Store
  • そもそも、.DS_Store など git に登録したくないファイルはリポジトリの root ディレクトリに .gitignore を置いて無視するファイルを記述すればよい。
% cat .gitignore 
# Mac
.DS_Store
.AppleDouble
.LSOverride

参考

これはGitに登録していないファイルがあると出るらしいです。
どうやら --ignore-unmatch をつけると、Gitに登録していないファイルを無視して削除してくれるみたいです。

git rm で fatal: pathspec did not match any filesが出るときの解決方法 - Qiita

GitHub から clone しようとすると、"Permission denied (publickey). fatal: Could not read from remote repository." と怒られる

事象

  • GitHub から clone しようとすると、"Permission denied (publickey). fatal: Could not read from remote repository." と怒られる。
% git clone git@github.com:yoheia/redshift_concurrent_query_executer.git
Cloning into 'redshift_concurrent_query_executer'...
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

原因

  • マシンをリプレースして、~/.ssh/config に以下を書いてなかった。
Host github.com
  User git
  Port 22
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
  • GitHubSSH の Public Key を登録してなかった。
    • ~/.ssh/id_rsa.pub の ssh-rsa から メールアドレスより前までを登録してなかった。