事前準備
CentOS 6 でやります。
- CDH 5 をインストール
- hadoop の立ち上げ
- Spark のインストール、立ち上げ
までやっておきます。
- Spark 用ユーザの作成
shell
$ sudo useradd hoxom_spark
$ sudo usermod -a -G wheel hoxom_spark
$ sudo passwd hoxo_spark
- HDFS 上に作業用フォルダを作成
shell
$ sudo -u hdfs hadoop fs -mkdir -p /user/hoxom_spark
$ sudo -u hdfs hadoop fs -chown hoxom_spark /user/hoxom_spark
- HDFS の作業フォルダにファイルをコピー
shell
$ sudo cp /home/hoxom/tracking_log/tracking.2014-12-02.log.gz /home/hoxom_spark/
$ su - hoxom_spark
$ hadoop fs -put /home/hoxom_spark/tracking.2014-12-02.log.gz /user/hoxom_spark/tracking.2014-12-02.log.gz
$ hadoop fs -ls /user/hoxom_spark # HDFS 上にファイルが存在することを確認
結果
Found 1 items
-rw-r--r-- 1 hoxom_spark supergroup 32438207 2014-12-24 11:40 /user/hoxom_spark/tracking.2014-12-02.log.gz
Spark
参考サイト
- Apache Spark ドキュメント和訳 - Quick Start
- Spark を活用する:ビッグデータアプリケーション用の高速インメモリコンピューティング
- Spark Programming Guide
- RDD Class(RDDクラスのメソッド一覧)
Spark シェルの起動
$ spark-shell
結果
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 1.1.0
/_/
Using Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_65)
Spark context available as sc.
scala>
Spark context オブジェクト sc ができるので、これを使います。
- ファイルの読み込み
Scala
val file = sc.textFile("hdfs://localhost/user/hoxom_spark/tracking.2014-12-02.log.gz")
file.count // 行数を出力
結果
963021
- カラムに分割
Scala
val lines = file.map(_.split("\t"))
lines.count // 行数
lines.first.size // カラム数
結果
963021
9
- スマートフォンからのアクセスのみ抽出
Scala
val sp = lines.filter(_.contains("SP"))
sp.count
結果
402659
- 結果をメモリ上にキャッシュする
Scala
val sp_dm = sp.filter(_(4).startsWith("DM"))
sp_dm.cache()
sp_dm.count
結果
196805
同じ計算をもう一度。
Scala
sp_dm.count
結果
196805
二回目はめっちゃ速い!
- キャッシュから削除
Scala
sp_dm.unpersist()
- 端末ごとの PV を集計
Scala
val pv_by_terminal = lines.map(line => (line(7), 1)).countByKey
pv_by_terminal.foreach(item => println(item._1 + "\t" + item._2))
結果
PC 530430
MB 29932
SP 402659