
1.關于Spark
- 2009年,spark誕生于伯克利大學的amplab。最重要的是,spark隻是一個實驗項目,隻包含很少的代碼,屬于輕量級架構。
- 2010年,伯克利大學正式啟動了Spark項目。
- 2013年6月,Spark成為Apache基金會的一個項目,并進入了高速開發階段。第三方開發人員貢獻了大量代碼,并且非常活躍
- 2014年2月,Spark被稱為Apache的頂級項目。與此同時,大資料公司cloudera宣布增加對spark架構的投資,以取代MapReduce。
- 2014年4月,大資料公司MAPR進入了Spark陣地。Apache mahout放棄了MapReduce,将使用spark作為計算引擎。
- 2014年5月,釋出了Spark 1.0.0。
- 2015年,Spark在國内IT行業中越來越受歡迎。越來越多的公司開始專注于部署或使用Spark取代MR2,hive,storm和其他傳統的大資料并行計算架構。
2.什麼是Spark?
- Apache Spark™ 是用于大規模資料處理的統一分析引擎。
- 大型資料集的統一分析引擎
- Spark是基于記憶體的通用并行計算架構,旨在使資料分析更快
- Spark包含大資料領域的各種通用計算架構
- Spark Core(離線計算)
- Sparksql(互動式查詢)
- Spark Streaming(實時計算)
- Spark mllib(機器學習)
- Spark graphx(圖形計算)
3. Spark可以取代Hadoop嗎?
不完全正确。
因為我們隻能用火花的核心,而不是MR用于離線計算,資料存儲仍取決于HDFS。
Spark+Hadoop的結合是最流行的組合和最有前途的一個,在未來大資料的領域!
4.Spark的特點
- 速度
- 記憶體計算比Mr快100倍
- 磁盤計算比Mr快10倍以上
- 易于使用
- 提供Java Scala Python R語言的API接口
- 一站式解決方案
- Spark核心(離線計算)
- Spark SQL(互動式查詢)
- Spark流式傳輸(實時計算)
- …..
- 可以在任何平台上運作
- Yarn
- Mesos
- Standalone
5.Spark的缺點
- JVM的記憶體開銷太大,1g的資料通常會消耗5g的記憶體(tungsten項目試圖解決此問題)
- 不同的spark應用程式之間沒有有效的共享記憶體機制(項目Tachyon正在嘗試引入分布式記憶體管理,是以不同的spark應用程式可以共享緩存的資料)
6. Spark與MR
6.1 MR的局限性
- 低層次的抽象,需要手工編寫代碼,很難使用
- 僅提供兩個操作,即Map和Reduce,缺少表達式
- 作業隻有兩個階段:映射和縮小。複雜的計算需要完成大量工作。作業之間的依賴關系由開發人員自己管理。
- 中間結果(reduce的輸出)也放置在HDFS檔案系統中
- 高延遲,僅适用于批處理資料,并且對互動式資料處理和實時資料處理的支援不足
- 疊代資料處理性能不佳
6.2 Spark解決了哪些問題?
- 低層次的抽象,需要手工編寫代碼,很難使用
- 在Spark中通過RDD(彈性分布式資料集)進行抽象
- 僅提供兩個操作,即map和reduce,缺少表達式
- 火花中提供了許多運算符
- 作業隻有兩個階段:map和reduce。
- Spark可能有多個階段
- 中間結果也在HDFS檔案系統上(緩慢)
- 如果中間結果在記憶體中,它将被寫入本地磁盤而不是HDFS。
- 高延遲,僅适用于批處理資料,并且對互動式資料處理和實時資料處理的支援不足
- Sparksql和sparkstreaming解決了以上問題
- 疊代資料處理性能不佳
- 通過将資料緩存在記憶體中來提高疊代計算的性能
==是以,将Hadoop MapReduce替換為新一代大資料處理平台是技術發展的趨勢。在新一代的大資料處理平台中,spark是目前得到最廣泛認可和支援的。
7. Spark版本
- spark1.6.3:Scala版本2.10.5
- spark2.2.0:Scala 2.11.8版本(建議用于新項目)
- hadoop2.7.5
8.獨立安裝spark
- 準備安裝軟體包spark-2.2.0-bin-hadoop 2.7.tgz
$tar -zxvf spark-2.2.0-bin-hadoop2.7.tgz -C /opt/$mv spark-2.2.0-bin-hadoop2.7/ spark
- 修改spark env.sh
export JAVA_HOME=/opt/jdkexport SPARK_MASTER_IP=hdp01export SPARK_MASTER_PORT=7077export SPARK_WORKER_CORES=4export SPARK_WORKER_INSTANCES=1export SPARK_WORKER_MEMORY=2gexport HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop
- 配置環境變量
#Configure environment variables for sparkexport SPARK_HOME=/opt/sparkexport PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
- 啟動stand-alone模式的Spark
$start-all-spark.sh
- 檢視啟動狀态
http://hdp01:8080
9.安裝spark分布式叢集
- 配置spark env.sh
[[email protected] /opt/spark/conf]
export JAVA_HOME=/opt/jdk #Configure the host of the master export SPARK_MASTER_IP=hdp01 #Configure the port for master host communication export SPARK_MASTER_PORT=7077 #Configure the number of CPU cores used by spark in each worker export SPARK_WORKER_CORES=4 #Configure one worker per host export SPARK_WORKER_INSTANCES=1 #The memory used by worker is 2GB export SPARK_WORKER_MEMORY=2g #Directory in Hadoop's configuration file export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop
- 配置slaves
[[email protected] /opt/spark/conf]
hdp03 hdp04 hdp05
- 分發Spark
[[email protected] /opt/spark/conf]
$scp -r /opt/spark hdp02:/opt/ $scp -r /opt/spark hdp03:/opt/ $scp -r /opt/spark hdp04:/opt/ $scp -r /opt/spark hdp05:/opt/
- 分發在hdp01上配置的環境變量
$scp -r /etc/profile hdp03:/etc/
[[email protected] /]
$scp -r /etc/profile hdp02:/etc/ $scp -r /etc/profile hdp03:/etc/ $scp -r /etc/profile hdp04:/etc/ $scp -r /etc/profile hdp05:/etc/
- 啟動Spark
[[email protected] /]
$start-all-spark.sh
10. 配置Spark高可用性叢集
先停止正在運作的火花叢集
- 修改spark env.sh
#Note the following two lines#export SPARK_MASTER_IP=hdp01#export SPARK_MASTER_PORT=7077
- 添加以下内容
$export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hdp03:2181,hdp04:2181,hdp05:2181 -Dspark.deploy.zookeeper.dir=/spark"
- 分發修改後的配置
$scp /opt/spark/conf/spark-env.sh hdp02:/opt/spark/conf$scp /opt/spark/conf/spark-env.sh hdp03:/opt/spark/conf$scp /opt/spark/conf/spark-env.sh hdp04:/opt/spark/conf$scp /opt/spark/conf/spark-env.sh hdp05:/opt/spark/conf
- 啟動叢集
[[email protected] /]
$start-all-spark.sh
[[email protected] /]
$start-master.sh
11.第一個Spark Shell程式
$spark-shell --master spark://hdp01:7077 #Spark shell can specify the resources (total cores, memory used on each work) used by the spark shell application at startup.$spark-shell --master spark://hdp01:7077 --total-executor-cores 6 --executor-memory 1g#If you do not specify to use all cores on each worker by default, and 1G memory on each worker>>>sc.textFile("hdfs://ns1/sparktest/").flatMap(_.split(