2013年8月25日 星期日

第一次玩Spark Shark 就上手 - 不負責任效能測試



既然都安裝好了,總是要來比較一下Shark效能,是不是真的如傳說中那麼威~~


孬孬免責聲明:此篇測試不是在很嚴謹的環境,也沒有Fine tune的狀況下做出簡單的測試比較,純粹提供參考,有興趣的人建議還是自行測試~:P

測試的環境:

機器:Dell Power-edge 的機器上開4台VM (每台設定4 core CPU 4G Ram)
環境:
  • CentOS6.4
  • Hadoop CDH4.1.x  (Hive 0.9.0)
  • Spark stand-alone mode

當一切安裝就緒就可以在Master 的UI上看到以下資訊:





測試案例 - 統計銀行用戶年均存款餘額的分佈 


  • 年均存款餘額:從當年度1/1 到結算日每天的存款餘額加起來除以365  (如果當天沒有餘額變更記錄,則以上一次變更餘額為本日餘額)
  • 統計分布,分別以下級距來統計客戶數量:0~10,000、10,000~100,000、100,000~1,000,000、1,000,000~10,000,000

下表欄位意義說明:
  • Record per day 代表一天會有幾筆用戶存款資料變更
  • Days 代表產生幾天份資料
  • Data Size 代表實際產生的 File size
時間則是產出統計結果所需要花的時間









Dataset
Record
pre day
100
1,000
10,000
50,000
100,000
Days
365
365
365
365
365
Data Size
9.2Mb
95Mb
926Mb
4.6G
9.2G
Hive
Sec
73.298
143
700
1184
Dead!
Shark
Sec
37
108
216
2747
Dead!


在一開始資料量小的時候,的確Shark 都比Hive快很多,但是隨著資料量變大,vm的記憶體被吃光光,開始吃到swap時,Shark 的效能就會往下掉,然後我最後側到9.2G的檔案得時候,vm就全部死光光了....Orz...


之後會在想辦法找實體機器(要擁有足夠的記憶體)來測試可能會比較準,另外如果加入YARN或是Mesos可能又會有不同的結果...

而且玩到這裡覺得越來越有趣了,也產生了更多問題需要搞清楚,比如說:

1. worker 之間有無溝通?溝通內容?
2. 詳細了解mesos 的task 如分配工作 (順便了解YARN)
3. 了解Spark 如何切割工作?
4. coarse-grained 是否可以開一個以上的work ?
 

且讓我們繼續看下去~

2013年8月13日 星期二

第一次玩Spark Shark 就上手 - Shark 安裝篇

承接上一篇"第一次玩Spark Shark 就上手 - Spark 安裝篇",接下來要安裝的是Shark,Shark在安裝上就麻煩多了,也有許多地方要注意。

注意事項:

1. Shark 0.7.0 所支援的是Hive 0.9.0 的API和 Metastore Schema,而Hive 0.10.0 不管在API還是Metastore上都有許多改變,所以Shark 0.7.0是無法在運作的,根據社群Mail List 預計在0.8.0才會支援Hive 0.10.0+ 版本  (所以你安裝的環境已經有Hive 而且是0.10.0+ 那就得移除改用0.9.0....)

1-2. 如果使用cloudera 請安裝CDH 4.1.x 版本,裡面使用的Hive 是 0.9.0

2. 如果要把Shark 跑在Spark Cluster上,則每一台Node都要安裝Shark

3. 雖說Shark100%相容Hive,但是其實還是有些地方還不支援或是還沒實作,所以請先參考Compatibility-with-Apache-Hive 這篇文章,像是我就採到下面這個地雷:

如果是跑在Spark Cluster 上面,每次下指令必須先設定mapred.reduce.tasks=number,如果不設定的話跑任何.hql 都會沒有任何結果產生,但是也不會有任何錯誤訊息,最後才在裡面找到原因:
Automatically determine the number of reducers for joins and groupbys: Currently in Shark, you need to control the degree of parallelism post-shuffle using "set mapred.reduce.tasks=[num_tasks];". We are going to add auto-setting of parallelism in the next release.


安裝


0. 安裝Hadoop

話說在上一篇Spark 安裝教學裡面,完全沒有提到要安裝Hadoop,也不一定要安裝,但是在Shark 的Case 建議是一定要安裝Hadoop,因為Shark 使用的是Hive 的 lib ,用的是Hive 的Metastore,所以最簡單的測試方法就是安裝好Hive ,透過 Hive 把資料儲存到 HDFS 以及Metastore,之後再由Shark 存取分析(直接用Hive語法),這樣還可以順便測試Hive和Shark的效能。

所以請各位自行安裝Hadoop(我是用CDH4 安裝YARN,hdfs,map-reduce這樣就夠了...)


1. 下載Shark (裡面會包含已經patch 好的一包Hive)

$ wget http://spark-project.org/download/shark-0.7.0-hadoop2-bin.tgz  # Hadoop 2/CDH4
$ tar xvfz shark-0.7.0-*-bin.tgz
$ mv shark-0.7.0 /usr/lib/
$ ln -s /usr/lib/shark-0.7.0 /usr/lib/shark
$ mv hive-0.9.0-bin /usr/lib
$ ln -s /usr/lib/hive-0.9.0-bin /usr/lib/hive

2. 設定Hive MetaSotre

2-1. 安裝mysql

2-2. 登入mysql 設定metastore schema


mysql> CREATE DATABASE metastore;
mysql> USE metastore;
mysql> SOURCE /usr/lib/hive/scripts/metastore/upgrade/mysql/hive-schema-0.9.0.mysql.sql;
mysql> CREATE USER 'hive'@'lab-hadoop-m1' IDENTIFIED BY 'my password';
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'hive'@'lab-hadoop-m1';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,LOCK TABLES,EXECUTE ON metastore.* TO 'hive'@'lab-hadoop-m1';
mysql> FLUSH PRIVILEGES;
mysql> quit;


3. 設定Hive /usr/lib/hive/conf/hive-site.xml


 

  javax.jdo.option.ConnectionURL
  jdbc:mysql://lab-hadoop-m1/metastore
  JDBC connect string for a JDBC metastore



  javax.jdo.option.ConnectionDriverName
  com.mysql.jdbc.Driver
  Driver class name for a JDBC metastore


  hive.metastore.uris
  thrift://lab-hadoop-m1:9083
  IP address (or fully-qualified domain name) and port of the metastore host




   fs.defaultFS
   hdfs://lab-hadoop-m2.tcloud:8020



    mapred.job.tracker
    lab-hadoop-m2.tcloud:8021


4. 設定Shark設定檔 /usr/lib/shark/conf/shark-env.sh


#!/usr/bin/env bash

# Copyright (C) 2012 The Regents of The University California.
# All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# (Required) Amount of memory used per slave node. This should be in the same
# format as the JVM's -Xmx option, e.g. 300m or 1g.
export SPARK_MEM=1g

# (Required) Set the master program's memory
export SHARK_MASTER_MEM=1g

# (Required) Point to your Scala installation.
export SCALA_HOME=$SCALA_HOME

# (Required) Point to the patched Hive binary distribution
export HIVE_HOME=/usr/lib/hive
# (Optional) Specify the location of Hive's configuration directory. By default,
# it points to $HIVE_HOME/conf
#export HIVE_CONF_DIR="$HIVE_HOME/conf"

# For running Shark in distributed mode, set the following:
export HADOOP_HOME=/usr/lib/hadoop
export SPARK_HOME=/usr/lib/spark
export MASTER=spark://lab-hadoop-m1:7077
#export MESOS_NATIVE_LIBRARY=/usr/local/lib/libmesos.so

# (Optional) Extra classpath
#export SPARK_LIBRARY_PATH=""

# Java options
# On EC2, change the local.dir to /mnt/tmp
SPARK_JAVA_OPTS="-Dspark.local.dir=/tmp "
SPARK_JAVA_OPTS+="-Dspark.kryoserializer.buffer.mb=10 "
SPARK_JAVA_OPTS+="-verbose:gc -XX:-PrintGCDetails -XX:+PrintGCTimeStamps "
export SPARK_JAVA_OPTS


當一切都設定好,在console 下打shark 就可以進入shark shell ~

[root@lab-hadoop-m1 ~]# shark

Starting the Shark Command Line Client
WARNING: org.apache.hadoop.metrics.jvm.EventCounter is deprecated. Please use org.apache.hadoop.log.metrics.EventCounter in all the log4j.properties files.
Logging initialized using configuration in jar:file:/usr/lib/hive-0.9.0-bin/lib/hive-common-0.9.0-amplab-4.jar!/hive-log4j.properties
Hive history file=/tmp/root/hive_job_log_root_201308131708_291740705.txt
shark>


 如果出現這個畫面,應該就代表安裝好了,可以直接下hive的語法操作~

Referecne:
[1] Running Shark on a Cluster

2013年8月12日 星期一

第一次玩Spark Shark 就上手 - Spark安裝篇




Shark 和 Spark 在安裝上充滿了彈性,有很多種組合方式,下圖就是Spark 和 Shark 可以搭配的安裝模式,與種類。

圖片來源:自行整理


Spark 如上圖所示,在運行上有好幾種模式:

1. 分散式模式:


1-1. 架構在Mesos上


而架構在Mesos 上又有分兩種模式:

1-1-1. fine-grained (Default)

根據官網的解釋,在Fine-grained模式下,每一個Spark task 就等於是一個Mesos Task ,所以可以在同一台機器上跑好幾個Spark Task,好處是方便動態調配資源,需要的時候再去啟動一個Task,缺點是啟動每一個Spark Task 會需要額外的資源花費,所以比較不適合需要low-latency 的application(像是互動式query 或是 web request)。


圖片來源:自行整理

1-1-2. coarse-grained

而跑在coarse-grained 模式下,每一台Mesos 所管理的機器上,只會啟動一組Spark Task,整體資源規劃是透過mesos 動態排程(dynamically schedule) 所屬的作小工作"mini-tasks",優點就是啟動每個工作所需的時間較少,但是需要這個Task必須事先就預留起來。 (這應該比較像Hadoop 事先就先規劃好每台機器有幾個 Job Tracker一樣?)



圖片來源:自行整理

1-2. 架構在YARN 上 (實驗性質)


架構再YARN上號稱跟架構再Mesos 上一樣簡單,但是我就沒有特別去研究的,有興趣的可以自行研究。


2. 單機模式


既然是第一次玩Spark 就上手,所以這篇文章會著重在第二種模式,也就是單機模式, 顧名思義不需要架構在Mesos或是YARN 的Cluster 上,也可以單獨運作於Hadoop 之外,單機就可以直接執行運算,在這個模式下就可以直接存取Local Disk 或是Hdfs(透過lib 去存取Hdfs),甚至是S3。不過要澄清一下,所謂的單機模式不代表只能跑一台,他同樣也是可以跑很多台變成Cluster 的形式,唯一的差別就是所有的slave worker 都是由Spark Master所控制(類似coarse-grained mode 每一台機器都預先裝好一組Spark worker)。

所有的Node 都是Master Node 透過ssh在控制,如下圖所示:


圖片來源:自行整理


安裝步驟



Pre-Requirement:

1. 安裝Java (這應該大家都會就跳過了)

2. 安裝Scala  (注意:目前Spark 0.7.3 版限定只能用scala-2.9.3)

# wget http://www.scala-lang.org/files/archive/scala-2.9.3.tgz
# tar xvf scala-2.9.3.tgz
# sudo mv scala-2.9.3 /usr/lib
# sudo ln -s /usr/lib/scala-2.9.3 /usr/lib/scala

設定Path 和 Scala home 編輯 /etc/profile.d/scala.sh

export SCALA_HOME=/usr/lib/scala
export PATH=$PATH:$SCALA_HOME/bin


3. 下載並安裝Spark

# wget http://spark-project.org/download/spark-0.7.3-prebuilt-cdh4.tgz
# tar zxvf spark-0.7.3-prebuilt-cdh4.tgz
# mv spark-0.7.3 /usr/lib/
# ln -s /usr/lib/spark-0.7.3 /usr/lib/spark

編輯~/.bashrc 加入spark home and path

export SPARK_HOME=/usr/lib/scala
export PATH=$PATH:$SPARK_HOME/bin

4.  設定成 Standalone Cluster 模式 (其他台機器也依照前面的三個步驟安裝)

我邊準備了三台VM要用來跑Cluster,分別是lab-hadoop-m1,lab-hadoop-m2,lab-hadoop-m3,預計讓m1 跑Spark Master,由於Spark 會透過ssh 去控制其他台機器,所以建議先設定讓lab-hadoop-m1這台機器不用輸入密碼,改使用private key 的方式登入其他機器。

4-1. 設定Private key 登入設定

使用 ssh-keygen 產生key pair時會詢問你一組密碼(實際上你可以偷懶使用空白密碼),然後再透過ssh-copy-id這個tool 幫你把key 傳到其他台機器

# ssh-keygen -t rsa -f ~/.ssh/id_rsa -b 4096 -C “iamcomment”
# ssh-copy-id -i .ssh/id_rsa.pub root@lab-hadoop-m2
# ssh-copy-id -i .ssh/id_rsa.pub root@lab-hadoop-m3

4-2. 設定slave

編輯/usr/lib/spark/conf/slaves 這個檔案,輸入slave 的ip或是hostname,因為我m1那台機器上也想跑一個spark worker所以我的設定如下:

localhost
lab-hadoop-m1
lab-hadoop-m2

4-3. 設定/usr/lib/spark/conf/spark-env.sh ,根據你的需求去設定裡面的內容,請參考cluster-launch-scriptsconfiguration

#!/usr/bin/env bash

# This file contains environment variables required to run Spark. Copy it as
# spark-env.sh and edit that to configure Spark for your site. At a minimum,
# the following two variables should be set:
# - SCALA_HOME, to point to your Scala installation, or SCALA_LIBRARY_PATH to
#   point to the directory for Scala library JARs (if you install Scala as a
#   Debian or RPM package, these are in a separate path, often /usr/share/java)
# - MESOS_NATIVE_LIBRARY, to point to your libmesos.so if you use Mesos
#
# If using the standalone deploy mode, you can also set variables for it:
# - SPARK_MASTER_IP, to bind the master to a different IP address
# - SPARK_MASTER_PORT / SPARK_MASTER_WEBUI_PORT, to use non-default ports
# - SPARK_WORKER_CORES, to set the number of cores to use on this machine
# - SPARK_WORKER_MEMORY, to set how much memory to use (e.g. 1000m, 2g)
# - SPARK_WORKER_PORT / SPARK_WORKER_WEBUI_PORT
# - SPARK_WORKER_INSTANCES, to set the number of worker instances/processes
#   to be spawned on every slave machine

SPARK_MASTER_WEBUI_PORT=8082
SPARK_WORKER_MEMORY=1g


5. 啟動Spark Cluster

啟動所有Master 和 Slave(Worker)

/usr/lib/spark/bin/spark-all.sh

如果沒有意外,就會看到以下訊息,Master在lab-hadoop-m1啟動,然後Slave 分別在lab-hadoop-m2,lab-hadoop-m3 啟動
starting spark.deploy.master.Master, logging to /usr/lib/spark-0.7.3/bin/../logs/spark-root-spark.deploy.master.Master-1-lab-hadoop-m1.out
Master IP: lab-hadoop-m1
cd /usr/lib/spark-0.7.3/bin/.. ; /usr/lib/spark/bin/start-slave.sh 1 spark://lab-hadoop-m1:7077
localhost: starting spark.deploy.worker.Worker, logging to /usr/lib/spark-0.7.3/bin/../logs/spark-root-spark.deploy.worker.Worker-1-lab-hadoop-m1.out
lab-hadoop-m3: starting spark.deploy.worker.Worker, logging to /usr/lib/spark-0.7.3/bin/../logs/spark-root-spark.deploy.worker.Worker-1-lab-hadoop-m3.out
lab-hadoop-m2: starting spark.deploy.worker.Worker, logging to /usr/lib/spark-0.7.3/bin/../logs/spark-root-spark.deploy.worker.Worker-1-lab-hadoop-m2.out


6. 測試Spark 是否安裝順利

在/usr/lib/spark 裡面執行以下指令

./run spark.examples.SparkLR local[2]


如果有跑出以下結果,代表安裝順利

Final w: (5816.075967498865, 5222.008066011391, 5754.751978607454, 3853.1772062206846, 5593.565827145932, 5282.387874201054, 3662.9216051953435, 4890.78210340607, 4223.371512250292, 5767.368579668863)


7. 檢視Web 管理介面

在瀏覽器輸入lab-hadoop-m1的ip,port 8020,應該就可以看到以下畫面



好Spark 裝好了,接下來就換Shark~

延伸閱讀:

[1] Shark 的實驗筆記

2013年8月8日 星期四

第一次玩Spark Shark 就上手 - 簡介篇

圖片來源:自行整理 (這隻鯊魚看起來比較威~XD)

這次要介紹的就在上一篇 Hadoop / Haddop like framework and ecosystem project 文章中有提到的Shark 和 Spark。

SharkSpark 都是屬於  Berkeley amplab BDAS. the Berkeley Data Analytics Stack  中的子系統,BDAS 的目標就是要打造一套與現有Hadoop 相容,卻又速度更快,更方便使用的系統,然後每一個子系統都可以單獨運作,整個BDAS架構如下圖所示:



BDAS是 Berkeley amplab 負責執行總經費達三千萬美金的龐大計畫(不知道對美國來說算是普通而已?),經費來源一半政府,一半業界 ,預計執行六年,目前已經執行到一半,已經產出相對穩定的專案有三個:
  

Mesos


整個BDAS的最底層用來管理Cluster 的Framework 地位等同於Hadoop2 的 YARN,特色就是可以用來管理各種不同的Cluster 包含Hadoop、Spark、MPI...等。

(目前已經是Apache 的top-level project)

Spark 


有別於Hadoop 的Disk-based MapReduce,Spark 強調的是in-memory cluster computing,號稱比Hadoop快100倍,並且有以下特點:

1. 是以Scala 撰寫 (但是有支援Scala Java 和 Python)
2. 以Resilient Distributed Dataset (RDD) 的方式達到Distributed memory layer for sharing.
3. Compatible with Hadoop Storage API,可以無縫介接Hdfs 、S3...等

(目前還在Apache incubator 階段) 

Shark


架構在Spark之上用來取代Hive ,也號稱比Hive快上30 倍以上,主要的特色就是Compatible with Hive 語法,Shark 可以直接吃Hive 的metastore 資料,也可以直接下HiveQL 去query 資料。


接下來我預計會陸續整理筆記(如果我沒偷懶...)


    PS. 有空可以去看Spark 和Shark 的Source code ...目前市面上聽到新架構新套件他全都用上了akka、spray、netty...等,絕對令人大開眼界...:P


    延伸閱讀:

    [1] An Introduction to the Berkeley Data Analytics Stack (BDAS) Featuring Spark, Spark Streaming, and Shark
    [2] Introduction to Spark, Shark, BDAS and AMPLab
    [3] Transforming Big Data with Spark and Shark - AWS Re:Invent 2012 BDT 305
    [4] Shark: Real-time queries and analytics for big data 
    [5] Spark隨談 (一) - 總體架構