100日後にエンジニアになるキミ - 87日目 - データベース - Hadoopについて2

昨日までのはこちら

[100日後にエンジニアになるキミ - 76日目 - プログラミング - 機械学習について](https://qiita.com/otupy/items/6a4f960ba4df06e27050)

[100日後にエンジニアになるキミ - 70日目 - プログラミング - スクレイピングについて](https://qiita.com/otupy/items/f53e2e7d16adf80b5acf)

[100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について](https://qiita.com/otupy/items/5828ac7450c5ba8d6931)

[100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1](https://qiita.com/otupy/items/0196897ae4d2134794fa)

[100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて](https://qiita.com/otupy/items/f1a5e81633b868f3b5ed)

[100日後にエンジニアになるキミ - 53日目 - Git - Gitについて](https://qiita.com/otupy/items/0abaad82a7f3fea73f1f)

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)

今回はHadoopの話の続きです。

## Hadoopのおさらい

`Hadoop`はテキスト,画像,ログなどのデータを
高速に処理するオープンソースの`分散処理プラットフォーム`です。

`Hadoop`は複数のマシンで行う分散処理が特徴で
はデータも複数台のマシンに分散させる事で
容易にスケールアウト出来るようになっています。

大規模なデータを複数台のマシンで一斉に処理することで
高速化も実現しています。

雑にいうと、複数台で1つの大きなデータを格納するための
箱を用意した、というようなイメージです。

データを貯めたあとは、そこからうまく取り出さないと
活用することはできません。

### Hadoop上で動くソフトウェア

`Hadoop`は大規模データの分散処理を支えるソフトウェアフレームワークですが
データの取り出しには専用のプログラムを書かないと行けません。

そのため`Hadoop`上で動作するデータの取り出しを簡素にするためのソフトウェアが存在します。

下記のようなものがあります。
`Hive`
`Presto`
`Hbase`

これらを用いるとデータの取り出しが容易になります。

### Hive

![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/f4a1f375-f229-5868-33e8-b5b7b082a91b.png)


`Hive`はMapReduce処理を可能にする分散型SQLクエリエンジンです。
2012年頃は`Hadoop`といえば`hive`でした。

`Hive`はSQLのような構文の`HiveQL`を用いてデータの取得が行える
ビッグデータ処理をより簡単に利用する為のHadoop上で動作するソフトウェアです。

Hadoopそのものはフレームワークにすぎないので
実際にデータを操作する場合はHadoop上のデータ操作を行う
プログラム(アプリケーション)を開発しなければなりませんでした。

データベースマネージメントシステム(DBMS)のようにデータを
取り扱うことができないかという発想の元Facebookによって開発されました。
現在ではApacheプロジェクトの一部として活動が行われています。

HiveQLは一部を除いてほぼSQLのような構文です。

```sql
SELECT
    count(*)
FROM (
    SELECT
        DISTINCT user_id
    FROM
        data
) d
```

**Hiveの特徴**

`Hive`は`Hadoop`上のMapReduceの処理をSQL互換言語で操作を実行できることです。
しかし実際のHive処理の中身は`MapReduce`の処理が動いています。

`Select文`を実行すると、裏で`MapReduce`の処理が走り
分散処理でデータ集計が行われて結果を得ることができます。

そのためMapとReduce処理を計画実行して行うため問い合わせ時間がかなりかかります。
1回の問い合わせで簡単なクエリであっても数分かかることはザラです。

大規模なデータであっても集計結果を得ることができますが
小規模の結果を何度も出すような用途にはあまり向いていません。

1日に数回だけ行われるような大規模バッチ処理の際にはよく用いられています。

### Presto

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/9116ba5e-2795-3821-7e48-1ec734c7c454.png)

こちらもFacebookが開発している分散型SQLクエリエンジンです。
`Hive`は何度もクエリを発行するのには向いていません。
そのため、よりインタラクティブにクエリを発行できる仕組みが考え出されました。

**Prestoの特徴**

なんと言っても`Presto`は`Hive`に比べて結果が帰ってくるのが圧倒的に早いです。
遅くても数分、早ければ数秒という時もあります。

`Presto`はクエリ実行の際、ジョブをタスク分割し、タスクを並行して処理します。
中間データをメモリに持つことで高速になり、素早いレスポンスを得ることが可能となっていますが
メモリにデータが乗り切らない場合は失敗します。

そのため`Hive`との使い分けが重要になってきます。。

**Presto**
長くても2~3分で終わる集計の場合
コンパクトな処理をすばやく実行したい場合
結果セットが少なく収まる場合

**Hive**
数分以上〜数時間掛かる巨大なクエリの場合
メモリに乗り切らないオーダーの処理の場合
JOIN数が多い、JOINの条件が文字列の場合
結果セットが数百万行、文字列型カラム多数の場合

このようになっており、うまく使い分けることで
ビッグデータ集計の高速化を図ることができます

データベースサービスの１つである`TresureData`は裏側ではHadoopが用いられており
データ投入後`Hive`と`Presto`を使い分けてデータ集計が行えます。

### Hbase

![download-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/66206908-a3a2-17cf-0881-d7fb9b166032.png)


HbaseはHadoop上で動く列指向の分散型データベースです。

かなり昔ですがFacebookが導入しているという記事がありました。

[FacebookがHBaseを大規模リアルタイム処理に利用している理由](https://www.publickey1.jp/blog/11/facebookhbase.html)

行指向データベースは行単位でデータを保持、取り出しを行います。
列指向データベースは列単位でデータを取得，取り出しを行います。

**Hbaseの特徴**

`Hbase`はいわゆる`NoSQL`というものの一つになります。

SQLを用いるRDBMSは高頻度のクエリ発行の用途にはあまり向いていませんが
`Hbase`は高頻度に発生する大量のデータをリアルタイムに格納/参照することが
可能になっています。

自分が利用していた際は秒間数千件のR/Wを実現していました。

例えばユーザーがログインする際にSQL文を発行して３分待ち・・・ようやくログイン
そんなサービスはいやですよね。

高頻度、大量のデータをいかにさばくかという観点になると一般的なRDBでは
難しいところがあります。

必要とされる用途によってデータベースを選定することが必要になってきます。


## まとめ

Hadoop上で稼働するソフトウェアはまだまだたくさんあります。
近年では現役で活躍しているソフトもまだ残っているので
ビッグデータを取り扱うことを検討している場合は
Hadoopと合わせて知識を蓄えておくと良いかもしれません。

君がエンジニアになるまであと13日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython