ビッグデータアナリティクス - 第3回: 分散処理...

32
ビッグデータアナリティクス 3 : 分散処理と Apache Spark 鈴木 優 2017 10 20 鈴木 優 ビッグデータアナリティクス 2017 10 20 1 / 32

Upload: others

Post on 24-May-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

ビッグデータアナリティクス第 3回: 分散処理と Apache Spark

鈴木 優

2017年 10月 20日

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 1 / 32

Page 2: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

ビッグデータ

大量のデータ地球上に存在するデータ量は 2011年には 1.8ZB,2020年には 35ZBに達する見込み1ZB = 1021 バイト = 1,000,000,000,000 GB

多種のデータWord,Excel の文書,電子メール,ソーシャルメディア,センサデータXML,CSV,JSON,text,. . .

高頻度の更新商品の購買履歴,クレジットカード,銀行の預貯金センサデータ,気象データ,河川の水位観測

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 2 / 32

Page 3: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

データを処理するための戦略

高価なサーバを購入するCPU SPECfp 価格 

Pentium G3420 77.6 8,946円Xeon Gold 6128 1,470 22万円

Xeon Platinum 8180 1,770 130万円

サーバ名 メモリ 価格(本体のみ) PRIMERGY RX1330 64GB 19万円PRIMERGY RX2530 768GB 45万円PRIMERGY RX4770 1536GB 180万円

ディスク規格 容量 価格(1TBあたり) ハードディスク(SATA) 200MB/s 2500円ハードディスク(SAS) 300MB/s 5.1万円

SSD 600MB/s 10万円

価格を上げてもそれに伴う性能を得ることは難しい特にディスクの転送速度,ネットワークの速度は上げることが難しい

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 3 / 32

Page 4: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

一つのサーバで処理を行うことの限界

CPU メモリ ディスク

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 4 / 32

Page 5: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

データを処理するための戦略

小さなデータを処理するためには R や Excel で十分一つのサーバ,一つのメモリで事足りるとき

Excel は最大 105万行くらいしか扱えない今回のデータは 2650万行以上あるので扱えない

データを読み出すだけで 1ヶ月かかるようなデータをどのように扱うのかということは,今後のビッグデータ研究において重要なテーマ

並列計算コモディティサーバ(値段と性能のバランスが一番良いサーバ)を沢山購入,それぞれのサーバにより並列処理最近のスーパーコンピュータは全て並列にサーバが繋がっている

一つひとつのサーバの性能は必ずしも高くない良いところ

値段をかけるだけ得られる性能が増える(スケールする)問題点

並列計算を行うプログラミングは難しいサーバが増えると故障確率も増える

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 5 / 32

Page 6: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

Mapreduce

MapReduceHadoop/Spark における基本的な並列計算の考え方Map: 一つの処理を細かい単位に分割して処理Reduce: Map で行った小さな単位の処理を集約

Hadoop/Spark1.x ではこれらの処理を明示的に書く必要があったSpark 2.x になり,これらの処理はバックグラウンドで実行されるように

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 6 / 32

Page 7: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

Apache Spark の利用

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 7 / 32

Page 8: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

今回のデータ

twitter のデータ (JSON) を用意/project/bigdata-lab/bda/tweet_20171004.json

150GB (10/15現在)

2017.10.4から 2017.10.13までのツイートを収集twitterで投稿されているツイート全体の 1%

特に言語やキーワードなどの指定はしていない

試しに spark を使わずに,何個のツイートがあるか確認

データの中身を見る% time cat /project/bigdata-lab/bda/tweet_20171004.json|wc -l

26511626

cat tweet_20171004.json 0.13s user 46.46s system 4% cpu 18:29.32 total

wc -l 19.21s user 29.22s system 4% cpu 18:29.32 total

環境によるが,18分から 20分ほどかかる.そのほとんどは I/O(データの入出力)に必要な時間.

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 8 / 32

Page 9: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

JSON形式

データを表現する形式として,CSVや XMLと並んでよく使われる形式.元々はJavaScript で用いられていた形式.

データの中身を見る

{"id":915179801954025472, "text":"め も\n 紅 い も タ ル ト と 雪 塩 ち ん す こう","place":null,"lang":"ja"}

次のような形式で書かれている.

データの中身を見る

{キー:値, キー:値, キー:値, キー:値,...}

入れ子にもできる.

データの中身を見る

{キー:値, キー:{キー:{キー:値, キー:値,...}, キー:値,...}}

文字列はダブルクォートで囲まれている.値はそのままデータは一つひとつ改行されている.

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 9 / 32

Page 10: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

まずは簡単な統計処理

このデータには,どのような言語で書かれているのか,という情報が書かれている.

データの中身を見る{...,"lang":"ja",...}

これを集計して,日本語で書かれているツイートは全体の何%なのかを調べたい

”lang”:”ja”が何回出てくるのかを計測(コマンドラインによる方法)% cat /project/bigdata-lab/bda/tweet_20171004.json | grep \"lang\":\"ja\" |wc -l

(数十分かかる)

これを言語の数だけ繰り返すのは大変課題) 好きなプログラミング言語を使って,言語ごとのツイート数を調査してください

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 10 / 32

Page 11: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

Sparkのアーキテクチャ

HDFS Hive

Text CSV JSON

Hadoop

SparkScala, Java, Python, R

MLlib GraphX

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 11 / 32

Page 12: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

Hadoop が利用可能なシステムへログインHadoop と Spark は,bda1node0x (xは 01から 18まで)にインストールされており,どのマシンからでも同じように利用できる.ただし,bda1node01から 04までは管理用サーバのためログインできない.そこで,sshで bda1node05へログインする.

ログイン$ ssh bda1node05

Last login: Mon Oct 16 16:00:40 2017 from mm-dhcp-128-012.naist.jp

2017年 10月 19日 木曜日 12:12:14 JST

[ysuzuki@bda1node05 ~]$

ここには mandara のホームディレクトリが見える.今回利用するデータを準備する.データが大きいので,見るだけ.

データを見る$ cat /project/bigdata-lab/bda/tweet_20171004.json |head

[Tue Oct 03 20:40:40 JST 2017]Establishing connection.

[Tue Oct 03 20:40:42 JST 2017]Connection established.

[Tue Oct 03 20:40:42 JST 2017]Receiving status stream.

{"in_reply_to_status_id_str":null,"in_reply_to_status_id":null,

"created_at":"Tue Oct 03 11:40:42 +0000 2017","in_reply_to

_user_id_str":null,"source":"<a href=\"http://twitter.com/download/andro

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 12 / 32

Page 13: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

HDFS へデータを移動

Hadoop や Spark は,Linux が直接利用しているファイル領域へのアクセスができないため,HDFSと呼ばれるファイル領域へファイルを移動させる必要がある.

HDFSへデータを移動% hadoop fs -put /project/bigdata-lab/bda/tweet_20171004.json

この作業は,ファイルが更新されたときに限って行えば良い.毎回プログラムを動かすたびに行う必要はない.HDFS内にファイルがあるかどうかを確認する.

% hadoop fs -ls -h

Found 4 items

drwx------ - ysuzuki is-staff 0 2017-10-18 09:00 .Trash

drwxr-xr-x - ysuzuki is-staff 0 2017-10-16 18:59 .sparkStaging

drwx------ - ysuzuki is-staff 0 2017-01-02 19:32 .staging

-rw-r--r-- 3 ysuzuki is-staff 152.1 G 2017-10-16 13:42 tweet_20171004

.json

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 13 / 32

Page 14: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

Spark を起動してみようSpark は Scala,Java,Python,R などで利用可能.まずは Python 版で,コマンドラインで利用したい.

spark の起動

% pyspark2 --master yarn (複数のサーバで動作させるとき)% pyspark2 (一つのサーバだけで動作させるとき)% spark2-shell --master yarn (scalaで動作させたいとき)% pyspark2 --driver-memory 16g --executor-memory 16g --master yarn (重たい作業のとき)Welcome to

____ __

/ __/__ ___ _____/ /__

_\ \/ _ \/ _ ‘/ __/ ’_/

/__ / .__/\_,_/_/ /_/\_\ version 2.0.0.cloudera2

/_/

Using Python version 2.6.6 (r266:84292, Aug 18 2016 08:36:59)

SparkSession available as ’spark’.

>>>

http://bda1node03.naist.jp:8088 で他のプロセス状態が分かる鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 14 / 32

Page 15: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

DataFrame

Spark ではデータの塊 (DataFrame) を様々な方法で変換させることによって,必要な情報を取り出す.変換の方法は主に以下の三種類を使う.

列や行の選択 (select,filter,groupBy)

表の結合 (join)

入出力 (read, show)

詳細は https://spark.apache.org/docs/2.0.0/api/python/index.html を参照のこと.バージョンによって内容が変わるので,他のドキュメントを参照するときには,バージョン番号に注意.

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 15 / 32

Page 16: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

データの読み込み

データを読み込む>>> df = spark.read.json("/user/ysuzuki/tweet_20171004.json")

df という変数の中に, tweet_20171004.json の内容が入っている.この中に何個のデータが含まれているのかを数える.

データを数える>>> df.count()

33573798

さきほどのコマンドラインによる方法と比べて,十分速く処理できていることを確認.

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 16 / 32

Page 17: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

言語ごとに何個のツイートがあるか

日本語のツイートは何個あるか.

言語ごとのデータ>>> df.filter("lang=’ja’").count()

6600510

ja の部分を en や esなどに変更することによって,数を数えることはできる.ところが,これは面倒なので,groupBy 関数を使って集約することを考える.

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 17 / 32

Page 18: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

言語ごとに何個のツイートがあるか

言語ごとのデータ>>> df.groupBy("lang").count().sort("count", ascending=False).show()

+----+-------+

|lang| count|

+----+-------+

| en|7057160|

| ja|4458359|

| es|2002657|

| ar|1731097|

| und|1447410|

| ko|1307743|

| pt|1280456|

| th| 759078

...

+----+-------+

only showing top 20 rows

英語で書かれたものは,日本語で書かれたものの倍くらいであることが分かる.

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 18 / 32

Page 19: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

二つのモード

あるデータが与えられたとき,1) それがどのようになっているのかが分からないときと,2) すでにどのような調査を行うべきかが分かっているときがある.

インタラクティブモード今まで行ってきたモード.都度処理されたものに対して処理を適宜追加していく.

バッチモードプログラムで全ての動作を記述し Spark に投入する.

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 19 / 32

Page 20: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

ファイルに書かれたプログラムを実行count.py に次のように書く

count.pyfrom pyspark.sql import SparkSession

spark = SparkSession \

.builder \

.appName("App example") \

.config("master", "yarn") \

.getOrCreate()

df = spark.read.json("tweet_20171004.json")

print df.count()

プログラムを実行する.

count.pyを実行% spark2-submit count.py | tee output.txt

% cat output.txt

33573798

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 20 / 32

Page 21: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

文字カウント

データを数える>>> from pyspark.sql.functions import explode,split

>>> df.filter("lang = ’en’").select("text").distinct()

.select(explode(split(’text’,’ ’))).groupBy("col").count()

.sort("count",ascending=False).show()

+----+-------+

| col| count|

+----+-------+

| RT|1735023|

| the|1218371|

| to|1136336|

| a| 883388|

| I| 737669|

...

| be| 248032|

| me| 239061|

+----+-------+

only showing top 20 rows

ああ

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 21 / 32

Page 22: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

一番ツイートされているテキストは何なのか

データを数える>>> df.groupBy("text").count().show()

+--------------------+-----+

| text|count|

+--------------------+-----+

|Big economic call...| 1|

|@TomiLahren reall...| 1|

|RT @PossumPastor:...| 2|

|RT @dsmesk: ...| 13|

count で順番を変える

>>> df.groupBy("text").count().sort("count",ascending=False).show()

+--------------------+-----+

| text|count|

+--------------------+-----+

|RT @akiko_lawson:...| 4284|

|RT @Kaepernick7: ...| 3747|

|RT @RodriguezDaGo...| 3419|

|RT @TheRealNyha: ...| 3305|

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 22 / 32

Page 23: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

一番ツイートされているテキストは何なのか

テキストを全部表示させるようにする

>>> df.groupBy("text").count().sort("count",ascending=False).show(20,False)

+--------------------------------------------------------------------------------------------------------------------------------------------+-----+

|text |count|

+--------------------------------------------------------------------------------------------------------------------------------------------+-----+

|RT @akiko_lawson: \新発売記念 #Lコロ無料プレゼント /フォロー&リツイートで、10/15まで毎日抽選で【1万名様】に、ほくっとおいしい#Lコロ がその場で当たります (^^)

3日目は 10/13 10:59まで!#ローソン… |4284 |

|RT @Kaepernick7: I appreciate you @Eminem � https://t.co/nwavBwsOkQ |3747 |

どうもローソンのツイートキャンペーンがあったようだ.Eminem へのツイートが多いようだ.

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 23 / 32

Page 24: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

一番ツイートしている人は誰なのか

誰が一番ツイートしているのかを表示させたい.

>>> df.groupBy("user.name").count().sort("count",ascending=False)

.show(20,False)

+----+-----+

|name|count|

+----+-----+

| .|53716|

| |17986|

| |15129|

| -|14615|

| ;|11380|

| ♡|10926|

|ローソン| 9044|

これは不正確なデータ.同じ名前だが違う人の場合,重複してカウントされてしまっている.解決するために,ユーザ IDで集計し直す.

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 24 / 32

Page 25: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

一番ツイートしている人は誰なのか

まずはユーザ IDで集計

>>> a = df.groupBy("user.id").count().sort("count",ascending=False)

>>> a.show()

+------------------+-----+

| id|count|

+------------------+-----+

| 115639376| 9038|

| 4823945834| 3736|

| 1662830792| 3445|

|856385582401966080| 3242|

| 2669983818| 3015|

|796251890908434432| 2663|

| 104120518| 1592|

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 25 / 32

Page 26: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

一番ツイートしている人は誰なのか

ユーザ IDとユーザ名の対応表を作成

>>> b = df.select("user.id","user.name").distinct()

>>> b.show()

+------------------+--------------------+

| id| name|

+------------------+--------------------+

|767396295665299456| ひかり|

|859974072834310144| [6 ] |

| 535819067| Vibes|

| 517553112| Liseth Valencia R.|

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 26 / 32

Page 27: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

一番ツイートしている人は誰なのか

a と b を結合する

>>> c = a.join(b, a.id == b.id,’inner’).select("name","count")

>>> c.show()

+------------------+-----+

| name|count|

+------------------+-----+

| ローソン| 9038|

| McDonalds Japan| 3736|

| | 3445|

| 【公式】きららファンタジア| 3242|

| Test Account1| 3015|

| ネスカフェ (NESCAF É )| 2663|

| アクエリアス| 1592|

| キングスマン| 1496|

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 27 / 32

Page 28: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

条件を指定

text に「選挙」という文字が含まれているツイートだけを抽出

>>> df.where(col(’text’).like("%選挙%")).select(’text’).show()

+--------------------+

| text|

+--------------------+

|選挙で考えてるのは・政策・別の...|

|RT @keigomi29: たら...|

|RT @shunchoukatsu...|

|RT @tkq12: 衆議院選挙の...|

|RT @pentabutabu: ...|

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 28 / 32

Page 29: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

結果を保存する

CSVで保存

>>> c.write.csv("output_csv")

>>> exit

$ hadoop fs -get output_csv

ディレクトリ output_csv の中に全部入っている.これを使って Excel などでグラフにすることが可能.文字コードが utf-8 なので,テキストが入っているときには,なんとかして文字コードを変換しないと Excel で見られない.

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 29 / 32

Page 30: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

演習課題

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 30 / 32

Page 31: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

必須課題

以下の課題,および同様の難易度であると考えられる課題を 3個以上行い,実行に利用したコマンドおよびその結果,考察を述べよ.

「選挙」について書かれているツイートを表示「選挙」について頻繁に書いているユーザ上位 20人を表示最もフォローされているユーザを表示最もツイートされている政党名を 1日ごとに集計して表示県によってツイートされている政党名の違い

なお,選挙に関係させる必要はないし,日本語に限定する必要も無い.この必須課題については,レポートに含めてください.個別に行ってください.

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 31 / 32

Page 32: ビッグデータアナリティクス - 第3回: 分散処理 …...ビッグデータアナリティクス 第3 回: 分散処理とApache Spark 鈴木優 2017 年10 月20 日 鈴木優

発表課題

自由にテーマを考え,Apache Spark を用いて処理を行った結果を提示してください.データは何を使うか自由ですが,元のデータは少なくとも 100GB以上となるようにしてください.提出方法などは,吉野先生担当分で指示します.グループワークです.

鈴木 優 ビッグデータアナリティクス 2017 年 10 月 20 日 32 / 32