Sparkについて(Python,Java,JVM,RDD)

#Hadoop,Sparkの分散処理について
* 巨大データの取り扱いを目的とした分散処理のフレームワーク
* 分散処理によってビッグデータを高速に処理することが可能
* Hadoopの利用者は自作したデータ処理のプログラムや他者が開発したツールプログラムをHadoop内に組み込んでビッグデータ処理が可能

##Hadoop上で稼動するデータベースマネージメントシステム(DBMS)
* Hive
* Impala

##Hadoop上で稼動するスクリプト環境
* Pig

Hadoop連携ソフトウェアの存在がビックデータ処理環境をより便利にしている。
**SparkもHadoopと同じく分散処理のフレームワーク**
adoopがJava言語で作られているのに対してSparkはJavaの派生言語であるScalaで作られています。

###Sparkの内部処理方式
* データをメモリに保存することで入出力の高速化を図り処理全体の実行速度を向上させようとする取り組みがある。
* 利用可能メモリが枯渇した場合にはデータをストレージに保存するケースも勘案
* 機械学習の計算処理に効果を発揮する
* 実際特定のアプリケーションに関する実行性能は、HadoopのMapReduce処理と比べた場合の100倍

###「データの格納場所」に関する選択肢の広さ
* Sparkで処理を行うデータは「いろいろな種類のデータ置き場」に格納可能
* Sparkは様々なデータ格納場所からのデータ入出力に対応している

>Hadoopがデータの格納場所として基本的には「Hadoop Distributed File System (HDFS)」という独自のファイル格納場所を必要

* Hadoop Distributed File System (HDFS)
* Cassandra
* OpenStack Swift
* Amazon S3

上記などが対応可能なストレージ

###プログラム手法に関する選択肢の広さ
* Java(直接Hadoopを制御する事からこの方法を生Hadoopと呼んだりします)
* HiveQL(Hadoop+Hive)
* Pig(Hadoop+Pig)
* Hadoop Streamingを使用することで標準入出力を介してPythonなどから制御

>「Hadoopとは別のソフトウェア」を介してプログラミングを行う事が一般的
>SparkはSpark自身はScalaでプログラムされているものの、他のプログラム言語に対してより緊密なアプローチが採用されています。すなわち、Sparkを制御するための機能が、Scalaだけでない。

* Java
* Python
* R言語
* Spark SQL

各プログラム言語用のAPIとして提供されている。

##SparkとHadoopの関係は競合というよりは共存。ユーザには広い選択肢が与えられている
*「Hadoop+Spark」の構成も現実的である(Hadoop内のYarn制御下でSparkを利用する)
* Sparkはデータの入出力場所としてHDFSにも対応している
* 現段階ではSparkとHadoopは共存関係

SparkがHDFS上のデータをその制御の対象としていることは、既存データの再利用性も含めて二者の親和性の高さをより緊密なものにしています。競合関係という意味では「Spark式処理方法とMapReduce式処理方法の競合」という表現が適切

# Apache Sparkについて
* 半構造化データ(https://jp.drinet.co.jp/blog/datamanagement/semi-structured-data)
* 構造化データ
*  ストリーミングデータ
*  機械学習
*  データサイエンス

マスターノード上の１つのドライバプロセス(複数のジョブを持てる)から立ち上げられる。

数多くのワーカーノードに分散配置されたエグゼキュータプロセス(複数タスク)に指示を送る。

・有行非循環グラフ
Sparkはそれらのタスクスケジューリングや実行を最適化する。

# RDD(耐障害性分散データセット)
イミュータブルなJava仮想マシン(JVM)のオブジェクトの分散コレクションを中心として構成されている。
pythonのデータがJVMオブジェクトの中に保存される。
これらのオブジェクトを使うことでいかなるジョブにおいても高速に演算処理可能
RDDはメモリを有効に利用し計算、キャッシュ、保存される。
このおかげで、Apache Hadoopのような他の旧来フレームワークに比べて何桁も演算処理が高速になっている。
### RDDの機能
> map()
> reduce()
> filter() 
...etc

RDDはデータへの変換の適用と記録を並列に行う。そのため、速度も耐障害性も向上している。
変換を登録しておくことでRDDはデータリネージを提供可能。
何か問題が生じて、一部のデータが失われて場合にフォールバックを行います。失われた場合は再計算が可能。

#### RDDの操作
* 変換(新しいRDDポインターを返す。) → 遅延処理
* アクション(演算処理を行い、値をドライバーに返す。)矢印戻り値のこと？

*Sparkの最大の利点は並列に処理が実行されること*

データセットの様子を掴むために分析の際によく使われる手順。
* ある列中に現れるそれぞれの値の登場回数をカウントする。
* Aで始まる値だけを選択する
* その結果を画面に表示させる

データのフォーマットもテキスト、parquet、JSON、Hiveのテーブルといった複数のフォーマットがサポートされている。
リレーショナルデータベースからJDBCドライバを使用してデータを読み取ることが可能。
Sparkは圧縮されたデータセットを自動的に扱える。などほとんどあらゆるものを混在させることが可能。
* スキーマレスなデータ構造(tuple、dict、list)


#### メタデータ
[https://jp.drinet.co.jp/blog/datamanagement/metadata_management_3minutes]
* メタデータとは一言でいうと「データに関するデータ」
* データ：「構造化データ」と「非構造化データ」に分類される。
* 構造化データ：構造化データはデータの内容や形式が定められており、RDBMSで実装
* 非構造化データ：非構造化データは内容や形式に決まりが無く、あらゆるデータが当てはまる。
(映像、音声、テキストデータなども非構造化データ)

# Pysparkでのpythonの使い方
* クラスたモードとローカルモードが存在する。

ローカルモードでの実行
通常のpythonの実行と同じコードでも問題ない。
構造上の変化が生じやすいのは、データとコードが独立したワーカープロセス間でコピーされるようなひねりが加わる場合。

クラスタモードでの実行
ジョブが投入されて実行される時、そのジョブはドライバノードに送られる。
ドライバノードはそのジョブにあるDAGを生成しそれぞれのエグゼキュータノードを決定する。
そして、ドライバはワーカーに対してそれぞれのタスクを実行し、処理が終了すれば結果をドライバに返すよう指示をする。

# RDMSについて
データを管理・活用するためのシステムとして代表的なのがMySQL、OracleなどのRDBMS（リレーショナルデータベース管理システム）です。
RDBMSは複雑なデータをリアルタイムで取り扱える半面、大量のデータ処理に際して能力が低下してしまうという弱点があります。

DBでの処理では追いつかないデータ量を高速処理するために導入された概念が分散処理
複数のサーバーもしくはCPUでデータを分割し、大量のデータを高速で処理できるようにします。たくさんのパソコンが作業を分けあって処理している様子を思い浮かべるとわかりやすい

それがマスターノードとコアノード

分散処理は気象・災害予測や遺伝子解析、SNSのリアルタイム解析、サイトのユーザー行動分析など大量のデータ処理を必要とする作業に用いられます。ビッグデータの取り扱いにおいて分散処理は欠かせない要素であり、昨今その需要は高まり続けています。

分散処理の機能を組み込む際に使えるフレームワークの代表格がHadoopとSpark

# Docker for Jupyternotebook pyspark

https://hub.docker.com/r/jupyter/pyspark-notebook/