こんにちは。GMOアドマーケティングのS.Kと申します。
皆様の職場ではどのタイプのNoSQLデータベースを使っていますか?
今回は私が日々の開発で使用しているHBaseと、
以前開発で使用していたRedisについて紹介させていただきます。
環境
1 2 3 4 5 6 7 8 |
mac OS : capitan 10.11.16 Java : 1.8.0_112 Redis : 3.2.8 (standalone) jedis : 2.9.0 HBase : 1.2.2 (standalone) 開発言語はJava、開発環境はeclipse、ビルドツールはMavenを使います。 Javaとmavenのインストールについては割愛します。 |
I. Redis編
1. Redis
Redisはメモリー上で動作するkey-valueストア(KVS)形式のNoSQLです。
2. Redisのインストール
1 2 3 4 5 6 7 8 9 |
### インストールします。 # brew install redis ### Redisを起動します。 $ redis-server ### ステータスを確認します。 $ redis-cli ping PONG |
3. jedisの追加
JavaでRedisサーバにアクセスするためにはjedisというjarファイルのJavaライブラリーが必要です。
jedisをダウンロードしてjarファイルをライブラリーに追加してください。
Eclipseプロジェクトを選択して「Properties」>「Java Build Path」>「Add JARs」>「jedis-2.X.X.jar」>「OK」を選択します。
4. Java + Redis でhashタイプのデータを操作する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
import java.io.IOException; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.exceptions.JedisException; import java.util.HashMap; import java.util.Map; import java.util.Set; public class Redis { //address of your redis server private static final String redisHost = "localhost"; private static final Integer redisPort = 6379; //the jedis connection pool.. private static Jedis jredis = null; public static void main(String[] args) throws IOException { // redis shell command => 127.0.0.1:6379> redis-cli Jedis jredis = new Jedis(redisHost, redisPort); // putでデータ登録 String key = "gmoadmarketing"; Map<String, String> map = new HashMap<String,String>(); if (jredis.exists(key)) { ; } else { map.put("name", "test"); map.put("domain", "www.gmo-am.jp"); map.put("title", "techblog test"); jredis.hmset(key, map); } // getでデータ取得 try { // 登録されたデータをloopしながら出力 Map<String, String> retrieveMap = jredis.hgetAll(key); for (String keyMap : retrieveMap.keySet()) { System.out.println(keyMap + " : " + retrieveMap.get(keyMap)); } } catch (JedisException e) { System.out.println("error : "+e); } // delでデータ削除 jredis.del(key); } } ### 実行してみるとeclipseのコンソールで下記の情報が出力されます。 name : GMOアドマーケティング title : techblog test domain : www.gmo-am.jp |
II. HBase編
1. HBase
HBaseはHDFS上に構築された列指向分散データベースで、大量のデータに対してスケール可能です。
2. インストール
1 2 3 4 5 6 7 8 9 |
### HBase インストール # brew install hbase ### HBaseを起動します。 $ start-hbase.sh $ hbase shell hbase(main):001:0> version 1.2.2 |
3. pom.xmlの設定
pom.xmlのdependencyにHBaseのバージョン情報を追加する必要があります。
1 2 3 4 5 6 7 8 9 10 |
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-shell</artifactId> <version>1.2.2</version> </dependency> |
4. Java + HBase でデータを操作する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
import java.io.IOException; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; public class Hbase { public static void main(String[] args) throws IOException{ Configuration conf = HBaseConfiguration.create(); HTableDescriptor tableName = new HTableDescriptor("testTable"); HColumnDescriptor columnFamily = new HColumnDescriptor("company"); byte [] byteTestTable = Bytes.toBytes("testTable"); byte [] byteRowKey = Bytes.toBytes("gmoadmarketing"); // テーブルの生成 // hbase shell command => hbase(main):027:0> list HBaseAdmin admin = new HBaseAdmin(conf); tableName.addFamily(columnFamily); // テーブルが存在しない場合生成 if (admin.tableExists(byteTestTable)){ ; } else { admin.createTable(tableName); } byte [] byteTableNmae = tableName.getName(); HTableDescriptor [] tables = admin.listTables(); if (tables.length !=1 && Bytes.equals(byteTableNmae, tables[0].getName())) { throw new IOException("failed create of table"); } // putでデータ登録 // hbase shell command => put 'testTable','gmoadmarketing','company:domain','www.gmo-am.jp' HTable table = new HTable(conf, byteTableNmae); Put p = new Put(byteRowKey); p.add(columnFamily.getName(),Bytes.toBytes("name"),Bytes.toBytes("GMOアドマーケティング")); p.add(columnFamily.getName(),Bytes.toBytes("domain"),Bytes.toBytes("www.gmo-am.jp")); p.add(columnFamily.getName(),Bytes.toBytes("title"),Bytes.toBytes("techblog test")); table.put(p); // getでデータ取得 // hbase shell command => get 'testTable','gmoadmarketing'[,'company:domain'] Get g = new Get(byteRowKey); Result result = table.get(g); System.out.println("Get:" + result); Scan scan = new Scan(); ResultScanner scanner = table.getScanner(scan); try { for (Result scannerResult : scanner) { System.out.println("Scan : "+ scannerResult); } } catch (Exception e) { scanner.close(); } // 値のリストをloopで出力 List<Cell> cells = result.listCells(); for (int i = 0; i < cells.size(); i++) { // 列名を取得 String row = new String(CellUtil.cloneRow(cells.get(i))); System.out.println("rowKey : " + row); // 値を取得 String value = new String(CellUtil.cloneValue(cells.get(i))); System.out.println("value : " + value); } // deleteでデータ削除 Delete d = new Delete(byteRowKey); table.delete(d); // テーブルの削除 // admin.disableTable(byteTableNmae); // admin.deleteTable(byteTableNmae); } } ### 実行してみるとeclipseのコンソールで下記の情報が出力されます。 Get:keyvalues={gmoadmarketing/company:domain/1490530855728/Put/vlen=13/seqid=0, gmoadmarketing/company:name/1490530855728/Put/vlen=30/seqid=0, gmoadmarketing/company:title/1490530855728/Put/vlen=13/seqid=0} Scan : keyvalues={gmoadmarketing/company:domain/1490530855728/Put/vlen=13/seqid=0, gmoadmarketing/company:name/1490530855728/Put/vlen=30/seqid=0, gmoadmarketing/company:title/1490530855728/Put/vlen=13/seqid=0} rowKey : gmoadmarketing value : www.gmo-am.jp rowKey : gmoadmarketing value : GMOアドマーケティング rowKey : gmoadmarketing value : techblog test |
他のKVSデータベース情報は下記のページをご覧ください。
KVS vs RDB
まとめ
今回はRedisとHBaseの接続方法について紹介しました。
Redis・HBase共に簡単に導入できるので、
NoSQLを始める切っ掛けとして、ぜひ試していただければと思います。
今回の記事ではそれぞれの特徴や性能については紹介しませんでしたが、
実際にシステムに導入する際は以下の比較記事を参考にしてみて下さい。
System Properties Comparison HBase vs. Redis