SparkContext、SparkConf和SparkSession的初始化
生活随笔
收集整理的這篇文章主要介紹了
SparkContext、SparkConf和SparkSession的初始化
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
SparkContext?和?SparkConf
任何Spark程序都是SparkContext開始的,SparkContext的初始化需要一個(gè)SparkConf對象,SparkConf包含了Spark集群配置的各種參數(shù)。 初始化后,就可以使用SparkContext對象所包含的各種方法來創(chuàng)建和操作RDD和共享變量。val conf = new SparkConf().setMaster("master").setAppName("appName") val sc = new SparkContext(conf) 或者 val sc = new SparkContext("master","appName") Note:Once a SparkConf object is passed to Spark, it is cloned and can no longer be modified by the user.也就是說一旦設(shè)置完成SparkConf,就不可被使用者修改對于單元測試,您也可以調(diào)用SparkConf(false)來跳過加載外部設(shè)置,并獲得相同的配置,無論系統(tǒng)屬性如何。咱們再看看setMaster()和setAppName()源碼:根據(jù)上面的解釋,setMaster主要是連接主節(jié)點(diǎn),如果參數(shù)是"local",則在本地用單線程運(yùn)行spark,如果是 local[4],則在本地用4核運(yùn)行,如果設(shè)置為spark://master:7077,就是作為單節(jié)點(diǎn)運(yùn)行,而setAppName就是在web端顯示應(yīng)用名而已,它們說到底都調(diào)用了set()函數(shù),讓我們看看set()是何方神圣logDeprecation(key)是日志輸出函數(shù),防止輸入?yún)?shù)名無效, 看看settings,是個(gè)HashMap結(jié)構(gòu),追溯一下:果然,是個(gè)ConcurrentHashMap對象,ConcurrentHashMap主要作用是解決多線程并發(fā)下數(shù)據(jù)段訪問效率,該類相對于hashMap而言具有同步map中的數(shù)據(jù),對于hashTable而言,該同步數(shù)據(jù)對于并發(fā)程序提高了極高的效率,所以在使用緩存機(jī)制的時(shí)候如果對map中的值具有高并發(fā)的情況的話,那么我們就需要使用ConcurrentHashMap,ConcurrentHashMap中主要實(shí)體類就是三個(gè):ConcurrentHashMap(整個(gè)Hash表),Segment(桶),HashEntry(節(jié)點(diǎn)),CurrentHashMap的初始化一共有三個(gè)參數(shù),一個(gè)initialCapacity,表示初始的容量,一個(gè)loadFactor,表示負(fù)載參數(shù),最后一個(gè)是concurrentLevel,代表ConcurrentHashMap內(nèi)部的Segment的數(shù)量,ConcurrentLevel一經(jīng)指定,不可改變,這也是為什么SparkConf配置好了就無法更改的原因。 ConcurrentHashMap應(yīng)用了鎖分段技術(shù),HashTable容器在競爭激烈的并發(fā)環(huán)境下表現(xiàn)出效率低下的原因,是因?yàn)樗性L問HashTable的線程都必須競爭同一把鎖,那假如容器里有多把鎖,每一把鎖用于鎖容器其中一部分?jǐn)?shù)據(jù),那么當(dāng)多線程訪問容器里不同數(shù)據(jù)段的數(shù)據(jù)時(shí),線程間就不會存在鎖競爭,從而可以有效的提高并發(fā)訪問效率,這就是ConcurrentHashMap所使用的鎖分段技術(shù),首先將數(shù)據(jù)分成一段一段的存儲,然后給每一段數(shù)據(jù)配一把鎖,當(dāng)一個(gè)線程占用鎖訪問其中一個(gè)段數(shù)據(jù)的時(shí)候,其他段的數(shù)據(jù)也能被其他線程訪問。 另外,如果ConcurrentHashMap的元素?cái)?shù)量增加導(dǎo)致ConrruentHashMap需要擴(kuò)容,ConcurrentHashMap是不會增加Segment的數(shù)量的,而只會增加Segment中鏈表數(shù)組的容量大小,這樣的好處是擴(kuò)容過程不需要對整個(gè)ConcurrentHashMap做rehash,而只需要對Segment里面的元素做一次rehash就可以了。SparkSession:?SparkSession實(shí)質(zhì)上是SQLContext和HiveContext的組合(未來可能還會加上StreamingContext),所以在SQLContext和HiveContext上可用的API在SparkSession上同樣是可以使用的。SparkSession內(nèi)部封裝了sparkContext,所以計(jì)算實(shí)際上是由sparkContext完成的。val sparkSession = SparkSession.builder.master("master").appName("appName").getOrCreate() 或者 SparkSession.builder.config(conf=SparkConf())上面代碼類似于創(chuàng)建一個(gè)SparkContext,master設(shè)置為"xiaojukeji",然后創(chuàng)建了一個(gè)SQLContext封裝它。如果你想創(chuàng)建hiveContext,可以使用下面的方法來創(chuàng)建SparkSession,以使得它支持Hive(HiveContext):val sparkSession = SparkSession.builder.master("master").appName("appName").enableHiveSupport().getOrCreate() //sparkSession 從csv讀取數(shù)據(jù):val dq = sparkSession.read.option("header", "true").csv("src/main/resources/scala.csv")getOrCreate():有就拿過來,沒有就創(chuàng)建,類似于單例模式:s1 = SparkSession().builder.config("k1", "v1").getORCreat() s2 = SparkSession().builder.config("k2", "v2").getORCreat() return s1.conf.get("k1") == s2.conf.get("k2")True總結(jié)
以上是生活随笔為你收集整理的SparkContext、SparkConf和SparkSession的初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hbase总结(十)Hhase性能调优
- 下一篇: spark-submit使用及说明