小白學習Spark系列一:Spark簡介


  由於最近在工作中剛接觸到scala和Spark,並且作為python中毒者,爬行過程很是艱難,所以這一系列分為幾個部分記錄下學習《Spark快速大數據分析》的知識點以及自己在工程中遇到的小問題,以下階段也是我循序了解Spark的一個歷程。

  先拋出幾個問題:

  • 什么是Spark?
  • Spark內部是怎么實現集群調度的?
  • 如何調用Spark?
  • 如何打包一個Spark獨立應用?

一、Spark是什么

  Spark是一個用來實現快速而通用的集群計算平台。它一個主要特點是能夠在內存中進行計算,並且提供了基於Python、Java、Scala和SQL的API,可以和其他大數據工具配合使用。由於Spark的核心引擎有着速度快和通用的特點,因此它還支持各種不同應用場景專門設計的高級組件,比如SQL和機器學習等。組件其實可以理解為Spark針對常見的任務場景而封裝好的模塊,這些模塊提供了各場景的基本功能。組件之間可以相互調用,各組件如圖1-1:

圖1-1 Spark軟件棧

  •  Spark Core實現了任務調度、內存管理、錯誤恢復、與存儲系統交互等模塊,並且還包含了對彈性分布式數據集(Resilient Distributed Dataset,簡稱RDD)的API定義。它主要擔任了系統管理員的角色。
  • Spark SQL 主要用來操作結構化數據的程序包,通過Spark SQL可以使用SQL或者hive版本的HQL來查詢數據庫。
  • Spark Streaming 主要是對實時數據進行流式計算。
  • MLib提供了很多機器學習算法。
  • GraphX用來操作圖,可以並行的進行圖計算,支持了圖的各種操作。

  其中,Spark SQL組件是經常用到的,使用hql語句從hadoop數倉中讀取結構化的數據,存為RDD數據集,進行一些操作后分布式存儲到hdfs中。

二、Spark核心概念

  分布式環境下,Spark集群采用主/從結構。有一個驅動器(Driver)節點負責中央協調,調度各個分布式工作節點,這里的工作節點也叫作執行器(executor)節點。驅動器節點可以和大量的執行器節點通信,這些節點一起被稱為一個Spark應用。

  Spark應用主要是由一個驅動器節點的程序來發起集群上的各種並行操作,驅動器程序也就是你寫的代碼,包含了應用的main函數,定義了分布式數據集以及進行相關操作。那這個程序哪里體現出能夠操作集群的功能呢?主要通過實例化一個SparkContext 對象來訪問Spark,這個對象可以用來連接計算集群。在shell交互式環境下,會自動創建這個對象,叫做sc的變量。否則,需要自己定義。如下代碼展示了如何查看交互式shell環境下sc的類型。

 

下圖1-2展示了Spark如何在一個集群上運行。

圖1-2 Spark分布式組件

 

  驅動器節點的任務:

  (1)把用戶程序轉為任務

  隱式地創建一個由操作組成的邏輯上的有向無環圖,當驅動程序運行時,會把這個邏輯圖轉為物理執行計划。

  (2)為執行器節點調度任務

  執行器進程啟動后,會向驅動器進程注冊自己。驅動器程序會根據當前執行器節點集合,把所有任務基於數據所在位置分配給合適的執行器進程。當任務執行時,執行器進程把緩存數據存儲,驅動器進程會跟蹤這些緩存數據的位置,並利用這些信息調度以后的任務。

  執行器節點的任務:

  (1)負責運行組成Spark應用的任務,並將結果返回給驅動器進程。

       (2)通過自身的塊管理器為用戶程序中要求緩存的RDD提供內存式存儲。

三、Spark調用

  (1)spark-shell(交互窗口模式: 逐行敲模式

  運行spark-shell需要指向申請資源的standalone spark集群信息,其參數為MASTER,還可以指定executor(執行器)及driver(驅動器)的內存大小。

  yarn模式:

1 sudo spark-shell --executor-memory 5g --driver-memory 1g --master yarn

  local模式:

1 sudo spark-shell --executor-memory 5g --driver-memory 1g --master local

  輸入上面的腳本后回車,就到了spark-shell頁面,spark-shell已經默認生成sc對象,可以用如下代碼讀取數據資源。

1 val user_rdd1 = sc.textFile(inputpath, 10) #inputpath:文件名

  注意:local 模式是開發模式,為了驗證實現邏輯上有沒有問題,在單機上測試運行,主要通過利用多線程模擬分布式運行。在剛接觸spark時,使用的就是這個模式,但發現這個模式可以加載本地文件,不能讀取hdfs上的文件。可能還需要配置一下,具體怎么做再研究下。(先給自己挖個坑)  

(2)spark-shell(腳本運行模式:調用scala文件批量運行--適用大部分線下需求)

  上面方法需要在交互窗口中一條一條的輸入scala程序;如果想把scala程序保存在test.scala文件中,一次運行該文件中的程序代碼,可通過如下方式:

1 sudo spark-shell --executor-memory 5g --driver-memory 1g --master yarn < test.scala
1 sudo spark-shell --executor-memory 5g --driver-memory 1g --master local < HelloWorld.scala  

  (3)spark-submit (程序部署模式:與shell無關模式--適用線上需要執行的例行流程)

  Spark提供了一個容易上手的應用程序部署工具bin/spark-submit,可以完成Spark應用程序在local、Standalone、YARN、Mesos上的快捷部署。可以指定集群資源master,executor/ driver的內存資源等。

1 sudo spark-submit --masterspark://192.168.180.216:7077 --executor-memory 5g --class mypackage.test  workcount.jar  hdfs://192.168.180.79:9000/user/input.txt

workcount .scala 代碼打包 workcount.jar,並將文件需要上傳到安裝有spark的服務器下; hdfs://192.168.180.79:9000/user/input.txt為輸入參數;可參考如下網址進行操作:

https://blog.csdn.net/xiaoran_zhu/article/details/50370775

親測打包經歷見下一篇隨筆~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM