Greenplum Database(オープンソース版)使ってみた

早速使ってみました。

インストール時にいろいろ詰まったので、そのメモです。
簡単なクエリを投げるところまで書きました。

# 環境
CentOS 6.5

# ソースコードの入手
githubから入手します。

```
$ git clone https://github.com/greenplum-db/gpdb
```
# コンパイル

## configureスクリプト

```
$ cd gpdb
$ ./configure --prefix=/opt/gp
:
:
checking for curl >= 7.20.0... can't find curl >=7.20.0
configure: error Library requirements (curl) not met.
$
```

curlが古いと怒られたので、http://curl.haxx.se/download.html から新しいバージョンを入手。
解凍してcurlのインストール

```
$ tar zxf curl-7.45.0.tar.bz2
$ cd curl-7.45.0
$ ./configure
$ make
# make install
$ curl --version
curl 7.45.0 (x86_64-pc-linux-gnu) libcurl/7.45.0 OpenSSL/1.0.1e zlib/1.2.3 libidn/1.18
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: IDN IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets
```
再度、configureを実行

```
$ ./configure --prefix=/opt/gp

```

完了！

## make && make install

次はmake。

```
$ make -j 3
:
All of Greenplum Database successfully made. Ready to install.
$
```

makeはすんなり完了。
次はインストール。

```
$ make install
:
./gpMgmt/bin/pythonSrc/ext/ && /bin/tar xzf lockfile-0.9.1.tar.gz
tar (child): lockfile-0.9.1.tar.gz: open 不能: そのようなファイルやディレクトリはありません
tar (child): Error is not recoverable: exiting now
/bin/tar: Child returned status 2
/bin/tar: Error is not recoverable: exiting now
make[2]: *** [lockfile] エラー 2
make[2]: ディレクトリ `/opt/source/gpdb/gpMgmt/bin' から出ます
make[1]: *** [install] エラー 2
make[1]: ディレクトリ `/opt/source//gpdb/gpMgmt' から出ます
make: *** [install] エラー 2
```

`./gpMgmt/bin/pythonSrc/ext/`にlockfile-0.9.1.tar.gzがなくてエラーとなっている。
実はlockfile-0.9.1.tar.gzを準備した後も、他のpythonライブラリがなくて次々に`make install`が失敗した。
`make install`が成功するまでに自分で準備したファイルは以下の通り。

- lockfile-0.9.1.tar.gz
- pychecker-0.8.18.tar.gz
- pycrypto-2.0.1.tar.gz
- unittest2-0.5.1.targz
- PSI-0.3b2.tar.gz
- paramiko-1.7.6.tar.gz

ただし、paramiko-1.7.6.tar.gz→paramiko-1.7.6-9.tar.gz、PSI-0.3b.tar.gz→PSI-0.3b_gp.tar.gzにパッケージ名(解凍後のディレクトリも含む)を変更する必要があった。
もっとスマートにできる方法あると思うので、知っている方がいたら教えて下さい。

これらのパッケージを<src_dir>/gpMgmt/bin/pythonSrc/extに移動して再度実行。

```
$ make install
:
Greenplum Database installation complete.
$
```

無事完了。

# データベースを構築
今回は、http://gpdb.docs.pivotal.io/gs/43/pdf/GPDB43xGettingStarted.pdf を参考に単一サーバに3台(マスタサーバ1台、セグメントサーバ2台)

```
$ /opt/gp
$ mkdir /opt/{gpmaster, gpdata1, gpdata2}
$ source greenplum_path.sh
$ cp docs/cli_help/gpconfigs/*_singlenode .
$ chmod +w *_singlenode
$ vi gpinitsystem_singlenode
ARRAY_NAME="GPDB SINGLENODE" 
MACHINE_LIST_FILE=./hostlist_singlenode
SEG_PREFIX=gpsne
PORT_BASE=40000 
declare -a DATA_DIRECTORY=(/opt/gpdata1 /opt/gpdata2)
MASTER_HOSTNAME=127.0.0.1
MASTER_DIRECTORY=/opt/gpmaster
MASTER_PORT=5432
$ vi hostlist_singlenode
127.0.0.1
$ gpssh-exkeys -h 127.0.0.1
$ gpinitsystem -c gpinisytem_singlenode
:
Continue with Greenplum creation Yy/Nn> y
:
[INFO]:-Database successfully started.
:
$
```

完了

# ちょっと使ってみる
テーブルを作成して、100万件のデータを投入。
(5432ポートでマスタサーバがListenしています)

```
$ psql -d postgres
psql (8.2.15)
Type "help" for help.
=# create table hoge (col1 int, col2 text) distributed by (col1);
=# insert into hoge select generate_series(1, 1000000);
```

次はcount(*)の実行計画を見てみる。

```
                                                                         QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=13623.53..13623.54 rows=1 width=8)
   Rows out:  1 rows with 491 ms to end, start offset by 0.512 ms.
   ->  Gather Motion 2:1  (slice1; segments: 2)  (cost=13623.48..13623.52 rows=1 width=8)
         Rows out:  2 rows at destination with 429 ms to first row, 491 ms to end, start offset by 0.514 ms.
         ->  Aggregate  (cost=13623.48..13623.49 rows=1 width=8)
               Rows out:  Avg 1.0 rows x 2 workers.  Max 1 rows (seg0) with 490 ms to end, start offset by 1.248 ms.
               ->  Seq Scan on hoge  (cost=0.00..11119.18 rows=500859 width=0)
                     Rows out:  Avg 500000.0 rows x 2 workers.  Max 500001 rows (seg0) with 0.056 ms to first row, 382 ms to end, start offset by 1.248 ms.
 Slice statistics:
   (slice0)    Executor memory: 159K bytes.
   (slice1)    Executor memory: 163K bytes avg x 2 workers, 163K bytes max (seg0).
 Statement statistics:
   Memory used: 128000K bytes
 Total runtime: 492.106 ms
(14 rows)

Time: 517.075 ms
```

PostgreSQLと出力が違うのでちゃんとは読めないけど、１つのテーブルを２つのworkerで分散して集計しているっぽい。

メモ終わり。