spark programming

driver進(jìn)程用于運(yùn)行用戶的主程序,然后在集群的機(jī)子上分布執(zhí)行并行操作犀斋。

概念

RDD

RDD resilient distributed dataset,是分布在集群節(jié)點(diǎn)中的各數(shù)據(jù)元素分片的集合,可被并行地操作楚里。

RDD是通過讀取hdfs中的文件或是通過已經(jīng)存在的集合轉(zhuǎn)換。

shared variables

在分布式執(zhí)行時(shí)优训,傳遞的是變量的復(fù)制朵你,如果需要在任務(wù)之間共享的:

broadcast variables

accumulators

連接

SparkContext是用于告知Spark如何連接到集群中

conf = SparkConf().setAppName(appName)
# 但是首先得創(chuàng)建一個(gè)SparkConf
# 可以在此處直接調(diào)用setmaster設(shè)置運(yùn)行方式 但是一般會(huì)在運(yùn)行時(shí)通過參數(shù)設(shè)置
sc = SparkContext(conf=conf)

如果使用的是shell,則已經(jīng)有了創(chuàng)建好的SparkContext sc來使用揣非,不能再次創(chuàng)建抡医。可在運(yùn)行是加--py-file早敬、--packages忌傻、--repositories來添加python依賴。

RDD

創(chuàng)建的兩種方式

parallelized collections

data = [1, 2, 3, 4, 5]
distData = sc.parallelize(data)
# 會(huì)根據(jù)集群的配置情況自動(dòng)分片
# 然后復(fù)制到各節(jié)點(diǎn)來形成分布式的數(shù)據(jù)集 可以并行地操作

值得注意的是parallelize可接受第二個(gè)參數(shù)來設(shè)置分片的數(shù)量

parallelize(data, 10)

external dataset

distFile = sc.textFile("data.txt")
# 讀取text文件 可以使用hdfs s3n的uri
# 如果使用的是本地文件路徑 需要所有worker的對(duì)應(yīng)路徑上都有
# 支持文件路徑 文件名稱通配符 壓縮 
textFile("/my/directory")
textFile("/my/directory/*.txt")
textFile("/my/directory/*.gz")

textfile也可以接受第二個(gè)參數(shù)聲明文件分片大小 默認(rèn)是128MB

除了textfile外還可以使用

wholeTextFiles可以讀取路徑下的所有文件作為鍵值對(duì)返回(一般是處理目錄下包含多個(gè)小文件的情況)

saveAsPickleFile pickleFile 可以按python的Pickle方式存取 默認(rèn)的batch大小是10

rdd.saveAsSequenceFile()
sc.sequenceFile()
sequenceFile和HDFS

operation

有兩種操作類型:

變換:從已存在的dataset中創(chuàng)建出來
動(dòng)作:通過一定的操作計(jì)算后的返回值

basic

lines = sc.textFile("")
lineLength = lines.map(lambda s: len(s))
lineLength.persist()
totalLength = lineLength.reduce(lambda a, b: a+b)

傳遞

lambda
本地函數(shù)(作用域內(nèi)定義的函數(shù))
全局函數(shù)

雖然說可以傳遞類的方法搞监,但是這樣會(huì)傳遞整個(gè)對(duì)象水孩。如果用到了類,最好是把使用到的類中的東西接出來到局部變量中然后傳遞琐驴。

作用域

如果定義了一個(gè)函數(shù)俘种,然后通過rdd的foreach傳遞運(yùn)行該函數(shù),如果在函數(shù)中引用的是driver的全局變量绝淡,則可能會(huì)有問題宙刘。

在調(diào)用分布式函數(shù)之前,spark會(huì)計(jì)算該任務(wù)的作用域牢酵,即必須對(duì)執(zhí)行器可見的變量和方法悬包,然后把該作用域序列化并傳遞給各個(gè)執(zhí)行器。

傳遞給執(zhí)行器的是一份復(fù)制的變量馍乙,每個(gè)執(zhí)行器操作的是他自己的變量玉罐,所以driver中的全局變量不變。

但是如果是在本地運(yùn)行的同時(shí)是在一個(gè)jvm中潘拨,那么全局變量可能是會(huì)被修改的吊输。但是應(yīng)該是accumulater來實(shí)現(xiàn)這一功能。

對(duì)于變量的打印铁追,如果在集群模式下運(yùn)行季蚂,打印的輸出是各個(gè)節(jié)點(diǎn)。正確的方式是先調(diào)用collect方法來收集到本地琅束。如果只想看一些元素扭屁,可以調(diào)用take

變換

map(func) 把func作用于rdd中的每個(gè)元素 返回
filter(func) 返回func為true的元素
flatmap(func) func的返回值是 seq,把func作用到rdd中的每個(gè)元素
mapPartitions(func)
mapPartitionsWithIndex(func)
sample(withReplacement, fraction, seed) 抽樣
union(rdd) 合集
intersection(rdd) 交集
distinct([numTasks])
groupByKey reduceByKey aggregateByKey SortByKey
join
cogroup
cartesian
pipe
coalesce
repartition
repartitionAndSortWithinPartitions

動(dòng)作

reduce(func) func接受兩個(gè)參數(shù)然后返回一個(gè)值
collect()
count()
first()
take(n)
takeSample(withReplacement, num, seed)
takeOrdered(n, [ordering])
saveAsTextFile(path)
saveAsSequenceFile(path)
saveAsObjectFile(path)
countByKey()
foreach(func)

shuffle operation

是spark重新分布數(shù)據(jù)的機(jī)制 通常會(huì)觸發(fā)執(zhí)行器和機(jī)器的數(shù)據(jù)復(fù)制涩禀,是一個(gè)耗時(shí)料滥、復(fù)雜的動(dòng)作,包含:repartition coalesce groupByKey reduceByKey cogroup join

RDD持久化

MEOMORY_ONLY
MEMORY_AND_DISK
MEMORY_ONLY_SER
MEMORY_AND_DISK_SER
DISK_ONLY
MEMORY_ONLY_2 MEMORY_AND_DISK_2...

spark會(huì)在一些shuffle操作時(shí)自動(dòng)持久化艾船,例如reducebykey

可以顯式調(diào)用unpersist

Shared Variable

Broadcast Variables

broadcast = sc.broadcast([1, 2, 3])
broadcast.value

Accumulators

只有driver可以讀取accumulator的數(shù)據(jù)葵腹,其他執(zhí)行器只能加
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末高每,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子践宴,更是在濱河造成了極大的恐慌鲸匿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阻肩,死亡現(xiàn)場(chǎng)離奇詭異带欢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)烤惊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門乔煞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柒室,你說我怎么就攤上這事瘤缩。” “怎么了伦泥?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)锦溪。 經(jīng)常有香客問我不脯,道長(zhǎng),這世上最難降的妖魔是什么刻诊? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任防楷,我火速辦了婚禮,結(jié)果婚禮上则涯,老公的妹妹穿的比我還像新娘复局。我一直安慰自己,他們只是感情好粟判,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布亿昏。 她就那樣靜靜地躺著,像睡著了一般档礁。 火紅的嫁衣襯著肌膚如雪角钩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天呻澜,我揣著相機(jī)與錄音递礼,去河邊找鬼。 笑死羹幸,一個(gè)胖子當(dāng)著我的面吹牛脊髓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播栅受,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼将硝,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼恭朗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起袋哼,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤冀墨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后涛贯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诽嘉,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年弟翘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虫腋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稀余,死狀恐怖悦冀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情睛琳,我是刑警寧澤盒蟆,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站师骗,受9級(jí)特大地震影響历等,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辟癌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一寒屯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧黍少,春花似錦寡夹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至昵济,卻和暖如春患蹂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砸紊。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工传于, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人醉顽。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓沼溜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親游添。 傳聞我的和親對(duì)象是個(gè)殘疾皇子系草,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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