PC上でメモリ5GBで動く! Netezza Software Emulatorを使ってみた


こんにちわ！石田です。
# Netezza Software Emulatorとは?
IBMのDWH/アナリティクス用アプライアンスであるPDA(PureData for Analytics 旧称 Netezza )はハードウエア・アプライアンスということもあり、実際に触ったことがある方は少ないかも知れません。でも開発やスキルアップ用途にPCで簡単に動かせるNetezza Software Emulatorってのがあるんです。PC上の仮想環境で動くエミュレーターなので製品のような性能は期待できませんが、Windows/Mac/Linuxいずれでも動きますしメモリも5GBしか使いませんので開発用途やスキルアップには十分です。このエミュレーターの情報、英語では色々あるんですが日本語のものがあまり見当たらなかったので2016/1月時点の最新で「使ってみた」しました。ご興味と機会があれば皆様もぜひ触ってみてください。
![NPS_No-0017.png](https://qiita-image-store.s3.amazonaws.com/0/108535/d0815cff-bb28-a616-6be7-15729422ee07.png)
# エミュレーター環境の見え方
左側の図は本来のアプライアンス製品のアーキテクチャーです。MPP層に多数のSPAが配置され、同時並列でスケーラブルに処理を行う「シェアド・ナッシング」型です。今回ご紹介するエミュレーターはこのSPAが1つだけ、のPDAマシンのように見えます。(エミュレータなのでFPGAは存在しませんが)　アプリケーションやSQL的には通常製品と変わりはありません。
![NPS_No-0021.png](https://qiita-image-store.s3.amazonaws.com/0/108535/e3db2b93-0855-d5d3-15cc-57ce7347a939.png)
ハード的には以下のように見えています。

```bash
[nz@netezza ~]$ nzhw show
Description HW ID Location   Role   State  Security
----------- ----- ---------- ------ ------ --------
Rack        1001  rack1      Active Ok     N/A
SPA         1002  spa1       Active Ok     N/A
SPU         1003  spa1.spu1  Active Online N/A
Disk        1004  spa1.disk1 Active Ok     Disabled
Disk        1005  spa1.disk2 Active Ok     Disabled
Disk        1006  spa1.disk3 Active Ok     Disabled
```

# やってみた
## 前提環境
[ここ](https://www.ibm.com/developerworks/community/wikis/home?lang=ja#!/wiki/W4c715f465f89_464f_9fd9_b1d36a3c54f8/page/Requirements%20for%20the%20PureData%20for%20Analytics%20Software%20Emulator%20version%207.2%20or%20newer)に環境の記載がありますが、
![NPS_No-0006.png](https://qiita-image-store.s3.amazonaws.com/0/108535/f1c76949-9275-eba6-cb96-a36de859b682.png)
要は以下の環境が用意できればOKです。(私は会社のノートPCで動かしてます)
- 64ビットマシン
- 最低4コア & IntelVT/AMD-Vがオン
- メモリ最低5GB
- ディスクは導入直後で10GB程度使用
- VMWare WorkstationかVMWare Player
 

## 大まかな手順・流れ

1. VMイメージのダウンロード
2. VMWare上でのNPS起動
3. NPSへのログイン
4. 簡単な操作

- 超便利ツール Aginity Workbench 


## 1. VMイメージのダウンロード
[IBM Netezza Developer Network](https://www-01.ibm.com/marketing/iwm/iwm/web/reg/pick.do?source=swg-im-ibmndn&lang=en_US)にIBMIDでログインします。(
![NPS_No-0000.png](https://qiita-image-store.s3.amazonaws.com/0/108535/451589f3-ad01-7bfd-9662-ca1c7c25648a.png)

「**IBM Netezza Software Emulator for Developers V7.2.1 for Linux w/INZA 3.2.1**」を選択してダウンロードします。 (アナリティクス用のINZAも含まれていますが導入イメージが含まれているだけですので、必要なら別途導入作業が必要です。当記事では利用しません。）

![NPS_No-0001.png](https://qiita-image-store.s3.amazonaws.com/0/108535/191f85cb-d93f-52d2-5c6b-2f208cc64bf1.png)

ダウンロード直前はこんな画面。ダウンロードするovaファイルのサイズは4GBほどです。( Download Directorを選ぶと同時ダウンロードするので速いです）
![NPS_No-0002.png](https://qiita-image-store.s3.amazonaws.com/0/108535/43c34508-0e98-3768-1350-9d5a519e5d61.png)

## 2.VMWare上での起動

ダウンロードしたovaファイルをVMWare workstationから開き、インポートします。
![NPS_No-0003.png](https://qiita-image-store.s3.amazonaws.com/0/108535/f66cc261-e23e-535a-6fc4-d7f3e42de73c.png)

利用許諾に同意
![NPS_No-0004.png](https://qiita-image-store.s3.amazonaws.com/0/108535/34505332-872e-8cd7-eb7c-dfa56a325f02.png)

終わるまで放置
![NPS_No-0005.png](https://qiita-image-store.s3.amazonaws.com/0/108535/2c7137b0-5b2e-f8c3-8def-95f8ab4a9826.png)

インポート完了時点ではディスクは8GB位でした。
![NPS_No-0008.png](https://qiita-image-store.s3.amazonaws.com/0/108535/18ff14f2-cfb2-e58a-143d-af8483accccf.png)


終わったらいよいよ起動ですが、その前に一点確認。VMWareの仮想マシンの設定で4コア以上、かつIntel VT or AMD-V supportが有効になっているか確認してください。(下記はVMWare workstation 10の例)
![NPS_No-0007.png](https://qiita-image-store.s3.amazonaws.com/0/108535/c3897368-b6f4-d3f1-d48a-67e5891103d6.png)

メモリは5GBと設定されていますね。では起動します。
![NPS_No-0009.png](https://qiita-image-store.s3.amazonaws.com/0/108535/e3121a57-338a-56b5-1929-2dfe99200971.png)

RHEL6.4が起動します。
![NPS_No-0010.png](https://qiita-image-store.s3.amazonaws.com/0/108535/6bb16fe7-dd8b-e7da-a68b-81328151c3cd.png)

## 3. NPSへのログイン
ログイン画面が出たら**root/netezza**でログインします。ログインするとNPSのIPアドレスが表示されます。(私の場合はVMWareのNAT設定/DHCPで自動的にIP取得してます)　ちなみに事前に設定されているユーザーidとパスワードは以下の通り。

| host | ユーザー | パスワード |
|:-----------:|:------------:|:------------:|
| OS用 | root | netezza |
| OS用 | nz | nz |
| db | admin | password |

![NPS_No-0018.png](https://qiita-image-store.s3.amazonaws.com/0/108535/eddd85b1-dd06-e570-a4a7-5cd9e99cfe1f.png)

外からアクセスしやすいようにマシン名とIPアドレスをクライアントPCのhostsに登録しておきましょう。PuTTYでも簡単にアクセスできました！
![NPS_No-0016.png](https://qiita-image-store.s3.amazonaws.com/0/108535/98a04c44-94f6-abb8-f2ca-eef96f6b2e96.png)

以上でインストールは終わりです。簡単ですね！


## 4. 簡単な操作
以下、コマンドツール nzsqlを使った基礎の基礎の操作の簡単なご紹介です。利用するユーザーidは **nz** ですので suしてください。

```bash
[root@netezza ~]# su - nz

#############################
# current IP: 192.168.118.139
#############################

[nz@netezza ~]$
```

#### 環境変数の確認
NZ_で始まる環境変数を確認します。NZ_DATABASEでデフォルトのDBを設定しますが、初期状態ではSYSTEMになっています。

```bash
[nz@netezza ~]$ set|grep NZ
NZ_DATABASE=system
NZ_DIR=/nz
NZ_HOST=127.0.0.1
NZ_INITTOPOLOGY_FILE=/nz/nse/initTopology.cfg
NZ_PASSWORD=password
NZ_USER=admin
[nz@netezza ~]$
```
#### nzsqlの起動
```bash
[nz@netezza ~]$ nzsql
Welcome to nzsql, the IBM Netezza SQL interactive terminal.

Type:  \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

SYSTEM.ADMIN(ADMIN)=>

```
#### 操作ヘルプ
```bash

SYSTEM.ADMIN(ADMIN)=> \?
 \a              toggle between unaligned and aligned mode
 \act            show current active sessions
 \c[onnect] [dbname [user] [password]]
                  connect to new database (currently 'SYSTEM')
 \C <title>      HTML table title
 \copy ...       perform SQL COPY with data stream to the client machine
 \d <table>      describe table (or view, index, sequence, synonym)
 \dO <table>     describe table or view in sorted order
 \d{t|v|i|s|e|x} list tables/views/indices/sequences/temp tables/external tables
 \d{m|y}         list materialized views/synonyms
 \dS{t|v|i|s}    list system tables/views/indexes/sequences
 \dM{t|v|i|s}    list system management tables/views/indexes/sequences
 \dp <name>      list user permissions
 \dpu <name>     list permissions granted to a user
 \dpg <name>     list permissions granted to a group
 \dgp <name>     list grant permissions for a user
 \dgpu <name>    list grant permissions granted to a user
 \dgpg <name>    list grant permissions granted to a group
 \d{u|U}         list users/User Groups
 \d{g|G|Gr}      list groups/Group Users/Resource Group Users
 \da[+] [name]   list aggregates, + for additional fields
 \dd [object]    list comment for object
 \df[+] [name]   list functions, + for additional fields
 \dl[+] [name]   list libraries, + for additional fields
 \do             list operators
 \dT             list data types
 \e [file]       edit the current query buffer or [file] with external editor (Not supported on Windows)
 \echo <text>    write text to stdout
 \f <sep>        change field separator
 \g [file]       send query to backend (and results in [file] or |pipe)
 \h [cmd]        help on syntax of sql commands, * for all commands
 \H              toggle HTML mode (currently off)
 \i <file>       read and execute queries from <file>
 \l              list all databases
 \o [file]       send all query results to [file], or |pipe
 \O [filename]   send query output with errors to filename (or |pipe)
 \p              show the content of the current query buffer
 \pset <opt>     set table output  <opt> = {format|border|expanded|fieldsep|
                  null|recordsep|tuples_only|title|tableattr|pager}
 \q              quit nzsql
 \qecho <text>   write text to query output stream (see \o)
 \r              reset (clear) the query buffer
 \s [file]       print history or save it in [file] (Not supported on Windows)
 \set <var> <value>  set internal variable
 \t              show only rows (currently off)
 \time           print time taken by queries
 \T <tags>       HTML table tags
 \unset <var>    unset (delete) internal variable
 \w <file>       write current query buffer to a <file>
 \x              toggle expanded output (currently off)
 \! [cmd]        shell escape or command (Not supported on Windows)
SYSTEM.ADMIN(ADMIN)=>
```
#### データベースのリスト
デフォルトでは SYSTEMとTESTの2つのDBが準備されており、SYSTEMに接続されています。

```bash
SYSTEM.ADMIN(ADMIN)=> \l
List of databases
 DATABASE | OWNER
----------+-------
 SYSTEM   | ADMIN
 TEST     | ADMIN
(2 rows)

SYSTEM.ADMIN(ADMIN)=>
```

#### 特定のデータベースへの接続
```bash
SYSTEM.ADMIN(ADMIN)=> \c TEST
You are now connected to database TEST.
TEST.ADMIN(ADMIN)=>
```
#### データベース内のテーブルのリスト
```bash
TEST.ADMIN(ADMIN)=> \dt
       List of relations
 Schema | Name  | Type  | Owner
--------+-------+-------+-------
 ADMIN  | TEST1 | TABLE | ADMIN
(1 row)

TEST.ADMIN(ADMIN)=>

```
#### テーブルのSELECT
```bash
TEST.ADMIN(ADMIN)=> select * from test1;
 T1 | T5
----+----
(0 rows)

TEST.ADMIN(ADMIN)=>
```
#### データベースの作成
一応SYSTEMに繋ぎなおしてCREATE DATABASE 名前;だけです。簡単ですね！

```bash
TEST.ADMIN(ADMIN)=> \c system
You are now connected to database system.
SYSTEM.ADMIN(ADMIN)=> create database mydb;
CREATE DATABASE
SYSTEM.ADMIN(ADMIN)=> \l
List of databases
 DATABASE | OWNER
----------+-------
 MYDB     | ADMIN
 SYSTEM   | ADMIN
 TEST     | ADMIN
(3 rows)

SYSTEM.ADMIN(ADMIN)=>

```

#### テーブルの作成
```bash
SYSTEM.ADMIN(ADMIN)=> \c mydb
You are now connected to database mydb.
MYDB.ADMIN(ADMIN)=> create table tbl1( col1 char(04), col2 smallint );
CREATE TABLE
MYDB.ADMIN(ADMIN)=>
```
#### データのロード
ロードはnzsqlではなくnzloadコマンドで行います。

```bash
[nz@netezza ~]$ vi data.csv
[nz@netezza ~]$ cat data.csv
aaaa,1
bbbb,2
cccc,3
[nz@netezza ~]$ nzload -db mydb -t tbl1 -df data.csv -delim ','
Load session of table 'TBL1' completed successfully
[nz@netezza ~]$ nzsql -db mydb
Welcome to nzsql, the IBM Netezza SQL interactive terminal.

Type:  \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

MYDB.ADMIN(ADMIN)=> select * from tbl1;
 COL1 | COL2
------+------
 aaaa |    1
 bbbb |    2
 cccc |    3
(3 rows)

MYDB.ADMIN(ADMIN)=>
```

#### NZSQLの終了

```bash
MYDB.ADMIN(ADMIN)-> \q
[nz@netezza ~]$
```

#### 最後にNPS自体を遮断するとき
nzpush完了後に普通にOSをshutdownします。

```bash
[nz@netezza ~]$ nzpush -all power off
Powering off SPUs spu0101 ...Domain spu0101 destroyed

 done.
[nz@netezza ~]$ exit
logout
[root@netezza ~]# shutdown -h now
Broadcast message from root@netezza
        (/dev/pts/0) at 14:40 ...

The system is going down for halt NOW!
[root@netezza ~]#
```

#### (参考) 超便利ツール Aginity Workbench

前述のようにnzsqlからSQLやコマンドをシコシコいれてもいいのですが、開発はやっぱGUIが楽。。そんな方にAginity社が提供するスタンドアロンの無償ツール [Aginity Workbench for IBM Netezza]( http://www.aginity.com/workbench/)をご紹介します。これ、一度使ってみるとわかりますが、かゆいところに手が届く神のようなツールです。最新版ではPDAの新機能であるFluid Queryにまで対応していて、驚きました。(IBMもNetezza用のEclipseプラグインを提供していますが、正直、Aginityを使ったら使う気になりませんね。。）Aginity Workbenchは他にもdashDB, RedShift,Greemplum,ParAccel,Hadoopなどビッグデータ向けDBMSのWorkbenchがあります。Aginityさん、グッジョブ！
ログインします。(OSではなくPDAのデータベースに接続するので admin/passwordで)
![NPS_No-0019.png](https://qiita-image-store.s3.amazonaws.com/0/108535/6e5002c1-85e4-201f-352a-93a72d004768.png)

SQLやデータを操作できるのはこの類のツールでは当然ですが、それ以外にもPDAに特化した開発機能や運用操作がてんこ盛りです。
![NPS_No-0020.png](https://qiita-image-store.s3.amazonaws.com/0/108535/680536fd-e903-36dd-4042-acdfd15308bb.png)


## 参考文献
[IBM PureData-Netezza Developer Network (NDN) - Requirements for the PureData for Analytics Software Emulator version 7.2 or newer](https://www.ibm.com/developerworks/community/wikis/home?lang=ja#!/wiki/W4c715f465f89_464f_9fd9_b1d36a3c54f8/page/Requirements%20for%20the%20PureData%20for%20Analytics%20Software%20Emulator%20version%207.2%20or%20newer)
[12 easy steps to install IBM Netezza Software Emulator for Developers](https://www.linkedin.com/pulse/12-easy-steps-install-ibm-netezza-software-emulator-roman-taluyev)
[NPS 7.2 Knowledge Center](https://www.ibm.com/support/knowledgecenter/SSULQD_7.2.0/com.ibm.nz.welcome.doc/doc/welcome.html)