spark使用心得

spark入門

啟停spark

sbin/start-all.shsbin/stop-all.sh

spark-shell

進入spark/bin目錄,執行:
./spark-shell
輸出中有這么一行:

Spark context Web UI available at http://xx.xx.xx.188:4040

意味著我們可以從web頁面查看spark的運行情況,特別要注意的是,我們可從中看到節點的classpath,了解每個節點自帶了哪些jar包。
如要查看集群各節點的信息,也可以查看http://xx.xx.xx.188:8080.

spark-shell默認運行于本地,要想運行于集群,需加上–master參數:

./spark-shell --master spark://xx.xx.xx.188:7077

helloworld

scala代碼是:

object HelloWorld{def main(args: Array[String]): Unit = {//配置Spark應用名稱val conf = new SparkConf().setAppName("CollectFemaleInfo")// 提交spark作業val sc = new SparkContext(conf)//讀取數據。其是傳入參數args(0)指定數據路徑val text = sc.textFile(args(0))//篩選女性網民上網時間數據信息val data = text.filter(_.contains("female"))// 匯總每個女網民上網時間val femaleData:RDD[(String, Int)] = data.map { line =>val t = line.split(',')(t(0), t(2).toInt)}.reduceByKey(_+_)// 篩選出時間大于兩小時的女網民val result = femaleData.filter(line => line._2 > 120)println("result count: " + result.count())result.collect().foreach(println)}
}

注意
1、sparkContext的textFile默認加載hdfs的文件,要處理本地文件,需加上file://前綴。用本地數據文件的話,要求spark集群里的每個節點上都有這個本地文件,否則會報文件找不到的錯誤。所以,方便起見,最好是將數據放到hdfs上。
2、RDD的轉換(transformation,例如map、flatMap、filter等)操作都是lazy的(亦即,只是創建一個新的RDD實例,而未做任何實際計算),只有count、collect這樣的行動(action)操作才會真正去求值。這跟java stream的表現是一樣的。

提交jar包

將代碼用maven打包為jar,接著提交給spark運行,提交本地執行的命令如下:

./spark-submit --class com.lee.ConsistencyCheck /export/home/data/com.lee.distrulechecker.service-1.0-SNAPSHOT.jar ExtArea

提交spark集群運行的命令如下:

./spark-submit --class com.lee.ConsistencyCheck --master spark://xx.xx.xx.188:7077  /export/home/data/com.lee.distrulechecker.service-1.0-SNAPSHOT.jar ExtArea./spark-submit --class com.lee.ConsistencyCheck --master spark://xx.xx.xx.188:7077 --conf spark.cores.max=5 /export/home/data/com.lee.distrulechecker.service-1.0-SNAPSHOT.jar ExtArea./spark-submit --class com.lee.ConsistencyCheck --master local /export/home/data/com.lee.distrulechecker.service-1.0-SNAPSHOT.jar ExtArea

注意:
1、–master 指定集群URL,支持的選項如下:

local 本地單線程local[K] 本地多線程(指定K個內核)local[*] 本地多線程(指定所有可用內核)spark://HOST:PORT  連接到指定的 Spark standalone cluster master,需要指定端口。mesos://HOST:PORT  連接到指定的  Mesos 集群,需要指定端口。yarn-client客戶端模式 連接到 YARN 集群。需要配置 HADOOP_CONF_DIR。yarn-cluster集群模式 連接到 YARN 集群

如果不指定–master選項默認就在local跑。

2、內存不夠可用

--driver-memory 512M --executor-memory 512M

強制限制內存。

修改日志打印級別

spark-submit提交時會打印很多INFO信息,影響結果查看,可通過修改日志級別解決。
spark/conf目錄下復制log4j.properties.template為log4j.properties,修改:
log4j.rootCategory=INFO, console

log4j.rootCategory=WARN, console
則在用spark-submit提交后不會出現大量的INFO信息。

提交集群執行時報錯:Initial job has not accepted any resources

網上搜了以下,幾個原因:
1、主機名和ip是否配置正確,查看/etc/hosts,同時在spark-shell里鍵入:
sc.getConf.getAll.foreach(println)
查看conf信息
2、內存不足,SPARK_EXECUTOR_MEMORY參數默認會使用1G內存,如果不夠,可以在spark-submit里指定小于1G的數值,例如:
–executor-memory 512M
3、端口號被占用,之前的程序已運行。我的情況就是這樣,spark-shell使用的集群模式,會把7077端口占用掉,導致隨后的spark-submit必然失敗。

提交jar時的庫依賴

Java 和Scala 用戶可以通過spark-submit 的–jars 標記提交獨立的JAR 包依賴。當只有一兩個庫的簡單依賴,并且這些庫本身不依賴于其他庫時,這種方法比較合適。但是一般Java 和Scala 的工程會依賴很多庫。當你向Spark 提交應用時,你必須把應用的整個依賴傳遞圖中的所有依賴都傳給集群。為此,常規的做法是使用構建工具,生成單個大JAR 包,包含應用的所有的傳遞依賴。這通常被稱為超級(uber)JAR 或者組合(assembly) JAR。

SparkSQL

我們可以在sparkSQL里寫出比較復雜的sql,比如case when:

select case when (a.NAME <> b.EXTNAME) then 1 else 0 end from OBJ1 a join OBJ2 b on a.RID=b.RID

spark的python接口

spark通過py4j來做到python和java的互操作。我個人的猜測,由于spark計算的效率瓶頸應該在分布式計算上,使用python的效率未必比java或scala相差很多,就好比我們產品的程序,性能瓶頸都在sql上,用啥語言組織業務更多的出于使用方便的考量。

Spark進階

driver/executor和master/worker的概念詳解

《spark快速大數據分析》里對driver/executor和master/worker的介紹:

在分布式環境下,Spark 集群采用的是主/ 從結構。在一個Spark 集群中,有一個節點負責中央協調,調度各個分布式工作節點。這個中央協調節點被稱為驅動器(Driver)節點。與之對應的工作節點被稱為執行器(executor)節點。driver節點可以和大量的executor節點進行通信,它們也都作為獨立的Java 進程運行。驅動器節點和所有的執行器節點一起被稱為一個Spark 應用(application)。Spark 文檔中始終使用驅動器節點和執行器節點的概念來描述執行Spark應用的進程。而主節點(master)和工作節點(worker)的概念則被用來分別表述集群管理器中的中心化的部分和分布式的部分。這些概念很容易混淆,所以要格外小心。

上述說法比較抽象,具化后是這樣:
1、一個節點就是一個JVM進程,所以driver/executor和master/worker是四種進程;
2、master/worker進程是靜態的、常駐的,spark集群起來后它們就存在了,我們在主機上執行ps命令可以看到master進程;在從機上ps,可以看到worker進程
3、driver/executor進程是動態的、隨application存在的,application可以簡單的認為就是用spark-submit提交的jar包。我們用 spark-submit提交jar包時,就會啟動driver進程,driver進程好比監工,master進程好比總包工頭,監工向總包工頭提要求:“該干活了”,于是master通知它管理的小包工頭(worker進程):“來來分點活給你們干”。worker進程就會去叫醒手下的工人(同一臺從機上的executor進程):“你干這個、你干那個,手腳麻利點”。所以真正干活的是executor進程,driver還干點數據匯總的活,master/worker可都是“管理者”。application運行的時候,我們可以在從機上用ps命令看,會有好幾個executor進程。這些進程由application觸發啟動,通過線程池運行實際的任務,等application結束,它們就會自然消亡。

因此,一個application的運行會有若干管理開銷,比如數據的跨節點傳輸、啟停executor進程、啟停executor進程里的線程池等,若數據量較小,這些管理開銷占的比重反而較大,得不償失。舉個例子,要處理1000條記錄,3臺機器,每臺機器上4個executor進程,結果每個進程就處理80條記錄,才開始就要結束,實在太浪費了。

spark調優參數

每個executor占用的核數

spark.executor.coresThe number of cores to use on each executor. In standalone and Mesos coarse-grained modes, setting this parameter allows an application to run multiple executors on the same worker, provided that there are enough cores on that worker. Otherwise, only one executor per application will run on each worker.

注意,這是每個executor可以使用的core數。所以,如果一臺機器上僅有8個core且spark.executor.cores=4,那么每臺機器上最多能起2個executor進程。
yarn集群下,該參數默認值為1,即每個executor進程使用一個core;standalone集群下則是該節點可用的所有core,考慮到standalone集群對application的調度默認是獨占的,這個默認值就不難理解了,所以我們在各個worker上僅看到一個executor進程。

application占用的最大核數

spark.cores.maxWhen running on a standalone deploy cluster or a Mesos cluster in "coarse-grained" sharing mode, the maximum amount of CPU cores to request for the application from across the cluster (not from each machine). If not set, the default will be spark.deploy.defaultCores on Spark's standalone cluster manager, or infinite (all available cores) on Mesos.

每個executor占用的內存

spark.executor.memoryAmount of memory to use per executor process (e.g. 2g, 8g).

默認1g。

spark的優缺點

優點:
1、擴展性好,只需增加cpu和內存,就能在增加數據量的情況下保證性能不受較大影響。
實測中,數據量10倍增長,但耗時增長遠低于10倍(當然,超過10w條記錄后我們啟用了多核,之前都是單核運行)。

2、資源獨占(或采用靜態資源分配策略)的情況下,效率始終比較穩定,不像數據庫要受主鍵、背景數據量及統計信息的影響;

缺點:
1、比較重量級,小數據量計算的額外開銷反而較大。這時設置spark.cores.max為很小的值(例如1),減少并行度,反而能提升效率。盡管如此,小數據量下相比于DB依然沒有優勢,兩張千條記錄的表連接在DB上耗時不超過1s,但在spark上仍需4s,這還不包括數據提取到hdfs的時間。

2、可能由于硬件資源有限(主要是core數),應用的并發度無法做到很高,最多不能超過總的核數。從測試情況來看,10w條記錄以內的應用只需1核就能保證效率,但超過10w條,就要考慮多核了,像100w條,在10核時才能保證執行時間最短。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42556.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

優測云服務平臺|【壓力測試功能升級】輕松完成壓測任務

一、本次升級主要功能如下&#xff1a; 1.多份報告對比查看測試結果 2.報告新增多種下載格式 Word格式Excel格式 3.新增多種編排復雜場景的控制器 漏斗控制器并行控制器事務控制器僅一次控制器分組控制器集合點 4.新增概覽頁面&#xff0c;包含多種統計維度 二、報告對比…

開源語音聊天軟件Mumble

網友 大氣 告訴我&#xff0c;Openblocks在國內還有個版本叫 碼匠&#xff0c;更貼合國內軟件開發的需求&#xff0c;如接入了國內常用的身份認證&#xff0c;接入了國內的數據庫和云服務&#xff0c;也對小程序、企微 sdk 等場景做了適配。 在 https://majiang.co/docs/docke…

類與對象(上)

類與對象&#xff08;上&#xff09; 一、面向過程和面向對象的區別二、類1、類的引入2、類的定義&#xff08;1&#xff09;類的基本定義&#xff08;2&#xff09;類的成員函數的定義方法 3、類的訪問限定符4、封裝5、駝峰法命名規則6、類的作用域7、類的實例化&#xff08;1…

金蝶軟件實現導入Excel數據分錄行信息到單據體分錄行中

>>>適合KIS云專業版V16.0|KIS云旗艦版V7.0|K/3 WISE 14.0等版本<<< 金蝶軟件中實現[導入Excel數據業務分錄行]信息到[金蝶單據體分錄]中,在采購訂單|采購入庫單|銷售訂單|銷售出庫單等類型單據中,以少量的必要字段在excel表格中按模板填列好,很方便快捷地從…

IntelliJ IDEA(簡稱Idea) 基本常用設置及Maven部署---詳細介紹

一&#xff0c;Idea是什么&#xff1f; 前言&#xff1a; 眾所周知&#xff0c;現在有許多編譯工具&#xff0c;如eclipse&#xff0c;pathon, 今天所要學的Idea編譯工具 Idea是JetBrains公司開發的一款強大的集成開發環境&#xff08;IDE&#xff09;&#xff0c;主要用于Java…

Rancher管理K8S

1 介紹 Rancher是一個開源的企業級多集群Kubernetes管理平臺&#xff0c;實現了Kubernetes集群在混合云本地數據中心的集中部署與管理&#xff0c;以確保集群的安全性&#xff0c;加速企業數字化轉型。Rancher 1.0版本在2016年就已發布&#xff0c;時至今日&#xff0c;Ranche…

2023牛客第七場補題報告C F L M

2023牛客第七場補題報告C F L M C-Beautiful Sequence_2023牛客暑期多校訓練營7 (nowcoder.com) 思路 觀察到數組一定是遞增的&#xff0c;所以從最高位往下考慮每位的1最多只有一個&#xff0c;然后按位枚舉貪心即可。 代碼 #include <bits/stdc.h> using namespac…

CS:GO升級 Linux不再是“法外之地”

在前天的VAC大規模封禁中&#xff0c;有不少Linux平臺的作弊玩家也迎來了“遲到”的VAC封禁。   一直以來&#xff0c;Linux就是VAC封禁的法外之地。雖然大部分玩家都使用Windows平臺進行游戲。但實際上&#xff0c;使用Linux暢玩CS:GO的玩家也不在少數。 以前V社主要打擊W…

Linux上安裝和使用git到gitoschina和github上_親測

Linux上安裝和使用git到gitoschina和github上_親測 git介紹與在linux上安裝創建SSHkey在git-oschina使用maven-oschina使用在github使用maven-github使用組織與倉庫 【git介紹與在linux上安裝】 Git是一款免費、開源的分布式版本控制系統&#xff0c;用于敏捷高效地處理任何…

uniapp隱藏底部導航欄(非自定義底部導航欄)

uniapp隱藏底部導航欄 看什么看&#xff0c;要多看uni官方文檔&#xff0c;里面啥都有 看什么看&#xff0c;要多看uni官方文檔&#xff0c;里面啥都有 uniapp官方網址&#xff1a;uni設置TabBar // 展示 uni.showTabBar({animation:true,success() {console.debug(隱藏成功)…

【LVS】1、LVS負載均衡群集

1.群集的含義&#xff1a; Cluster、群集、集群 由多臺主機構成并作為一個整體&#xff0c;只提供一個訪問入口&#xff08;域名與IP地址&#xff09;&#xff1b;可伸縮 2.集群使用的場景&#xff1a; 高并發 3.企業群集的分類&#xff1a; 根據群集所針對的目標差異&a…

06-微信小程序-注冊程序-場景值

06-微信小程序-注冊程序 文章目錄 注冊小程序參數 Object object案例代碼 場景值場景值作用場景值列表案例代碼 注冊小程序 每個小程序都需要在 app.js 中調用 App 方法注冊小程序實例&#xff0c;綁定生命周期回調函數、錯誤監聽和頁面不存在監聽函數等。 詳細的參數含義和使…

【LeetCode】543.二叉樹的直徑

題目 給你一棵二叉樹的根節點&#xff0c;返回該樹的 直徑 。 二叉樹的 直徑 是指樹中任意兩個節點之間最長路徑的 長度 。這條路徑可能經過也可能不經過根節點 root 。 兩節點之間路徑的 長度 由它們之間邊數表示。 示例 1&#xff1a; 輸入&#xff1a;root [1,2,3,4,5]…

每日一學——網絡安全

網絡安全設計、原則、審計等知識點的精講如下&#xff1a; 網絡安全設計與原則&#xff1a; 網絡安全設計是指在系統或網絡的設計過程中考慮到安全性&#xff0c;并采取相應的安全措施來保護系統或網絡不受威脅。安全設計原則包括最小權限原則&#xff08;Least Privilege Prin…

高并發內存池(centralcache)[2]

Central cache threadcache是每個線程獨享&#xff0c;而centralcache是多線程共享&#xff0c;需要加鎖&#xff08;桶鎖&#xff09;一個桶一個鎖 解決外碎片問題&#xff1a;內碎片&#xff1a;申請大小超過實際大小&#xff1b;外碎片&#xff1a;空間碎片不連續&#x…

跨境電商ERP源碼大揭秘,讓你少走彎路

本文將深入介紹跨境電商ERP源碼的重要性以及如何選擇和應用它們&#xff0c;讓你的電商業務更高效、順暢。 跨境電商ERP源碼的重要性 提升管理效率 跨境電商運營面臨著眾多挑戰&#xff0c;如訂單管理、庫存追蹤和財務報告等。跨境電商ERP源碼能夠集成這些功能&#xff0c;幫…

自動駕駛,一次道阻且長的遠征|數據猿直播干貨分享

?數據智能產業創新服務媒體 ——聚焦數智 改變商業 在6月的世界人工智能大會上&#xff0c;馬斯克在致辭中宣稱&#xff0c;到2023年底&#xff0c;特斯拉便可實現L4級或L5級的完全自動駕駛&#xff08;FSD&#xff09;。兩個月之后&#xff0c;馬斯克又在X社交平臺上發言&am…

java面試強基(16)

目錄 clone方法的保護機制 Java中由SubString方法是否會引起內存泄漏&#xff1f; Java中提供了哪兩種用于多態的機制? 程序計數器(線程私有) 如何判斷對象是否是垃圾&#xff1f; clone方法的保護機制 clone0方法的保護機制在Object中是被聲明為 protected的。以User…

1000元到3000元預算的阿里云服務器配置大全

1000元、2000元或3000元預算能夠買的阿里云服務器配置有哪些&#xff1f;可以選擇ECS通用算力型u1云服務器、ECS計算型c7或通用型g7實例規格&#xff0c;當然&#xff0c;如果選擇輕量應用服務器的話&#xff0c;更省錢&#xff0c;阿里云百科分享1000-3000元預算能買的阿里云服…