Hatena::ブログ(Diary)

ablog このページをアンテナに追加 RSSフィード Twitter

2017-04-27

xen_blkfront.max

4.2 以降のすべての Linux カーネルの場合、st1 ボリュームまたは sc1 ボリュームで最大スループットを得るには、xen_blkfront.max パラメータを 256 に設定することをお勧めします。このパラメータは、OS の起動コマンドラインで設定できます。たとえば、Amazon Linux AMI では、/boot/grub/menu.lst に記述されている GRUB 設定で kernel 行の末尾に追加できます。

Amazon EBS ボリュームのパフォーマンス on Linux インスタンス - Amazon Elastic Compute Cloud

This is obviously a lot of data, so right now in Linux blkback the maximum number of segments per requests is set to 256, and in Linux blkfront the default value is 32 in order to provide a good balance between memory usage and disk throughput. This default number of segments can be tuned with a boot time option, so users have the choice of expanding the number of indirect segments in a request without much fuss, simply add the following option to your guest boot line in order to increase the default number of segments:

Indirect descriptors for Xen PV disks | Xen Project Blog

2017-04-24

pyenv で Python のバージョンを切替えて使う

pyenv を使って複数のバージョンの Pythonインストールして切替える方法をメモ。


pyenv とは

複数バージョンの Pythonインストールしてコマンド一発で使うバージョンを切替えることができるツール。

pyenv lets you easily switch between multiple versions of Python. It's simple, unobtrusive, and follows the UNIX tradition of single-purpose tools that do one thing well.

This project was forked from rbenv and ruby-build, and modified for Python.

f:id:yohei-a:20170424184508p:image

pyenv does...

  • Let you change the global Python version on a per-user basis.
  • Provide support for per-project Python versions.
  • Allow you to override the Python version with an environment variable.
  • Search commands from multiple versions of Python at a time. This may be helpful to test across Python versions with tox.
GitHub - pyenv/pyenv: Simple Python version management

pyenv をインストールする

$ brew install pyenv
  • ~/.zshrc に以下を追記
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
$ source ~/.zshrc

Pythonインストールする

$ pyenv install --list
$ pyenv install 3.5.0
$ pyenv install 2.7.13

バージョンを切替える

pyenv global <バージョン> とすると全体に、pyenv local に<バージョン> するとそのカレントディレクトリに反映される。一度、設定すると永続化される。

$ pyenv versions 
  system
* 2.7.13 (set by /Users/******/.pyenv/version)
  3.5.0
  • 3.5.0 に切替える
$ pyenv global 3.5.0
$ pyenv version
3.5.0 (set by /Users/*******/.pyenv/version)
  • 2.7.13 に切替える
$ pyenv global 2.7.13
$ pyenv version
2.7.13 (set by /Users/******/.pyenv/version)

環境


参考

NoDB: Efficient Query Execution on Raw Data Files

1990年代から産み出されるデータ量は右肩上がりで増えてきたが、分析可能なデータ量は大きく変わっていない。

列指向データベースなどにロードすれば大量データを高速に分析できるが、ロード時間が課題だった。2010年代に入ってDB外の生データ(CSVファイルなど)をロードなしでロード済みに近い性能を出す研究が進んだ。

Oracle Database、PostgreSQLMySQL などではDB外の生ファイルを表として扱う機能はすでに実装されている。

ただの外部表ではなくI/O量削減のため、Selective tokenizing/parsing/tuple formation、Adaptive indexing (positional map)、Tuple caching といった研究がされている。

Redshift Spectrum は Redshift で高度な分析しつつロードしきれない/したくないS3上のデータを Redshift 内のデータと一緒に一つのクエリーだ分析できるようになった。Redshift の成熟した実装を活かしつつ、分析対象データの範囲がS3まで広がった。


PostgreSQL の成熟した実装を活用して Presto にクエリを投げる Tresure Data の Prestogres とアプローチが似ていると思う。

Athena は本格的な DWH というよりは以下のように分析頻度の低いデータをアドホックに分析するユースケースが向き。

サブクエリやJOIN を駆使した複雑なクエリや大量データを長時間処理するには Redshift のほうが向いている。


Q: When should I use Amazon Athena vs. Redshift Spectrum?

Amazon Athena is the simplest way to give any employee the ability to run ad-hoc queries on data in S3. Athena is serverless, so there is no infrastructure to setup or manage, and you can start analyzing your data immediately.

If you have frequently accessed data, that needs to be stored in a consistent, highly structured format, then you should use a data warehouse like Amazon Redshift. This gives you the flexibility to store your structured, frequently accessed data in Amazon Redshift, and use Redshift Spectrum to extend your Amazon Redshift queries out to the entire universe of data in your S3 data lake. This gives you the freedom to store your data where you want, in the format you want, and have it available for processing when you need.

Amazon Redshift FAQs ? Amazon Web Services (AWS)

Q: What is the difference between Amazon Athena, Amazon EMR, and Amazon Redshift?

Query services like Amazon Athena, data warehouses like Amazon Redshift, and sophisticated data processing frameworks like Amazon EMR, all address different needs and use cases. You just need to choose the right tool for the job. Amazon Redshift provides the fastest query performance for enterprise reporting and business intelligence workloads, particularly those involving extremely complex SQL with multiple joins and sub-queries. Amazon EMR makes it simple and cost effective to run highly distributed processing frameworks such as Hadoop, Spark, and Presto when compared to on-premises deployments. Amazon EMR is flexible - you can run custom applications and code, and define specific compute, memory, storage, and application parameters to optimize your analytic requirements. Amazon Athena provides the easiest way to run ad-hoc queries for data in S3 without the need to setup or manage any servers.

Amazon Athena FAQs ? Amazon Web Services (AWS)

参考

2017-04-21

Amazon Redshift の接続数の上限

クラスターに対して同時に可能なユーザー接続の数は 500 です。詳細については、「Amazon Redshift Cluster Management Guide」の「クラスターへの接続」を参照してください。

Amazon Redshift における制限 - Amazon Redshift

2017-04-20

列指向データベースのページのデータ構造

行指向データベースは行単位でページ(Oracle Database でいうデータブロック)にデータを格納しているのに対して、列指向データベースは列ごとにページに格納している。クエリ実行時に結果セットを返す際に列別にバラバラのページに格納されているデータをどうやってタプル(レコード)に復元している*1のかと思ったがやはり行IDのようなものを持っているようだ。

行ID は C-Store では pid、MonetDB では BAT(Binary Association Tables) の oid と呼ばれている。

The Design and Implementation of Modern Column-Oriented Database Systems

f:id:yohei-a:20170420230742p:image:w640

  • NSM(N-ary Storage Model): 行方向でブロック(ページ)にデータを格納する方式
  • DSM(Decomposition Storage Model): 列方向でブロック(ページ)にデータを格納する方式

f:id:yohei-a:20170420233150p:image:w360

C-Store の pid や MonetDB の oid のような ID 以外に Join Index という手法もある。

具体的な実装は C-Store のソースコードで調べることができる。


さらに詳しくは諸橋さんの以下のエントリで紹介されている

VLDB 2009 Tutorial on Column-Stores *1 が表示されたとき、笑ってしまい「わたしの教科書です、教科書」と言ってしまった appengine ja night #21 *2。

Google BigQueryなどの仕組みを知りたいときの列指向データベースの説明に - wmo6hash::blog

この大作スライド参照。


https://www.cs.duke.edu/courses/fall01/cps216/lectures/10-physical.pdf もシンプルで良い資料。

NSM = N-ary Storage Model

DSM = Decomposition Storage Model


補足

C-Store はあのマイケル・ストーンブレーカー教授が産んだ列指向データベースで、商業的にも成功している Vertica(HP社) のルーツです。

ストーンブレーカー教授と一緒にこの論文を書いている Daniel Abadi さんは上の VLDB 2009 Tutorial on Column-Stores を書いているうちの一人でもあり、分かりやすい資料を書かれているので要チェックです。


MonetDB については以下参照


あと、カバリングインデックス(インデックスオンリースキャン)と違うのは以下の点だと思います。


参考

Amazon Aurora に MySQL Client on macOS から接続する

インストール

$ brew install mysql --client-only
  • バージョンを確認する
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.18, for osx10.12 (x86_64) using  EditLine wrapper

Amazon Aurora のインスタンスを起動する


接続してみる

  • Amazon Aurora に接続する
$ mysql -h mydbinstance-cluster.cluster-******.us-east-1.rds.amazonaws.com -u master -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 55
Server version: 5.6.10 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.20 sec)
mysql> create database test;
Query OK, 1 row affected (0.17 sec)


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.16 sec)
mysql> use test;
Database changed
mysql> create table test(col1 int, col2 varchar(255));
Query OK, 0 rows affected (0.18 sec)
mysql> insert into test(col1, col2) values(1, '  Work hard, Have fun, Make History!!  ');
Query OK, 1 row affected (0.17 sec)

mysql> insert into test(col1, col2) values(2, 'Work hard, Have fun, Make History!!');
Query OK, 1 row affected (0.17 sec)
  • insert した行を確認する
mysql> select * from test;
+------+-----------------------------------------+
| col1 | col2                                    |
+------+-----------------------------------------+
|    1 |   Work hard, Have fun, Make History!!   |
|    2 | Work hard, Have fun, Make History!!     |
+------+-----------------------------------------+
2 rows in set (0.17 sec)
  • もう1行 insert して確認してみる
mysql> insert into test(col1, col2) values(1, '  Work hard, Have fun, Make History!!                 ');
Query OK, 1 row affected (0.16 sec)

mysql> select * from test;
+------+--------------------------------------------------------+
| col1 | col2                                                   |
+------+--------------------------------------------------------+
|    1 |   Work hard, Have fun, Make History!!                  |
|    2 | Work hard, Have fun, Make History!!                    |
|    1 |   Work hard, Have fun, Make History!!                  |
+------+--------------------------------------------------------+
3 rows in set (0.18 sec)

参考

Github のリポジトリを削除する方法

f:id:yohei-a:20170420175506p:image:w640

  • リポジトリ名を入力し、"I understand the consequences, delete this repository" をクリック

f:id:yohei-a:20170420175456p:image:w640


参考

git-secrets で Github に AWS の Credential を公開してしまわないようにする

git-secrets というツールで、誤って AWS の Credential を GitHub に公開してしまわないようにする。


$ brew install git-secrets
  • 既存プロジェクトにフックする
$ cd ~/Documents/github/yoheia
$ git secrets --install
&#10003; Installed commit-msg hook to .git/hooks/commit-msg
&#10003; Installed pre-commit hook to .git/hooks/pre-commit
&#10003; Installed prepare-commit-msg hook to .git/hooks/prepare-commit-msg
  • 拒否設定を行う
$ git secrets --register-aws --global
  • 拒否設定を確認する
$ git secrets --list
secrets.providers git secrets --aws-provider
secrets.patterns [A-Z0-9]{20}
secrets.patterns ("|')?(AWS|aws|Aws)?_?(SECRET|secret|Secret)?_?(ACCESS|access|Access)?_?(KEY|key|Key)("|')?\s*(:|=>|=)\s*("|')?[A-Za-z0-9/\+=]{40}("|')?
secrets.patterns ("|')?(AWS|aws|Aws)?_?(ACCOUNT|account|Account)_?(ID|id|Id)?("|')?\s*(:|=>|=)\s*("|')?[0-9]{4}\-?[0-9]{4}\-?[0-9]{4}("|')?
secrets.allowed AKIAIOSFODNN7EXAMPLE
secrets.allowed wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

環境


参考

Amazon Redshift のプライマリキー


主キー制約、一意制約、外部キー制約は違反してもエラーにならないので注意!

CREATE TABLE文で制約の定義は普通にできるのですが、違反しているデータをINSERTしようとしてもエラーにはならずINSERTできてしまいます。なおNOT NULL制約に違反した場合はちゃんとエラーになります。

プライマリキーおよび外部キーの制約の定義 - Amazon Redshift

これからAmazon Redshiftを始める技術者が注意すべき11つのポイント | Developers.IO

一意性、プライマリキー、および外部キーの制約は情報提供のみを目的としており、Amazon Redshift によって強要されることはありません。ただし、プライマリキーと外部キーはプランニング時のヒントとして使用されます。アプリケーションの ETL プロセスまたは他の何らかのプロセスによってこれらのキーの整合性が強要される場合は、これらのキーを宣言する必要があります。

たとえば、クエリプランナーは特定の統計計算でプライマリキーと外部キーを使用して、サブクエリの非相関技術に影響を与える一意性および参照関係を推論したり、多数の結合を指示したり、冗長な結合を回避したりします。

プランナはこれらのキーの関係を活用しますが、Amazon Redshift テーブルのすべてのキーがロード時に有効であることが前提となります。アプリケーションが無効な外部キーまたはプライマリキーを許可する場合、いくつかのクエリが不正な結果を返す可能性があります。たとえば、プライマリキーが一意でない場合、SELECT DISTINCT クエリが重複した行を返すことがあります。有効かどうかわからない場合は、テーブルに対してキーの制約を定義しないでください。一方、有効だとわかっている場合は、プライマリキー、外部キー、および一意性の制約を必ず宣言してください。

Amazon Redshift は、NOT NULL 列の制約を適用します。

制約の定義 - Amazon Redshift

参考

*1:別々のページに格納されているカラムのデータを結合してレコード(タプル)に何をキーに復元するのか?

2017-04-18

AWSコンソールのデフォルトリージョンを設定する

URLパラメータでリージョンを指定すれば良い。以下の例は東京リージョンを指定している。

https://console.aws.amazon.com/console/home?ap-northeast-1#

リージョンリージョンとアベイラビリティーゾーン - Amazon Elastic Compute Cloud で確認できる。


参考

https://console.aws.amazon.com/console/home?region=ap-northeast-1

のようにリージョン指定したブックマークを使っています。別リージョン選択してサインアウトしてからでも、このブックマークからだとサインイン後に意図通り東京リージョンのコンソールが表示されています。

AWS(Amazon Web Services) - AWSデフォルトのリージョンを東京にしたい(29291)|teratail

Mac から Amazon Redshift にコマンドラインツール(psql)で接続する

PostgreSQLインストール

$ brew install postgresql
$ psql --version
postgres (PostgreSQL) 9.6.2

使ってみる

  • 接続する
% psql "host= matrix.***.ap-northeast-1.redshift.amazonaws.com user=neo dbname=zion port=5439"
Password: 
psql (9.6.2, server 8.0.2)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: on)
Type "help" for help.
  • DB一覧を表示する
zion=# \l
                  List of databases
     name     | owner | encoding | access privileges 
--------------+-------+----------+-------------------
 dev          | rdsdb | UNICODE  | 
 padb_harvest | rdsdb | UNICODE  | 
 template0    | rdsdb | UNICODE  | rdsdb=CT/rdsdb
 template1    | rdsdb | UNICODE  | rdsdb=CT/rdsdb
 zion         | neo   | UNICODE  | 
(5 rows)
zion=# \d
         List of relations
 schema |   name    | type  | owner 
--------+-----------+-------+-------
 public | customer  | table | neo
 public | dwdate    | table | neo
 public | lineorder | table | neo
 public | part      | table | neo
 public | supplier  | table | neo
(5 rows)
  • 終了する
zion-# \q

参考