ビッグデータを支える技術

## Hadoop
http://hadoop.apache.org/

>大規模な分散処理を支えるJavaフレームワーク 
HadoopはGoogleのMapReduce、GFS(Google File System)の技術をベースとして作られた 
HadoopではMapReduceはそのまま「MapReduce(Hadoop/MapReduce)」、GFSは「HDFS(Hadoop Distributed File System)」という名前でそれぞれ開発・公開されている

### MapReduce 
  > データを「Map処理」、「Reduce処理」の2つの処理で処理するモデル 

####  以下、Hadoop/MapReduceの機能

  + 複数のマシン上にデータとデータを処理するためのプログラムモジュールを配置し、プログラムを並列実行する  
  + 複数マシン上で分散実行される処理の順序や優先度の制御
  + 障害時の自動リカバリ
  + 処理状況のステータス管理や監視機能
  + 処理全体のパフォーマンスを向上させるための最適化   

### HDFS 
>  データを複数のマシンに分散して保存・管理する仕組み
  ブロックの書き込みを行うと、そのブロックの複製が自動的に作成されるレプリケーション機能を持つ
  「ネームノード」と「データノード」 と呼ばれる2種類のプロセスで構成されている。ネームノードはファイルやディレクトリの管理情報を保持し、データアクセスの制御を行う唯一のマスタープロセスである。データノードは分散処理を行う各マシン上で動作し、ネームノードの制御に従って、実際にブロックの読み込みや書き込み、複製と言ったファイル操作を実行する   

### HBase
> HDFS上の列指向、大規模分散データストア　
HBaseはBigTable論文に従い圧縮、インメモリ処理の機能、および各列ごとにブルームフィルタを持っている。 
HBaseにおけるテーブルはHadoop上のMapReduceジョブの入出力として機能し、Java APIのほか、REST、Avro、ThriftといったゲートウェイAPIを通じアクセスが可能である。

  
#### Hadoop/MapReduceの不得意分野

  * バッチ処理
  * リアルタイム処理

## MapReduceを処理する言語
### Hive
>Hadoop上に構築されたデータウェアハウス構築環境であり、データの集約・問合せ・分析を行う。 
HiveQLというSQLライクな言語でHadoop上のデータを操作できる。

#### Hiveが提供する機能
- 高速化の為のインデックス作成
- 別の種類のストレージタイプ (プレーンテキスト,RCFile,HBaseなど)
- クエリ実行時のセマンティック時間を大幅に短縮するため、メタデータをRDBMSに格納する機能
- Hadoop環境に格納された圧縮データを扱う機能
- 日付型・文字列型を扱ったり他のデータ操作を可能とする組み込みユーザ定義関数(UDF)。組み込み関数で用意されていない機能もユーザが自作UDFを作成することで対応することが可能
- SQLライクなクエリ言語(HiveQL)。内部的にMap/Reduceジョブに変換される

### Pig
>MapReduceのラッパーであり、簡単なデータフローを記述するだけでMap関数とReduce関数に変換し、Hadoop上で分散処理を可能にする

### PigLatin
>データのロードとストア、フィルタリング、結合、ソート、及び集約といった処理フローを記述できる。その記述内容からMap関数やReduce関数に変換し、Hadoop上でデータの分散処理を可能にする。

### Jaql
>JSONデータを処理するためのクエリ言語。MapReduce処理を可能にするための実装が存在する。

## Yarn
>Yet-Another-Resource-Negotiatorの略。任意の分散処理フレームワークやアプリケーションの作成を容易にするフレームワーク。 
汎用的な分散アプリケーションの開発や、そのようなアプリケーションからの(メモリやCPUといった)リソース要求のハンドリング、スケジューリングを行い、実行を監督するためのデーモンとAPIを提供する。

## Spark
> Apache SparkはHadoopを保管して、ビッグデータアプリケーションやバッチ処理・ストリーム処理の統合、迅速な開発を実現し、すべてのデータのインタラクティブ分析を可能にする並列処理フレームワーク。 
RDDという独自のキャッシュ機構を持っていることが特徴で、機械学習のような、特定のデータに対して繰り返しアクセスするような処理に対してはHadoopよりも優れていると謳われている。　
また、Spark Streamingというリアルタイム処理を実現するためのフレームワークも備わっている。

## Zookeeper
> 設定情報や集中管理や名前付け、システムの一部欠損など、分散環境で動作するソフトウェアを運用する上での困難を低減するためのサービス(コーディネーションサービス)を提供する
ZooKeeperのアーキテクチャでは、高可用性を冗長サービスにより提供している。つまり、クライアントはあるZooKeeperノードへの問い合わせが失敗したら、他のノードに問い合わせることができる。 
データの更新は一つのマスターノードだけが行うようになっているので、データがノード間で矛盾した内容になることはない（ただし、最新のデータでない可能性はある）。 
更新を担当するマスターノードが何らかの理由で停止した場合には、各ノード間で選挙を行い、新たな更新ノードが選ばれる。 
ZooKeeperはデータを階層的な名前空間に保存しているが、これはファイルシステムやトライ木のデータ構造によく似ている。クライアントはこのノードに読み書きを行うことによって、設定情報共有などのサービスを提供する。

# CDH
Apach Hadoopを含めた関連プロジェクトを統合したCloudera社が提供するOSSディストリビューション。
http://www.cloudera.co.jp/products-services/cdh/cdh.html

# AWS上で提供されているサービス

## EMR(Elastic Map Reduce)
>AWSとシームレス連動するようにHadoopとその他オープンソースアプリケーションを強化したサービス。 
EC2インスタンスのセットを仮想サーバとして起動するだけで、Hadoopクラスターを稼働させることが出来る。
HiveとPigと統合している。 
S3、DynamoDBおよびApach HBaseとの間でデータを出し入れするためのカスタムライブラリを提供

https://docs.aws.amazon.com/ja_jp/ElasticMapReduce/latest/DeveloperGuide/emr-what-is-emr.html

## Redshift
>Amazon Redshift は高速で管理も万全な、ペタバイト規模のデータウェアハウスサービスです。シンプルで費用対効果の高いサービスを実現し、既存のビジネスインテリジェンスツールを使用して、すべてのデータを効率的に分析できます。Amazon Redshift は数百ギガバイトのデータから 1 ペタバイト以上の規模のデータセットに対して最適化されており、1 テラバイトあたり年間 1,000 USD 以下で運用できます。これは従来型の多くのデータウェアハウスソリューションの 10 分の 1 の費用です。
http://aws.amazon.com/jp/documentation/redshift/

### Redshiftの特徴
- 列指向データベース
- カラム種別ごとの豊富な圧縮エンコード
- MPP(Massively Parallel Processing)
- 簡単にインスタンスを追加

### 他サービスとのRedshiftの使用
- Redshift + S3
- Redshift + DynamoDB
- SSHによるリモートホストからのデータインポート
- DataPiplineを使用したデータのロード自動化


## Kinesis
> 大規模な分散データストリームをリアルタイムで処理するための完全管理型のクラウドベースのサービス
S3、DynamoDB、RedshiftなどさまざまなAWSサービスに容易にデータを送信することが可能。

### メリット
- リアルタイム
- 使いやすさ
- 並列処理
- 伸縮自在性
- 低コスト
- 信頼性

## 参考
- [MapReduceのJava実装Apache Hadoopを使ってみた](http://www.atmarkit.co.jp/ait/articles/0809/29/news129.html)
- [Hive―RDB使いのためのHadoopガイド](http://www.atmarkit.co.jp/ait/articles/0902/27/news129.html)
- [Hadoop Pig の使いどころ](http://tech-sketch.jp/2012/08/hadoop-pig.html)  
- [「Jaql」を使ってMapReduceをより簡単に ](http://codezine.jp/article/detail/5646)  
- [MR2とYARNの手短な解説](http://www.cloudera.co.jp/blog/mr2-and-yarn-briefly-explained.html)
- [Zookeeper](http://www.atmarkit.co.jp/ait/articles/1206/22/news142.html)
- [Spark](http://www.intellilink.co.jp/article/column/bigdata-kk01.html)
- [Amazon Redshiftではじめるビッグデータ処理入門](http://gihyo.jp/dev/serial/01/redshift/0001)
- [Kinesisを試してみる](http://recipe.kc-cloud.jp/archives/5629)