[comment]: # Spark集群 + Akka + Kafka + Scala 開發(1) : 配置開發環境
目標
- 配置一個spark standalone集群 + akka + kafka + scala的開發環境。
- 創建一個基於spark的scala工程,並在spark standalone的集群環境中運行。
- 創建一個基於spark+akka的scala工程,並在spark standalone的集群環境中運行。
- 創建一個基於spark+kafka的scala工程,並在spark standalone的集群環境中運行。
集群框架圖
本圖主要是說明各個組件可以發布到不同的邏輯機器上。
預裝的軟件配置
| Software | Version | Location | Comment |
|---|---|---|---|
| CentOS | 7.2.1511 | ||
| JDK | Oracle JDK 1.8 x64 | /opt/java | |
| Spark | 2.0.0 | /opt/spark | |
| Akka | 2.4.10 | /opt/akka | |
| Kafka | 0.8.2.1 | /opt/kafka | |
| Scala | 2.11.8 | /opt/scala | |
| sbt | 0.13.12 | 開發環境 |
配置環境變量
- 編輯 ~/.bash_profile
加上下面的語句:
export JAVA_HOME=/opt/java
export SCALA_HOME=/opt/scala
export SPARK_HOME=/opt/spark
export KAFKA_HOME=/opt/kafka
export AKKA_HOME=/opt/akka
export PATH=$PATH:$JAVA_HOME/bin:$SPARK_HOME/bin:$SCALA_HOME/bin:$KAFKA_HOME/bin
- 應用配置
使上面的配置起效。
source ~/.bash_profile
下載並安裝必要的軟件
- JDK 1.8
Download URL: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下載jdk-8u102-linux-x64.tar.gz
解壓到目錄/opt下,把目錄名改成/opt/java。
tar --directory /opt -xzf jdk-8u102-linux-x64.tar.gz
mv /opt/jdk-8u102 /opt/java
- Spark 2.0.0
Download URL: http://spark.apache.org/downloads.html
下載spark-2.0.0-bin-hadoop2.7.tgz
解壓到目錄/opt下,把目錄名改成/opt/spark。
wget http://d3kbcqa49mib13.cloudfront.net/spark-2.0.0-bin-hadoop2.7.tgz
tar --directory /opt -xzf spark-2.0.0-bin-hadoop2.7.tgz
mv /opt/spark-2.0.0-bin-hadoop2.7 /opt/spark
- Scala
Download URL: http://www.scala-lang.org/download/
下載scala-2.11.8.tgz
解壓到目錄/opt下,把目錄名改成/opt/scala。
wget http://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.tgz
tar --directory /opt -xzf scala-2.11.8.tgz
mv /opt/scala-2.11.8 /opt/scala
- AKKA
Download URL: http://akka.io/downloads/
下載Standalone Distribution: akka_2.11-2.4.10.zip
解壓到目錄/opt下,把目錄名改成/opt/akka。
wget http://downloads.typesafe.com/akka/akka_2.11-2.4.10.zip
upzip -q akka_2.11-2.4.10.zip -d /opt
mv /opt/akka_2.11-2.4.10 /opt/akka
- KAFKA
由於我們將會使用Spark內置的Stream KAFKA功能,這個功能現在綁定了KAFKA 8.x.
如果你不用這個功能開發,而是寫一個Kafka的Comsumer,可以下載最新的版本。
Download URL: http://kafka.apache.org/downloads.html
下載: kafka_2.11-0.8.2.1.tgz
解壓到目錄/opt下,把目錄名改成/opt/kafka。
wget http://mirrors.cnnic.cn/apache/kafka/0.10.0.1/kafka_2.11-0.8.2.1.tgz
tar --directory /opt kafka_2.11-0.8.2.1.tgz
mv /opt/kafka_2.11-0.8.2.1 /opt/kafka
- sbt
sbt包用於開發環境,在測試環境和生產環境可以不要。
可以使用yum安裝。
curl https://bintray.com/sbt/rpm/rpm | sudo tee /etc/yum.repos.d/bintray-sbt-rpm.repo
sudo yum install sbt
配置軟件
- 復制AKKA的類庫到spark里,這樣spark應用就可以使用AKKA的類庫。
因為有兩個spark配置需要設定class path,我們分別針對它們建兩個目錄。
一個是$SPARK_HOME/extraClassPath/driver。
另外一個是$SPARK_HOME/extraClassPath/executor。
復制/opt/akka/lib/akka/akka和/opt/akka/lib/akka/config-到這兩個目錄里。
注意:不要復制所有的akka文件,akka類庫中的某些文件的版本可能會和spark的有沖突,
在運行apark應用時,會出現java.lang.ExceptionInInitializerError。
mkdir -p $SPARK_HOME/extraClassPath/driver
cp -n /opt/akka/lib/akka/akka* $SPARK_HOME/extraClassPath/driver/
cp -n /opt/akka/lib/akka/config-* $SPARK_HOME/extraClassPath/driver/
mkdir -p $SPARK_HOME/extraClassPath/executor
cp -n /opt/akka/lib/akka/akka* $SPARK_HOME/extraClassPath/executor/
cp -n /opt/akka/lib/akka/config-* $SPARK_HOME/extraClassPath/executor/
- 在spark的配置文件spark-defaults.conf中,指定classPath
進入到$SPARK_HOME/conf目錄中,看有沒有文件spark-defaults.conf。
如果沒有復制spark-defaults.conf.template為spark-defaults.conf。
編輯spark-defaults.conf,加入下面兩行。
spark.driver.extraClassPath /opt/spark/extraClassPath/driver/*
spark.executor.extraClassPath /opt/spark/extraClassPath/executor/*
cp -n $SPARK_HOME/conf/spark-defaults.conf.template $SPARK_HOME/conf/spark-defaults.conf
echo "spark.driver.extraClassPath /opt/spark/extraClassPath/driver/*" >> $SPARK_HOME/conf/spark-defaults.conf
echo "spark.executor.extraClassPath /opt/spark/extraClassPath/executor/*" >> $SPARK_HOME/conf/spark-defaults.conf
- 復制KAFKA的類庫到spark里。
mkdir -p $SPARK_HOME/extraClassPath/driver
cp -n $KAFKA_HOME/libs/kafka_2.11-0.8.2.1.jar $SPARK_HOME/extraClassPath/driver/
cp -n $KAFKA_HOME/libs/kafka-clients-0.8.2.1.jar $SPARK_HOME/extraClassPath/driver/
cp -n $KAFKA_HOME/libs/metrics-core-2.2.0.jar $SPARK_HOME/extraClassPath/driver/
mkdir -p $SPARK_HOME/extraClassPath/executor
cp -n $KAFKA_HOME/libs/kafka_2.11-0.8.2.1.jar $SPARK_HOME/extraClassPath/executor/
cp -n $KAFKA_HOME/libs/kafka-clients-0.8.2.1.jar $SPARK_HOME/extraClassPath/executor/
cp -n $KAFKA_HOME/libs/metrics-core-2.2.0.jar $SPARK_HOME/extraClassPath/executor/
驗證安裝的結果
測試spark部署情況
運行下面的命令:
$SPARK_HOME/bin/run-example SparkPi 10
正常的情況下,會有一大堆輸出,看看有沒有:
Pi is roughly 3.14
- 啟動spark集群master server
$SPARK_HOME/sbin/start-master.sh
master服務,默認會使用
7077這個端口。可以通過其日志文件查看實際的端口號。
- 啟動spark集群slave server
$SPARK_HOME/sbin/start-slave.sh spark://$(hostname):7077
后面的參數是master URL.
- 在集群環境中,運行spark的sample
$SPARK_HOME/bin/run-example --master spark://$(hostname):7077 SparkPi 10
后面的參數是master URL.
正常的情況下,會有一大堆輸出,看看有沒有:
7077
Pi is roughly 3.14
- 關閉spark的master服務
$SPARK_HOME/sbin/stop-master.sh
- 關閉spark的slave服務
$SPARK_HOME/sbin/stop-slave.sh
測試Kafka的部署情況
- 啟動kafka服務器
# Start zookeeper server
gnome-terminal -x sh -c '$KAFKA_HOME/bin/zookeeper-server-start.sh $KAFKA_HOME/config/zookeeper.properties; bash'
# Wait zookeeper server is started.
sleep 5s
# Start kafka server
gnome-terminal -x sh -c '$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties; bash'
# Wait kafka server is started.
sleep 5s
注:使用Ctrl+C可以中斷服務。
- 創建一個topic
# Create a topic
$KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
# List topics
$KAFKA_HOME/bin/kafka-topics.sh --list --zookeeper localhost:2181
- 發一個Message
# Send a message
echo This is a message | $KAFKA_HOME/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
- 啟動一個consumer來接受消息。
新起一個終端。正常情況下可以收到This is a message。
不行的話,再發一遍消息。
# Start a consumer
$KAFKA_HOME/bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
測試Scala的部署情況
這個比較簡單,運行:
echo sys.exit | $SCALA_HOME/bin/scala
可以看到Scala的版本號。檢查是否正確。
下面請看
至此,我們已經部署好了一個spark集群+akka+scala的開發環境。下一步請看:
Spark集群 + Akka + Kafka + Scala 開發(2) : 開發一個Spark應用
Spark集群 + Akka + Kafka + Scala 開發(3) : 開發一個Akka + Spark的應用
Spark集群 + Akka + Kafka + Scala 開發(4) : 開發一個Kafka + Spark的應用
