1. 程式人生 > >Spark Core學習筆記(一)

Spark Core學習筆記(一)

一、Spark介紹 Spark 是一種通用的大資料計算框架, 正如傳統大資料技術Hadoop的MapReduce、Hive引擎, 以及Storm流式實時計算引擎等。 Spark包含了大資料領域常見的各種計算框架, 比如: 1、Spark Core用於離線計算 2、Spark SQL用於互動式查詢 3、Spark Streaming用於實時流式計算 4、Spark MLlib用於機器學習 5、Spark GraphX用於圖計算 Spark主要用於大資料的計算, 而Hadoop以後主要用於大資料的儲存( 比如HDFS、 Hive、HBase等) , 以及資源排程( Yarn) Spark+Hadoop的組合,應該是未來大資料領域最熱門的組合, 也是最有前景的組合
二、Spark VS MapReduce 1、MapReduce能夠完成的各種離線批處理功能, 以及常見演算法( 比如二次排序、 topn等) , 基於SparkRDD的核心程式設計, 都可以實現, 並且可以更好地、 更容易地實現。 而且基於Spark RDD編寫的離線批處理程式,執行速度是MapReduce的數倍, 速度上有非常明顯的優勢。 2、Spark相較於MapReduce速度快的最主要原因就在於, MapReduce的計算模型太死板, 必須是mapreduce模式, 有時候即使完成一些諸如過濾之類的操作, 也必須經過map-reduce過程, 這樣就必須經過shuffle過程。 而MapReduce的shuffle過程是最消耗效能的, 因為shuffle中間的過程必須基於磁碟來讀寫。 而Spark的shuffle雖然也要基於磁碟, 但是其大量transformation操作, 比如單純的map或者filter等操作, 可以直接基於記憶體進行pipeline操作, 速度效能自然大大提升。
3、但是Spark也有其劣勢。 由於Spark基於記憶體進行計算, 雖然開發容易, 但是真正面對大資料的時候( 比如一次操作針對10億以上級別) , 在沒有進行調優的情況下, 可能會出現各種各樣的問題, 比如OOM記憶體溢位等等。 導致Spark程式可能都無法完全執行起來, 就報錯掛掉了, 而MapReduce即使是執行緩慢, 但是至少可以慢慢執行完。 三、Spark SQL VS Hive 1、Spark SQL實際上並不能完全替代Hive, 因為Hive是一種基於HDFS的資料倉庫, 並且提供了基於SQL模型的, 針對儲存了大資料的資料倉庫, 進行分散式互動查詢的查詢引擎。 2、嚴格的來說, Spark SQL能夠替代的, 是Hive的查詢引擎, 而不是Hive本身, 實際上即使在生產環境下, Spark SQL也是針對Hive資料倉庫中的資料進行查詢, Spark本身自己是不提供儲存的, 自然也不可能替代Hive作為資料倉庫的這個功能。
3、Spark SQL的一個優點, 相較於Hive查詢引擎來說, 就是速度快, 同樣的SQL語句, 可能使用Hive的查詢引擎, 由於其底層基於MapReduce, 必須經過shuffle過程走磁碟, 因此速度是非常緩慢的。 很多複雜的SQL語句, 在hive中執行都需要一個小時以上的時間。 而Spark SQL由於其底層基於Spark自身的基於記憶體的特點, 因此速度達到了Hive查詢引擎的數倍以上。 4、但是Spark SQL由於與Spark一樣, 是大資料領域的新起的新秀, 因此還不夠完善, 有少量的Hive支援的高階特性,Spark SQL還不支援, 導致Spark SQL暫時還不能完全替代Hive的查詢引擎。 而只能在部分Spark SQL功能特性可以滿足需求的場景下, 進行使用。 5、而Spark SQL相較於Hive的另外一個優點, 就是支援大量不同的資料來源, 包括hive、 json、 parquet、jdbc等等。 此外, Spark SQL由於身處Spark技術堆疊內, 也是基於RDD來工作, 因此可以與Spark的其他元件無縫整合使用, 配合起來實現許多複雜的功能。 比如Spark SQL支援可以直接針對hdfs檔案執行sql語句! 四、Spark Streaming VS Storm 1、Spark Streaming與Storm都可以用於進行實時流計算。 但是他們兩者的區別是非常大的。 其中區別之一, 就是, SparkStreaming和Storm的計算模型完全不一樣, Spark Streaming是基於RDD的, 因此需要將一小段時間內的, 比如1秒內的資料,收集起來, 作為一個RDD, 然後再針對這個batch的資料進行處理。 而Storm卻可以做到每來一條資料, 都可以立即進行處理和計算。 因此, Spark Streaming實際上嚴格意義上來說, 只能稱作準實時的流計算框架; 而Storm是真正意義上的實時計算框架。 2、此外, Storm支援的一項高階特性, 是Spark Streaming暫時不具備的, 即Storm支援在分散式流式計算程式( Topology)在執行過程中, 可以動態地調整並行度, 從而動態提高併發處理能力。 而Spark Streaming是無法動態調整並行度的。 3、但是Spark Streaming也有其優點, 首先Spark Streaming由於是基於batch進行處理的, 因此相較於Storm基於單條資料進行處理, 具有數倍甚至數十倍的吞吐量。 4、此外, Spark Streaming由於也身處於Spark生態圈內, 因此Spark Streaming可以與Spark Core、 Spark SQL, 甚至是Spark MLlib、 Spark GraphX進行無縫整合。 流式處理完的資料, 可以立即進行各種map、 reduce轉換操作, 可以立即使用sql進行查詢, 甚至可以立即使用machine learning或者圖計算演算法進行處理。 這種一站式的大資料處理功能和優勢, 是Storm無法匹敵的。 5、因此, 綜合上述來看, 通常在對實時性要求特別高, 而且實時資料量不穩定, 比如在白天有高峰期的情況下, 可以選擇使用Storm。 但是如果是對實時性要求一般, 允許1秒的準實時處理, 而且不要求動態調整並行度的話, 選擇SparkStreaming是更好的選擇。 注:面試常問的問題 1、Spark計算處理資料速度快的原因: 1)基於記憶體的計算方式 2)基於DAG有向無環圖 2、Hive最終是怎麼通過什麼方式轉為MapReduce執行的? 通過編譯器、直譯器、優化器、執行器轉為MR執行。 五、使用三種方式開發spark的程式 1、Spark Shell 的互動式工具 Spark-Shell提供了一種學習API的簡單方式, 以及一個能夠互動式分析資料的強大工具。 在Scala語言環境下或Python語言環境下均可使用。 a,啟動 spark-shell: ./bin/spark-shell ./bin/spark-shell --master spark://hadoop05:7077 ./bin/spark-shell --master local[2] 以兩個執行緒(CPU的兩個核數)去執行spark-shell ./bin/spark-shell --master local[2] --jar testcode.jar //指定Jar包路徑 注:1》在spark-shell啟動的過程中,會建立一個名為sc的SparkContext物件、 2》--master用來設定context將要連線並使用的資源主節點, master的值可以是Standalone模式 的Spark叢集地址、 Mesos或Yarn叢集的URL, 或者是一個local地址。 3》使用--jar可以新增Jar包的路徑, 使用逗號分隔可以新增多個包。 4》park-Shell的本質是在後臺呼叫了spark-submit指令碼來啟動應用程式。 b、收集到資料後,需要對資料進行各種處理,包括資料的抽取-轉換-裝載(Extract-Transform-Load, ETL) 、 資料統計、 資料探勘, 以及為後續的資料呈現和為決策而提供的資料持久化。 c、本案例資料處理過程, 包含了對外部檔案的載入, 對檔案資料的轉換、 過濾、 各種資料統計, 以及處理結果的儲存。 1》載入檔案 :val texthdfs=sc.textFile("hdfs://hadoop04:9000/spark/words.txt") val textlocal=sc.textFile("file:///home/hadoop/spark.txt") Spark建立sc之後, 可以載入本地檔案建立RDD, 返回一個MapPartitionsRDD。 載入HDFS檔案和本地(Linux)檔案都是使用textFile( ), 區別是新增字首進行標識, hdfs://或file:/// 不同點:從本地讀取的檔案返回MapPartitionsRDD,而從HDFS讀取的檔案先轉成HadoopRDD, 然後隱式轉換成MapPartitonsRDD。 相同點:MapPartitionsRDD和HadoopRDD都是基於Spark的彈性分散式資料集RDD。 2》執行Transformation操作返回新RDD texthdfs.first() //獲取RDD檔案的第一行 texthdfs.count() //獲取RDD檔案的行數 val textRDD=texthdfs.filter(line=>line.contains(“spark”)) //過濾出包含Spark的行, 並返回新RDD texthdfs.filter(line=>line.contains(“spark”)).count() //連結多個Transformation和Action操作 texthdfs.filter(line=>line.contains("spark")).foreach(word=>println(word)) 3》找出文字中每行最多的單詞數 texthdfs.map(line=>line.split(“\t”).size).reduce((a,b)=>if(a>b) a else b) 首先將textFile的每一行文字使用split(“\t”)進行分詞, 並統計分詞後的單詞數量, 然後執行reduce操作, 使用(a,b)=>if(a>b) a else b 進行比較, 返回最大值。 4》詞頻統計 val wordCount=texthdfs.flatMap(line=>line.split(“\t”)).map(word=>(word,1)).reduceByKey((x,y)=>x+y) 執行:wordCount.collect() 注:a、結合flatMap、 Map和reduceByKey來計算檔案中每個單詞的詞頻, 並返回(String,Int)型別的 鍵值對ShuffleRDD, 最後使用collect()聚合單詞計數結果。 b、如果想讓程式碼更簡潔, 可以使用佔位符”_”。 c、當每個引數在函式文字中最多出現一次的時候, 可以使用下劃線_+_擴充套件成帶兩個引數的函 數文字。 d、多個下劃線指代多個引數, 而不是單個引數的重複使用。 第一個下劃線代表第一個引數, 第 二個下劃線代表第二個引數 texthdfs.flatMap(_.split("\t")).map((_,1)).reduceByKey(_+_) .foreach(m=>println(m._1+"appears~~"+ m._2+"~~times")) e、Spark預設是不進行排序的,可以使用sortByKey按照Key進行排序,false為降序,true為升序 f、texthdfs.flatMap(_.split("\t")).map((_,1)).reduceByKey(_+_).map(m=>map(m=(m._2,m._1)).foreach(m=>println(m._1+"..."+m._2+"..times")) 其中, m=>(m._2,m._1)實現key和value互換 g、第一、val wordcount=texthdfs.flatMap(_.split("\t")).map((_,1)).reduceByKey(_+_).map(m=>(m._2,m._1)).sortByKey(false).map(m=>(m._2,m._1)) 第二、val wordcount=texthdfs.flatMap(_.split("\t")).map((_,1)).reduceByKey(_+_).sortBy(_._2,false) 如下,將最終的單詞統計結果儲存到HDFS上:wordcount.saveAsTextFile(“hdfs://hadoop04:9000/spark/wordcountout”) 5》RDD快取(記憶體持久化) result.cache() //快取到記憶體 result.persist() //同上 result.unpersist() //清除快取 Spark支援將資料集存進記憶體快取中, 當資料被反覆訪問時, 是非常有用的。 texthdfs.cache() //通過cache快取資料可用於非常大的資料集, 支援跨越幾十或幾百個節點。 注:collect 將計算結果從叢集中獲取到本地記憶體來顯示,容易發生OOM(記憶體溢位),所以collect只適合結果資料量較小的情況,如果計算結果資料量很大,此時要用foreach()輸出

相關推薦

Spark Core學習筆記

一、Spark介紹 Spark 是一種通用的大資料計算框架, 正如傳統大資料技術Hadoop的MapReduce、Hive引擎, 以及Storm流式實時計算引擎等。 Spark包含了大資料領域常見的各

Asp.net core 2.0.1 Razor 的使用學習筆記

提升 完成後 安全 provider razor 官方 one text .cn 環境:vs2017 版本:15.5.6 這裏說明下, Razor頁面模式跟mvc出現了嚴重的不同。正如微軟官方說的一樣“Razor 頁面是 ASP.NET Core MVC 的一

Spark (Python版) 零基礎學習筆記—— 快速入門

由於Scala才剛剛開始學習,還是對python更為熟悉,因此在這記錄一下自己的學習過程,主要內容來自於spark的官方幫助文件,這一節的地址為: 文章主要是翻譯了文件的內容,但也在裡邊加入了一些自己在實際操作中遇到的問題及解決的方案,和一些補充的小知識,一起學習。 環境

Spark學習筆記——spark簡介

Spark是什麼 spark是基於記憶體計算的大資料平行計算框架。09年誕生於加州大學伯克利分校AMPLab. Spark相較於Hadoop的優點 Spark是MapReduce的替代方案,相容HDFS、Hive等分散式儲存層,可融入Hadoop的生態

python框架之 Tornado 學習筆記

tornado pythontornado 一個簡單的服務器的例子:首先,我們需要安裝 tornado ,安裝比較簡單: pip install tornado 測試安裝是否成功,可以打開python 終端,輸入: import tornado.https

Scala學習筆記編程基礎

大數據 上一個 extends 移除 condition api arr 調用方法 tab 強烈推薦參考該課程:http://www.runoob.com/scala/scala-tutorial.html 1. Scala概述 1.1. 什麽是Scala Scala

3D Game Programming withDX11 學習筆記 數學知識總結

表示 圖形 http 根據 轉置 元素 material -s com   在圖形學中,數學是不可或缺的一部分,所以本書最開始的部分就是數學知識的復習。在圖形學中,最常用的是矢量和矩陣,所以我根據前面三個章節的數學知識,總結一下數學知識。 一、矢量   數學中的矢量,擁有

系統分析與設計學習筆記

學習 掌握 應該 溝通 基本 最終 表示 對象 毫無 為什麽要學習這門課程?   “擁有一把錘子未必能成為建築師”。 這門課程學習的是面向對象分析和設計的核心技能的重要工具。對於使用面向對象技術和語言來,創建設計良好、健壯且可維護的軟件來說,這門課程所

最大熵學習筆記預備知識

color wrap targe dsm entropy plus 文件 eight 相關鏈接 生活中我們常常聽到人們說“不要把雞蛋放到一個籃子裏”。這樣能夠減少風險。深究一下,這是為什麽呢?事實上,這裏邊包括了所謂的最大熵原理(The Maxim

Nginx模塊之Nginx-Ts-Module學習筆記搶險體驗

學習筆記 體驗 nginx模塊 int images clas tps gin issues 1、通過HTTP接收MPEG-TS2、生產和管理Live HLS 3、按照官方的編譯和配置,當然了我是第一次編譯沒有通過,在作者重新調整下,編譯成功,感謝:@arut https:

jq學習筆記

簡單 ren 當前 一個 text 互斥 元素 如果 property 1 .attr() 與 .removeAttr()方法 - atr()方法用來獲取和設置元素屬性 attr()有4個表達式: attr(傳入屬性名):獲取屬性的值 attr(屬性名, 屬性

Redis學習筆記關於在windows64位環境下的安裝學習使用

客戶端 mas key-value 錯誤 services 再次 基準 alt 類型 前言 由於工作需要,目前我正在學習使用Redis。我當時學習Redis就從網上下載了點資料就開始學習了。入門看的是《REDIS入門指南》,這本書個人覺得很適合新手用來學習接觸。根據書上的引

Memcache 學習筆記----Memcache — Linux部署

工作 apach sch trick 解壓 font ash 一個 鍵值   Memcache 一、Memcache簡介(內容摘自 --百度百科)   memcache是一套分布式的高速緩存系統,由LiveJournal的Brad Fitzpatrick開發,但目前被許多網

HtmlParser學習筆記-- 創建Parser對象

nco 修改 英文 text aid 意思 charset 網頁 第一個 首先 ,介紹下HTMLParser的核心類,org.htmlparser.Parser類,這個類實際完成了對於HTML頁面的分析工作。主要的構造函數如下: public Parser ();

Python 學習筆記

pytho oat 變量 情況 class 弱類型 定義 寫代碼 基本上 為什麽學習Python?因為Python 的用處太多了。 本想學會一們語言就好好的維持下去,但是最近Python太火啦,什麽人工智能、網絡爬蟲的,耳濡目染的,心想多學習一些東西總是好的,於是就抽空學習

thphp5.0學習筆記

mic tel 序號 app clas world char p s 庫類 1.目錄結構: 其中thinkphp子目錄是框架核心目錄 thinkphp結構: 2.入口文件 默認自帶的入口文件位於public/index.php 應用目錄為application,其結構

Unity Shader學習筆記坐標變換

directx 渲染 系列 約束 shade ace cnblogs 相機 它的 基本問題   試想我們的美術做了一個3D模型,然後渲染引擎把模型渲染到屏幕上。我們還可以選定不同的視角,模擬不同的光照條件去觀察模型。現在來分析一下這個過程。如果說我們把這個過程看成一個函數,

Django學習筆記——安裝,創建項目,配置

lvs csv oot url root import 方式 配置文件 函數 瘋狂的暑假學習之 Django學習筆記(一) 教材 書《The Django Book》 視頻:csvt Django視頻 1.創建項目

ELK學習筆記安裝Elasticsearch、Kibana、Logstash和X-Pack

成功 前端 功能 靈活 日誌分析 傳統 開發人員 收集 還在 最近在學習ELK的時候踩了不少的坑,特此寫個筆記記錄下學習過程。 日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員可以通過日誌了解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日

移動端學習筆記

標簽設置 裏的 none trait 關於 http width 面具 屏幕 <meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=.5,minimum-s