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

昨日までのはこちら

[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についてです。

## ビッグデータについて

データベースに関する話としては
[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)
でもやっているのですがデータに関する話として
まず`ビッグデータ`という言葉があります。

`ビッグデータ`の定義は割と曖昧で、ちょっとでも大きければ`ビッグデータ`とか
言ってしまうメディアもあるようですが
2012年の定義では大体`数10テラバイトから数ペタバイトの範囲`のデータを
`ビッグデータ`というようです。

1TB程度のデータは`ビッグデータ`とは言いません。
このくらいではマシン1台で十分です。

近年ではデータそのものが肥大化し、1つのマシンで取り扱える量を超える
`ビッグデータ`が存在しています。

そうなると、マシンにインストールしたデータベース1つでは足りなくて
何台ものマシンが必要になります。

そんな問題を解決するために出てきたのが大規模なビッグデータを処理するための
プラットフォームです。

### Hadoopの概要

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

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

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

### Hadoop登場の背景

`Hadoop`は、もともとGoogle社が論文として公開した、
Google社内の基盤技術をオープンソースとして実装したものです。
Google社が抱える大量のデータをどう処理するのか
という技術体系の論文が元になっています。

`Google File System(GFS)` : Google社の分散ファイルシステム
`Google MapReduce` : Google社での分散処理技術

`Hadoop`自体はJavaベースで開発されており
今でも開発が進められており、トレードマークはゾウです。

<img width="338" alt="スクリーンショット 2020-06-14 15.29.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/58bc46eb-8386-bd4e-b836-c4adcd33106f.png">

### Hadoopの仕組み

Hadoopは、主に以下の2つの要素から構成されています。
`HDFS` : Hadoop分散ファイルシステム
`Hadoop MapReduce` : 分散処理フレームワークである

**HDFS(Hadoop分散ファイルシステム)**

HDFSではマスターとスレーブ、2つのノードによって構成されます。
`マスターノード:NameNode`
`スレーブノードで:DataNode`

`NameNode`はファイルシステムのメタ情報を管理し
`DataNode`はデータの実体を保存します。 

ファイルを格納する際に一定サイズで分割したデータ(ブロック)
として`DataNode`に保存します。

そして、どこかの`DataNode`が故障してデータが消失しないように
複数の`DataNode`にブロックのレプリカを保存します。
これによりデータの欠損を防ぐ仕組みになっています。

デフォルトではレプリカ数は3なので、2つのサーバーが故障しても
データは消失しない形になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/8437baf2-5bca-189f-4e59-30b4527cbf6e.png)

参考：NTTデータ・分散処理技術「Hadoop」とは
https://oss.nttdata.com/hadoop/hadoop.html

`NameNode`に関しては単一ノードの場合は故障すると使用できなくなりますが
Active-Standby構成にしておくことで冗長化が図れます。

サーバーの台数を増やすことで、データの保存量も増やせます。

**Hadoop MapReduce(分散処理フレームワーク)**

もう一つの構成要素として`MapReduce`があります。
これはデータを分割して並列処理し、より迅速に結果を得るための仕組みです。

MapReduceではマスターとスレーブ、2つのノードによって構成されます。
`マスターノード:JobTracker`
`スレーブノードで: TaskTracker`

`JobTracker`は、MapReduceジョブの管理や`TaskTracker`への
タスクの割り当てとリソース管理を行います。 

`TaskTracker`はタスクの実行を行います。

`TaskTracker`が故障しても、`JobTracker`が
他の`TaskTracker`に同じタスクを割り当て
最初からやり直す必要なく、継続実行が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/e5cfca9c-690a-2a9f-377d-1bc27a07584a.png)

参考：NTTデータ・分散処理技術「Hadoop」とは
https://oss.nttdata.com/hadoop/hadoop.html

`MapReduceアプリケーション`は以下の処理を行なっています。
`ジョブ定義` : mapとreduceを処理するための情報を定義
`map処理` : 入力データに対してキーバリュー形式でデータを意味づけ
`reduce処理` : map処理のキーごとに集約されたデータに対して処理を実行

MapReduceの処理が終わると、最終的な結果が出力されます。
処理を行うサーバーの台数が増えるほど、高速に処理が終わることにもなるので
計算可能な台数が多いと有利になります。


### Hadoopの特徴

主なHadoopの特徴としては以下の3点が挙げられると思います。

**サーバーのスケーラビリティー**
HDFSにより、リソース不足に陥った場合はサーバーを増やすことで
データ容量を確保したり、計算資源を確保できます。

**耐障害性**

一般的に市販されているサーバーにソフトウェアをインストールすれば
Hadoop環境を構築できるため、専用のハードウェアなどは不要になります。
加えてHDFSやTaskTracker等の仕組みにより
数台までであれば故障してもシステムは稼働します。

**処理の柔軟性**

従来型のデータベース等と異なる点は、HDFSにデータを格納する際に
スキーマ定義が不要であるということです。

データを取り出す際に意味づけをすれば良いので
とりあえずデータを格納しておくということができます。

### どういう企業で導入されているのか？

自分がHadoopを知ったのは2012年です。
その当時ではセミナーなどでも取り入れている企業さんはほぼ無く
我々は導入していたので、なかなか珍しい方だったと思います。

台数としてはマスターのネームノードが3台構成
データノードが20台だったかと思います。

データ量は月間で1行100列くらいのログデータが50億行くらいです。

これくらいの規模のデータになると数TBになっていたので
1台では収まりきりませんし、集計時のメモリも足りません。

自分のPCでやったことのある作業のMAXは
200GBくらいのファイルの集計くらいですので
目安としては数TBを超えるデータになったら
分散処理を考えるという感じでしょうか。

このくらいのデータを取り扱っている所は
ほぼほぼ分散処理の基盤を利用していると思います。

ただし、大量のデータを抱えており、かつ`Hadoop`を使いこなせるだけの
人的・金銭的リソースがある企業なら使う価値がありますが
そんなのはごく一部に過ぎないかもしれません。

お金があって、データもある企業でなければ
導入は難しいし、意味がないです。

その昔公表していたところで行くと
`Yahoo`
`サイバーエージェント`
`NTTデータ`
`日立ソリューションズ`
`リクルートテクノロジーズ`

大企業さんばかりですねーー
Hadoopなどの分散処理系の技術を身に付けたい場合は
ここら辺の企業さんで仕事をしないと
身につかないかもしれませんね。

ちなみに、自分は今は1ミリも利用しておりませんwww


## まとめ

分散処理はビッグデータの取り扱いが当たり前になった今では
必要不可欠なものです。

分散処理を世間一般に広めた立役者として
Hadoopというものの存在はかなり大きいと思いますので
知識として是非抑えておきましょう。

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

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

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

Twitter：
https://twitter.com/otupython