Posted at
AtraeDay 1

Apache Sparkを勉強して分散処理できますよ!って言えるようになる

More than 3 years have passed since last update.


はじめに

そろそろ俺も分散処理かな、と常々考えていたのでこの機会(アドベントカレンダー)にApache Sparkを勉強して、分散処理を始めてみたいと思います。

全4回くらいに分散して進めていきますのでどうぞよろしくおねがいします。


1. お勉強とインストール


Apache Sparkとは


  • 大規模データを分散処理をオンメモリで実現するプラットフォーム


  • 高速 かつ 汎用的 であることを目標に設計されている

  • UC Berkekeyで開発され、今はApacheのトップレベルプロジェクトになっている


  • scala, python, java, SQLのシンプルなAPIを提供している


そもそも分散処理とは


  • ある計算処理をネットワーク接続された複数のコンピュータを用いて同時並列で処理すること

  • ビッグデータを扱う際に、処理時間を短縮するための手法のひとつ

  • 安価なサーバを複数台用意して処理を割り振れるので、費用を抑えることが可能
    − ただし、複雑なプログラミングが必要になる


他の分散処理手法


MapReduce


  • Googleが2004年に発表した独自の分散処理フレームワーク

  • Webサイトの文字列検索や、特定のワードを含むページのリスト作成などに使用

  • 2004年当時で3PB/monthのデータを処理していた


Hadoop


  • Mapreduceの技術理論に、他にゴニョゴニョ付け加えてオープンソース化したもの

  • 分散処理を簡単に実装することが可能にした

  • いま一番使われてる分散処理基盤(多分


HadoopとSparkの違い


  • hadoopはデスクIOを並列化してスループットを高める仕組み

  • そのためIOコストの高い繰り返し処理に弱い

  • リアルタイムでインタラクティブな解析をしたい

このようなニーズの中で、オンメモリでより高速、繰り返し処理などに適したSparkが開発されました参考


HadoopとSparkのすみ分け


  • メモリに載りきるサイズのデータ量を比較的早く処理したいときはSparkが適している

  • それ以上のデータ量で、永続化しつつちょろっとだけ処理したいときはHadoopが適している

  • Hadoopで大雑把に処理したものを、ドリルダウンしてSparkで処理などの共存が一番いい使い方かも??

  • ちなみにデータを保持しない分散処理基盤のStormというものもある(これはまた別の機会に勉強したい


Sparkのインストール to Mac


ダウンロード

スクリーンショット 2015-12-02 1.39.33.png


  • 解凍する

$ tar xzf /download/path/spark-1.5.2.tgz


  • ファイルを移す

$ mv /download/path/spark-1.5.2 /usr/local/share/spark


  • 移動して、起動する

$ cd /usr/local/share/spark

$ bin/spark-shell


  • こんな画面が出たら起動完了

      ____              __

/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 1.5.2
/_/

上記だと、scalaの起動方法だとscalaで書くことになります。

僕はpythonで書きたいので、

$ bbin/pyspark

を使用します。


簡単なテストをしてみる

とりあえずローカル環境で教科書通りに叩いてみた


README.mdファイルをSparkのコレクション(RDD)を作成する

>>> lines = sc.textFile("README.md")

scとはSparkのメイン関数に接続するためのオブジェクトで、SparkContextのことらしいです。

>>> sc

<pyspark.context.SparkContext object at 0x1011f5b90>

Spark上での操作はこのscを通して行われます。

.textFileは外部データをインプットして、RDDを生成するメソッドです。


行数をカウントしてみる

>>> lines.count()

98


一行目を取得してみる

>>> lines.first()

u'# Apache Spark'


  • 特定の文字(Python)を含むRDDを抽出して新たにRDDを作成する

pythonlines = lines.filter(lambda line: "Python" in line)


  • そのRDDの抽出がちゃんとできているか確認する

>>> pythonlines.first()

u'high-level APIs in Scala, Java, Python, and R, and an optimized engine that'


  • データを永続化させる

>>> pythonlines.persist()


Spark上での処理のサイクル

上記を1サイクルと考えると、


  1. 外部のデータを入力してRDDを生成。


  2. filterなどを用いてほしい形に整形したRDDを生成


  3. count()などを用いて出力

  4. 再利用したいデータはpersist()で永続化

  5. 繰り返し

のようにして利用することになりそうです。

Sparkはサーバを増やした状態で上記の様に実行したら勝手に並列処理にしてくれるそうです。簡単!!


おわり

とりあえず、インストール、起動、叩き方、基本的な流れは何となくわかったので次はもっと突っ込んだ使い方に挑戦してみます!!