大數據系列:Spark學習筆記

大數據系列:Spark學習筆記

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
\t$tar -zxvf spark-2.2.0-bin-hadoop2.7.tgz -C /opt/
\t$mv spark-2.2.0-bin-hadoop2.7/ spark
  • 修改spark env.sh
export JAVA_HOME=/opt/jdk
export SPARK_MASTER_IP=hdp01
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=4
export SPARK_WORKER_INSTANCES=1
export SPARK_WORKER_MEMORY=2g
export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop
  • 配置環境變量
\t#Configure environment variables for spark
\texport SPARK_HOME=/opt/spark
\texport PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
  • 啟動stand-alone模式的Spark
\t$start-all-spark.sh
  • 查看啟動狀態
\thttp://hdp01:8080

9.安裝spark分佈式集群

  • 配置spark env.sh

[root@hdp01 /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

[root@hdp01 /opt/spark/conf]

 hdp03
hdp04
\t hdp05
  • 分發Spark

[root@hdp01 /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/

[root@hdp01 /]

 $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

[root@hdp01 /]

 \t$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 -\tDspark.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
  • 啟動集群

[root@hdp01 /]

 \t$start-all-spark.sh

[root@hdp02 /]

 \t$start-master.sh

11.第一個Spark Shell程序

\t$spark-shell --master spark://hdp01:7077 
\t#Spark shell can specify the resources (total cores, memory used on each work) used by the spark shell application at startup.
\t$spark-shell --master spark://hdp01:7077 --total-executor-cores 6 --executor-memory 1g
\t
\t#If you do not specify to use all cores on each worker by default, and 1G memory on each worker
\t>>>sc.textFile("hdfs://ns1/sparktest/").flatMap(_.split(",")).map((_,1)).reduceByKey(_+_).collect

12.Spark中的角色

  • Master
  • 負責接收對已提交工作的請求
  • Master負責安排資源(在worker中啟動executor)
  • Worker
  • 工作者中的執行者負責執行任務
  • Spark-Submitter ===> Driver
  • 向master提交Spark應用

13. Spark提交的一般過程

大數據系列:Spark學習筆記

如果發現任何不正確的地方,或者想分享有關上述主題的更多信息,歡迎反饋。

譯自developpaper.com


分享到:


相關文章: