SlideShare a Scribd company logo
classmethod.jp
Run  Spark  on  EMRって  
どんな仕組みになってるの?
AWS勉強会  in  北北海道札幌!  
Developers.IO  Meetup  05
1
2014/06/28 能登  諭
classmethod.jp
2
注意!!!
!
このスライドの内容は現在は一部適切ではない内容になっています。!
!
このスライドの元ネタであるAWSの記事が2014-10-22にアップデートされま
した。!
https://aws.amazon.com/articles/Elastic-MapReduce/4926593393724923!
!
このアップデートでYARNに対応したSparkのBootstrap ActionがAWSより
提供されるようになりました。!
http://blogs.aws.amazon.com/bigdata/post/Tx15AY5C50K70RV/Installing-
Apache-Spark-on-an-Amazon-EMR-Cluster!
!
このスライドはアップデート前のSpark 0.8.1 on Hadoop 1.0.3 (AMI 2.x)に
ついて書かれたものです。Bootstrap Actionの概要を知るにはいいですが、
現状はAWSからYARNに対応したBootstrap Actionが提供されたという部分
が異なりますのでご注意下さいm(_ _)m!
classmethod.jp
自己紹介
• 氏名:能登 諭(のと さとし)!
• Twitter:@n3104!
• 得意分野:Hadoop!
• 好きなAWSサービス:EMR
3
classmethod.jp
4
みなさん、EMR使ってますか?
classmethod.jp
5
私はそろそろ実案件で!
利用することになりそうですw



(前職はCDHをオンプレで

使ってました)

classmethod.jp
EMRとは
• http://aws.amazon.com/jp/elasticmapreduce/!
• 正式名称はAmazon Elastic MapReduce。!
• AWSが提供するHadoopのディストリビューショ
ン。!
• オンプレとの一番の違いは保守が不要な点。!
• 基本的にS3に入出力ファイルを置くことになるため!
• HDFSの障害を考慮しなくてよくなる。!
• 容量制限を気にする必要がなくなる。
6
classmethod.jp
そもそもHadoopとは
• http://hadoop.apache.org/!
• HDFS(分散ファイルシステム)とMapReduce(分
散処理基盤)をコアとするミドルウェア群。!
• 中心はHDFS(分散ファイルシステム)。これがある
おかけでMapReduceで効率的に分散処理ができる。!
• 最近はYARN(次世代MapReduce)が出てきたの
で、MapReduce以外の処理モデルもサポートし、よ
り汎用的な分散処理基盤という位置づけに。
7
classmethod.jp
8
EMRではMapReduce以外にも!
PigやHiveというアプリケーションを!
利用することが出来ます
classmethod.jp
9
classmethod.jp
10
こんな感じでマネジメント!
コンソール上でPigやHiveを!
追加できます
classmethod.jp
11
最初から用意されている!
Additional applications以外にも!
EMRクラスタに任意の!
アプリケーションを!
追加することができます
classmethod.jp
12
具体的には、、
classmethod.jp
13
Q: Hadoop 以外のデータ処理エンジ
ンを使用できますか?!
http://aws.amazon.com/jp/
elasticmapreduce/faqs/
classmethod.jp
14
はい。EMR の一部のお客様は、処理
エンジンとして Spark および Shark
(インメモリ MapReduce およびデー
タウェアハウス)を使用できます。使
用方法については、この記事を参照し
てください。
classmethod.jp
15
Run Spark and Shark on Amazon
Elastic MapReduce!
http://aws.amazon.com/articles/
Elastic-MapReduce/
4926593393724923
classmethod.jp
16
EMR上でSparkとSharkを!
実行する方法についての記事です
classmethod.jp
17
Bootstrap Actionという!
機能を利用してSparkとSharkを!
セットアップしています
classmethod.jp
18
elastic-mapreduce --create --alive --
name "Spark/Shark Cluster" --
bootstrap-action s3://
elasticmapreduce/samples/spark/
0.8.1/install-spark-shark.sh --
bootstrap-name "Spark/Shark" --
instance-type m1.xlarge --instance-
count 3
classmethod.jp
19
classmethod.jp
Sparkとは
• https://spark.apache.org/!
• Hadoopと同じ分散処理基盤。!
• 繰り返し処理とインメモリ処理をサポートするDAG(有向非循環グラフ)
実行エンジン。!
• DAGはDriverプログラムから生成されるのでDAGを直接記述するわけで
はない。!
• RDDs(Resilient Distributed Datasets)というモデルで、DAGの終端か
ら先頭のデータソースに向かってデータを生成していくのが特徴。!
• Hadoopと比べて繰り返し処理が得意で、100倍ぐらい早く処理できる場合
がある。!
• http://dev.classmethod.jp/etc/hadoop-reading-16/ を見れば概ね分かるはずw
20
classmethod.jp
Driverのプログラム
val file = sc.textFile("s3://bigdatademo/sample/wiki/")!
!
val reducedList = file.map(l => l.split(" "))!
! .map(l => (l(1), l(2).toInt)).reduceByKey(_+_, 3)!
!
reducedList.cache!
!
val sortedList = reducedList!
! .map(x => (x._2, x._1)).sortByKey(false).take(50)
21
classmethod.jp
Sharkとは
• http://shark.cs.berkeley.edu/!
• 分散SQLエンジン。!
• HiveをMapReduceではなくSparkで実行でき
るようにしたもの。!
• なのでクエリによってはSpark同様、Hiveより
も100倍ぐらい早く処理できる場合がある。
22
classmethod.jp
23
classmethod.jp
24
これでやっと本日のお題に!
りつきましたw
classmethod.jp
25
Run Spark on EMRって!
どんな仕組みになってるの?
classmethod.jp
26
ちなみに、、
classmethod.jp
27
タイトルからSharkを抜いたのは!
タイトルが長くなるためです。!
他意はありませんw
classmethod.jp
28
ということでBootstrap Actionの!
詳細について見て行きましょう
classmethod.jp
s3://elasticmapreduce/samples/spark/0.8.1/install-spark-shark.sh
• SparkとSharkをEMRクラスタにインストールするためのシェル!
• 最初に必要なソフトウェアをダウンロード&展開!
• 既にセットアップ済みのHadoopの設定ファイルを元にspark-
env.shを生成!
• Sparkで利用するライブラリをコピー!
• Sharkのセットアップ!
• Sparkのデーモンを起動!
• マスターの場合はstart-master.shを実行!
• スレーブの場合はspark-daemon.shを実行
29
classmethod.jp
ソフトウェアのダウンロード&展開
cd /home/hadoop/	
!
##Download Spark EMR	
wget http://bigdatademo.s3.amazonaws.com/0.8.1-dev1/spark-0.8.1-emr.tgz	
##Download Shark	
wget https://github.com/amplab/shark/releases/download/v0.8.1/shark-0.8.1-bin-hadoop1.tgz	
##Download Scala	
wget http://www.scala-lang.org/files/archive/scala-2.9.3.tgz	
##DOwnload hive	
wget https://github.com/amplab/shark/releases/download/v0.8.1/hive-0.9.0-bin.tgz	
!
tar -xvzf scala-2.9.3.tgz	
tar -xvzf spark-0.8.1-emr.tgz 	
tar -xvzf shark-0.8.1-bin-hadoop1.tgz	
tar -xvzf hive-0.9.0-bin.tgz 	
!
ln -sf spark-0.8.1-emr spark	
ln -sf /home/hadoop/shark-0.8.1-bin-hadoop1/ /home/hadoop/shark	
ln -sf /home/hadoop/hive-0.9.0-bin /home/hadoop/hive	
ln -sf /home/hadoop/scala-2.9.3 /home/hadoop/scala	
30
classmethod.jp
spark-env.shの生成とライブラリの追加
MASTER=$(grep -i "job.tracker<" /home/hadoop/conf/mapred-site.xml | grep -o '[0-9]{1,3}.[0-9]{1,3}
.[0-9]{1,3}.[0-9]{1,3}')	
SPACE=$(mount | grep mnt | awk '{print $3"/spark/"}' | xargs | sed 's/ /,/g')	
PUB_HOSTNAME=$(GET http://169.254.169.254/latest/meta-data/public-hostname)	
!
touch /home/hadoop/spark/conf/spark-env.sh	
echo "export SPARK_CLASSPATH=/home/hadoop/spark/jars/*">> /home/hadoop/spark/conf/spark-env.sh	
echo "export SPARK_MASTER_IP=$MASTER">> /home/hadoop/spark/conf/spark-env.sh	
echo "export MASTER=spark://$MASTER:7077" >> /home/hadoop/spark/conf/spark-env.sh	
echo "export SPARK_LIBRARY_PATH=/home/hadoop/native/Linux-amd64-64" >> /home/hadoop/spark/conf/spark-
env.sh	
echo "export SPARK_JAVA_OPTS="-Dspark.local.dir=$SPACE"" >> /home/hadoop/spark/conf/spark-env.sh	
echo "export SPARK_WORKER_DIR=/mnt/var/log/hadoop/userlogs/" >> /home/hadoop/spark/conf/spark-env.sh	
cp /home/hadoop/spark/conf/metrics.properties.aws /home/hadoop/spark/conf/metrics.properties	
!
cp /home/hadoop/lib/gson-* /home/hadoop/spark/jars/	
##cp /home/hadoop/lib/aws-java-sdk-* /home/hadoop/spark/jars/	
cp /home/hadoop/conf/core-site.xml /home/hadoop/spark/conf/	
cp /home/hadoop/lib/EmrMetrics*.jar /home/hadoop/spark/jars/	
cp /home/hadoop/hive/lib/hive-builtins-0.9.0-shark-0.8.1.jar /home/hadoop/spark/jars/	
cp /home/hadoop/hive/lib/hive-exec-0.9.0-shark-0.8.1.jar /home/hadoop/spark/jars/	
cp /home/hadoop/shark/target/scala-2.9.3/shark_2.9.3-0.8.1.jar /home/hadoop/spark/jars/	
31
classmethod.jp
Shark関係のセットアップ
touch /home/hadoop/shark/conf/shark-env.sh	
cp /home/hadoop/lib/gson-* /home/hadoop/shark/lib_managed/jars/	
cp /home/hadoop/lib/aws-java-sdk-* /home/hadoop/shark/lib_managed/jars/	
cp /home/hadoop/lib/EmrMetrics*.jar /home/hadoop/shark/lib_managed/jars/	
cp /home/hadoop/hadoop-core.jar /home/hadoop/shark/lib_managed/jars/org.apache.hadoop/hadoop-core/
hadoop-core-1.0.4.jar 	
cp /home/hadoop/conf/core-site.xml /home/hadoop/hive/conf/	
!
echo "export HIVE_HOME=/home/hadoop/hive/" >> /home/hadoop/shark/conf/shark-env.sh	
echo "export SPARK_HOME=/home/hadoop/spark" >> /home/hadoop/shark/conf/shark-env.sh	
echo "source /home/hadoop/spark/conf/spark-env.sh">> /home/hadoop/shark/conf/shark-env.sh	
echo "export SCALA_HOME=/home/hadoop/scala" >> /home/hadoop/shark/conf/shark-env.sh	
!
cat > /home/hadoop/hive/conf/hive-site.xml << EOF	
<?xml version="1.0"?>	
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>	
<configuration>	
<property><name>mapred.job.tracker</name><value>yarn</value></property><property><name>fs.default.name</
name> <value>hdfs://$MASTER:9000</value></property>	
</configuration>	
EOF	
32
classmethod.jp
デーモンの起動
grep -Fq ""isMaster": true" /mnt/var/lib/info/instance.json	
if [ $? -eq 0 ];	
then	
/home/hadoop/spark/bin/start-master.sh	
else	
nc -z $MASTER 7077	
while [ $? -eq 1 ]; do	
echo "Can't connect to the master, sleeping for 20sec"	
sleep 20	
nc -z $MASTER 7077	
done	
echo "Conneting to the master was successful"	
echo "export SPARK_JAVA_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -
Dspark.local.dir=$SPACE"" >> /home/hadoop/spark/conf/spark-env.sh	
echo "export SPARK_PUBLIC_DNS=$PUB_HOSTNAME" >> /home/hadoop/spark/conf/spark-env.sh	
/home/hadoop/spark/bin/spark-daemon.sh start org.apache.spark.deploy.worker.Worker `hostname`
spark://$MASTER:7077	
fi	
33
classmethod.jp
34
ということで、、
classmethod.jp
35
仕組みとしては!
Bootstrap Actionを利用して!
SparkとSharkのインストールと!
デーモンの起動を行っていました
classmethod.jp
36
こんな感じで!
Bootstrap Actionを利用して!
任意のアプリケーションを!
EMRクラスタに!
追加することが出来ます
classmethod.jp
37
なお、、
classmethod.jp
38
EMRはインスタンスタイプ毎に!
Hadoopの各種デーモンの設定を!
最適化しています!
http://docs.aws.amazon.com/
ElasticMapReduce/latest/
DeveloperGuide/emr-hadoop-
config.html
classmethod.jp
39
一方、今回のBootstrap Actionは!
SparkをStandalone Modeで!
実行しています!
https://spark.apache.org/docs/0.8.1/
spark-standalone.html
classmethod.jp
40
Standalone Modeの場合は!
spark-env.shでWorker数や!
メモリサイズを指定して!
インスタンスタイプに合わせた!
最適化が作業が必要になります
classmethod.jp
41
そのため、、
classmethod.jp
42
実際にプロダクション環境で!
利用する際には!
インスタンスタイプに応じた!
チューニングが必要になる!
という認識です(´・ω・`)
classmethod.jp
43
ですが、、
classmethod.jp
44
SparkはYARN(Hadoop2)での!
起動もサポートしています!
https://spark.apache.org/docs/0.8.1/
running-on-yarn.html
classmethod.jp
45
よって、、
classmethod.jp
46
Hadoop2(YARN)で!
EMRを起動すれば!
Sparkを実行できる(はず)!!
そうなればチューニング作業が!
不要になる(はず)!!!
classmethod.jp
47
とはいえ、自分でYARN用の!
Bootstrap Actionを書くのは!
しんどい( ´Д`)=3
classmethod.jp
48
結論は、、
classmethod.jp
49
EMRのAdditional applicationsに!
Sparkがオプションとして!
追加されるといいなー(^O^)
classmethod.jp
50
ご静聴ありがとうございました

m(_ _)m
Run Spark on EMRってどんな仕組みになってるの?

More Related Content

Run Spark on EMRってどんな仕組みになってるの?