spark RDD 編程

RDD可以通過兩種方式創(chuàng)建:

1:讀取一個外部數(shù)據(jù)接戳吝,比如從本地文件加載數(shù)據(jù)集片橡,或者從HDFS文件系統(tǒng)合武,HBase等外部數(shù)據(jù)系統(tǒng)加載數(shù)據(jù)前硫。Spark也可以支持文本文件胞得,SequenceFile文件和其他符合Hadoop InputFormat 格式的文件

2:調(diào)用SparkContext 的parallelize方法,在Driver中一個已經(jīng)存在的集合(數(shù)組)上創(chuàng)建

從文件系統(tǒng)中加載數(shù)據(jù)創(chuàng)建RDD

Spark 采用textFile() 方法來從文件系統(tǒng)中加載數(shù)據(jù)創(chuàng)建RDD屹电,該方法把文件的URL作為參數(shù)阶剑,這個URL可以本地文件系統(tǒng)的地址跃巡,或者是分布式文件系統(tǒng)HDFS的地址

???? val =sc.textFile("file:///home/data/word.txt")

在使用Spark讀取文件時,需要說明以下幾點:

(1)如果使用了本地文件系統(tǒng)的路徑牧愁,那么素邪,必須要保證在所有的worker節(jié)點上,也都能夠采用相同的路徑訪問到該文件猪半,比如兔朦,可以把該文件拷貝到每個worker節(jié)點上,或者也可以使用網(wǎng)絡掛載共享文件系統(tǒng)办龄。

(2)textFile()方法的輸入?yún)?shù)烘绽,可以是文件名,也可以是目錄俐填,也可以是壓縮文件等安接。比如,textFile("/my/directory"), textFile("/my/directory/*.txt"), and textFile("/my/directory/*.gz").

(3)textFile()方法也可以接受第2個輸入?yún)?shù)(可選)英融,用來指定分區(qū)的數(shù)目盏檐。默認情況下,Spark會為HDFS的每個block創(chuàng)建一個分區(qū)(HDFS中每個block默認是128MB)驶悟。你也可以提供一個比block數(shù)量更大的值作為分區(qū)數(shù)目胡野,但是,你不能提供一個小于block數(shù)量的值作為分區(qū)數(shù)目痕鳍。

通過并行集合(數(shù)組)創(chuàng)建RDD

調(diào)用 SparkContext的parallelize方法硫豆,在Driver中一個已經(jīng)存在的集合【數(shù)組】上創(chuàng)建

代碼:val array=Array(1,2,3,4,5)

????????? val rdd =sc.parallenlize(array)


scala

RDD操作

RDD 被創(chuàng)建好之后,在后續(xù)使用過程中一般會發(fā)生兩種操作:

?????????? 1....... 轉(zhuǎn)換【Transformation】:基于現(xiàn)在的數(shù)據(jù)集創(chuàng)建一個新的數(shù)據(jù)集

?????????? 2 .......行動【Action】: 在數(shù)據(jù)集上運行計算笼呆,返回計算值

轉(zhuǎn)換操作

對于RDD而言熊响,每一次轉(zhuǎn)換操作都會產(chǎn)生不同的RDD,供給下一個“轉(zhuǎn)換”使用诗赌。轉(zhuǎn)換得到的RDD是惰性求值的汗茄,也就是說,整個轉(zhuǎn)換過程只是記錄了轉(zhuǎn)換的軌跡铭若,并不會發(fā)生真正的計算洪碳,只有遇到行動操作時,才會發(fā)生真正的計算叼屠,開始從血緣關系源頭開始瞳腌,進行物理的轉(zhuǎn)換操作。

下面列出一些常見的轉(zhuǎn)換操作(Transformation API):

* filter(func):篩選出滿足函數(shù)func的元素镜雨,并返回一個新的數(shù)據(jù)集

* map(func):將每個元素傳遞到函數(shù)func中纯趋,并將結(jié)果返回為一個新的數(shù)據(jù)集

* flatMap(func):與map()相似,但每個輸入元素都可以映射到0或多個輸出結(jié)果

* groupByKey():應用于(K,V)鍵值對的數(shù)據(jù)集時,返回一個新的(K, Iterable)形式的數(shù)據(jù)集

* reduceByKey(func):應用于(K,V)鍵值對的數(shù)據(jù)集時吵冒,返回一個新的(K, V)形式的數(shù)據(jù)集,其中的每個值是將每個key傳遞到函數(shù)func中進行聚合

行動操作

行動操作是真正觸發(fā)計算的地方西剥。Spark程序執(zhí)行到行動操作時痹栖,才會執(zhí)行真正的計算,從文件中加載數(shù)據(jù)瞭空,完成一次又一次轉(zhuǎn)換操作,最終,完成行動操作得到結(jié)果扼雏。

下面列出一些常見的行動操作(Action API):

* count()? 返回數(shù)據(jù)集中的元素個數(shù)

* collect() 以數(shù)組的形式返回數(shù)據(jù)集中的所有元素

* first()? 返回數(shù)據(jù)集中的第一個元素

* take(n)? 以數(shù)組的形式返回數(shù)據(jù)集中的前n個元素

* reduce(func)? 通過函數(shù)func(輸入兩個參數(shù)并返回一個值)聚合數(shù)據(jù)集中的元素

* foreach(func) 將數(shù)據(jù)集中的每個元素傳遞到函數(shù)func中運行*

持久化

前面我們已經(jīng)說過攒砖,在Spark中,RDD采用惰性求值的機制旧找,每次遇到行動操作溺健,都會從頭開始執(zhí)行計算。如果整個Spark程序中只有一次行動操作钮蛛,這當然不會有什么問題鞭缭。但是,在一些情形下魏颓,我們需要多次調(diào)用不同的行動操作岭辣,這就意味著,每次調(diào)用行動操作甸饱,都會觸發(fā)一次從頭開始的計算沦童。這對于迭代計算而言,代價是很大的叹话,迭代計算經(jīng)常需要多次重復使用同一組數(shù)據(jù)偷遗。

下面就是多次計算同一個DD的例子


rutusuosi

實際上,可以通過持久化(緩存)機制避免這種重復計算的開銷渣刷○兄祝可以使用persist()方法對一個RDD標記為持久化,之所以說“標記為持久化”辅柴,是因為出現(xiàn)persist()語句的地方箩溃,并不會馬上計算生成RDD并把它持久化,而是要等到遇到第一個行動操作觸發(fā)真正計算以后碌嘀,才會把計算結(jié)果進行持久化涣旨,持久化后的RDD將會被保留在計算節(jié)點的內(nèi)存中被后面的行動操作重復使用。

persist()的圓括號中包含的是持久化級別參數(shù)股冗,比如霹陡,persist(MEMORY_ONLY)表示將RDD作為反序列化的對象存儲于JVM中,如果內(nèi)存不足,就要按照LRU原則替換緩存中的內(nèi)容烹棉。persist(MEMORY_AND_DISK)表示將RDD作為反序列化的對象存儲在JVM中攒霹,如果內(nèi)存不足,超出的分區(qū)將會被存放在硬盤上浆洗。一般而言催束,使用cache()方法時,會調(diào)用persist(MEMORY_ONLY)伏社。

分區(qū)

RDD是彈性分布式數(shù)據(jù)集抠刺,通常RDD很大,會被分成很多個分區(qū)摘昌,分別保存在不同的節(jié)點上速妖。RDD分區(qū)的一個分區(qū)原則是使得分區(qū)的個數(shù)盡量等于集群中的CPU核心(core)數(shù)目。

對于不同的Spark部署模式而言(本地模式聪黎、Standalone模式罕容、YARN模式、Mesos模式)挺举,都可以通過設置spark.default.parallelism這個參數(shù)的值杀赢,來配置默認的分區(qū)數(shù)目,一般而言:

*本地模式:默認為本地機器的CPU數(shù)目湘纵,若設置了local[N],則默認為N脂崔;

*Apache Mesos:默認的分區(qū)數(shù)為8;

*Standalone或YARN:在“集群中所有CPU核心數(shù)目總和”和“2”二者中取較大值作為默認值梧喷;

因此砌左,對于parallelize而言,如果沒有在方法中指定分區(qū)數(shù)铺敌,則默認為spark.default.parallelism汇歹,比如:

scala>val array=Array(1,2,3,4,5)

array:Array[Int]=Array(1,2,3,4,5)

scala>val rdd=sc.parallelize(array,2)#設置兩個分區(qū)

rdd:org.apache.spark.rdd.RDD[Int]=ParallelCollectionRDD[13]at parallelize at:29

scala

對于textFile而言,如果沒有在方法中指定分區(qū)數(shù)偿凭,則默認為min(defaultParallelism,2)产弹,其中,defaultParallelism對應的就是spark.default.parallelism弯囊。

如果是從HDFS中讀取文件痰哨,則分區(qū)數(shù)為文件分片數(shù)(比如,128MB/片)匾嘱。

打印元素

在實際編程中斤斧,我們經(jīng)常需要把RDD中的元素打印輸出到屏幕上(標準輸出stdout),一般會采用語句rdd.foreach(println)或者rdd.map(println)霎烙。當采用本地模式(local)在單機上執(zhí)行時撬讽,這些語句會打印出一個RDD中的所有元素蕊连。但是,當采用集群模式執(zhí)行時游昼,在worker節(jié)點上執(zhí)行打印語句是輸出到worker節(jié)點的stdout中甘苍,而不是輸出到任務控制節(jié)點Driver

Program中,因此烘豌,任務控制節(jié)點Driver

Program中的stdout是不會顯示打印語句的這些輸出內(nèi)容的羊赵。為了能夠把所有worker節(jié)點上的打印輸出信息也顯示到Driver

Program中,可以使用collect()方法扇谣,比如,rdd.collect().foreach(println)闲昭,但是罐寨,由于collect()方法會把各個worker節(jié)點上的所有RDD元素都抓取到Driver

Program中,因此序矩,這可能會導致內(nèi)存溢出鸯绿。因此,當你只需要打印RDD的部分元素時簸淀,可以采用語句rdd.take(100).foreach(println)瓶蝴。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市租幕,隨后出現(xiàn)的幾起案子舷手,更是在濱河造成了極大的恐慌,老刑警劉巖劲绪,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件男窟,死亡現(xiàn)場離奇詭異,居然都是意外死亡贾富,警方通過查閱死者的電腦和手機歉眷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颤枪,“玉大人汗捡,你說我怎么就攤上這事∥犯伲” “怎么了扇住?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長霍骄。 經(jīng)常有香客問我台囱,道長,這世上最難降的妖魔是什么读整? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任簿训,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘强品。我一直安慰自己膘侮,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布的榛。 她就那樣靜靜地躺著琼了,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夫晌。 梳的紋絲不亂的頭發(fā)上雕薪,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音晓淀,去河邊找鬼所袁。 笑死,一個胖子當著我的面吹牛凶掰,可吹牛的內(nèi)容都是我干的燥爷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼懦窘,長吁一口氣:“原來是場噩夢啊……” “哼前翎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起畅涂,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤港华,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后毅戈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苹丸,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年苇经,在試婚紗的時候發(fā)現(xiàn)自己被綠了赘理。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡扇单,死狀恐怖商模,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜘澜,我是刑警寧澤施流,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站鄙信,受9級特大地震影響瞪醋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜装诡,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一银受、第九天 我趴在偏房一處隱蔽的房頂上張望践盼。 院中可真熱鬧,春花似錦宾巍、人聲如沸咕幻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肄程。三九已至,卻和暖如春选浑,著一層夾襖步出監(jiān)牢的瞬間蓝厌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工古徒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褂始,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓描函,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狐粱。 傳聞我的和親對象是個殘疾皇子舀寓,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容