翻譯:Hadoop權(quán)威指南之Spark-2

本文原始地址

A Scala Standalone Application

在Spark shell中運(yùn)行了一個(gè)小程序之后潦刃,你可能想要把它打包成自包含應(yīng)用,這樣就可以多次運(yùn)行了腺晾。

示例19-1. 使用Spark找出最高氣溫的Scala應(yīng)用

import org.apache.spark.SparkContext._
import org.apache.spark.{SparkConf, SparkContext}

object MaxTemperature {
    def main(args: Array[String]) {
        val conf = new SparkConf().setAppName("Max Temperature")
        val sc = new SparkContext(conf)
        sc.textFile(args(0))
          .map(_.split("\t"))
          .filter(rec => (rec(1) != "9999" && rec(2).matches("[01459]")))
          .map(rec => (rec(0).toInt, rec(1).toInt))
          .reduceByKey((a, b) => Math.max(a, b))
          .saveAsTextFile(args(1))
    }
}

運(yùn)行獨(dú)立程序時(shí),沒(méi)有shell為我們提供SparkContext夸溶,我們需要自己創(chuàng)建矾策。我們用一個(gè)SparkConf來(lái)創(chuàng)建這個(gè)實(shí)例。SparkConf可以用來(lái)向應(yīng)用中傳遞多個(gè)Spark屬性带欢,這里我們僅僅設(shè)置應(yīng)用的名字运授。

還有一些別的微小變化。首先是我們使用命令行參數(shù)來(lái)指定輸入和輸出路徑乔煞。另外還使用了方法鏈來(lái)避免為每一個(gè)RDD創(chuàng)建中間變量,這樣程序更緊湊柒室,如果需要的話渡贾,我們?nèi)匀豢梢栽赟cala IDE中查看每次轉(zhuǎn)變(transformation)的類(lèi)型信息。

并非所有的Spark定義的transformation都可用于RDD類(lèi)本身雄右。在本例中空骚,reduceByKey()(僅僅在鍵值對(duì)的RDD上起作用)實(shí)際上定義在PairRDDFunctions類(lèi)中,但我們能用下面的import來(lái)讓Scala隱含地把RDD[(Int, Int)]轉(zhuǎn)為PairRDDFunctions:

import org.apache.spark.SparkContext._

這個(gè)import不同于Spark使用的隱式轉(zhuǎn)型函數(shù)擂仍,因此理所當(dāng)然地值得包含在程序中囤屹。

這一次我們使用spark-submit來(lái)運(yùn)行這個(gè)程序,把包含編譯后的Scala程序的JAR包作為參數(shù)傳入逢渔,接著傳入命令行參數(shù)(輸入輸出路徑):

% spark-submit --class MaxTemperature --master local \
spark-examples.jar input/ncdc/micro-tab/sample.txt output
% cat output/part-*
(1950,22)
(1949,111)

我們還指定了兩個(gè)選項(xiàng):--class 告訴Spark應(yīng)用類(lèi)的名字肋坚,--master 指定job的運(yùn)行方式,local值告訴Spark在本地機(jī)器的單個(gè)JVM中運(yùn)行肃廓,在“Executors and Cluster Managers”一節(jié)我們將會(huì)學(xué)到在集群中運(yùn)行的選項(xiàng)智厌。接下來(lái),我們看看怎樣用Java語(yǔ)言來(lái)使用Spark盲赊。

A Java Example

Spark是使用Scala實(shí)現(xiàn)的铣鹏,Scala是基于JVM的語(yǔ)言,可以和Java完美集成哀蘑。同樣的例子用Java來(lái)表達(dá)诚卸,很直接葵第,也很啰嗦(使用Java 8的lambda表達(dá)式可以使這個(gè)版本更緊湊)。

示例19-2. 使用Spark找出最高氣溫的Java應(yīng)用

public class MaxTemperatureSpark {
    public static void main(String[] args) throws Exception {
        if (args.length != 2) {
            System.err.println("Usage: MaxTemperatureSpark <input path> <output path>");
            System.exit(-1);
        }
        SparkConf conf = new SparkConf();
        JavaSparkContext sc = new JavaSparkContext("local", "MaxTemperatureSpark", conf);
        JavaRDD<String> lines = sc.textFile(args[0]);
        JavaRDD<String[]> records = lines.map(new Function<String, String[]>() {
            @Override public String[] call(String s) {
                return s.split("\t");
            }
        });
        JavaRDD<String[]> filtered = records.filter(new Function<String[], Boolean>() {
            @Override public Boolean call(String[] rec) {
                return rec[1] != "9999" && rec[2].matches("[01459]");
            }
        });
        JavaPairRDD<Integer, Integer> tuples = filtered.mapToPair(
            new PairFunction<String[], Integer, Integer>() {
                @Override public Tuple2<Integer, Integer> call(String[] rec) {
                    return new Tuple2<Integer, Integer>(
                        Integer.parseInt(rec[0]), Integer.parseInt(rec[1]));
                }
        });
        JavaPairRDD<Integer, Integer> maxTemps = tuples.reduceByKey(
            new Function2<Integer, Integer, Integer>() {
                @Override public Integer call(Integer i1, Integer i2) {
                    return Math.max(i1, i2);
                }
        });
        maxTemps.saveAsTextFile(args[1]);
    }
}

在Spark的Java API中合溺,一個(gè)RDD由JavaRDD的實(shí)例表示卒密,在鍵值對(duì)RDD的特殊情況下是JavaPairRDD 。這兩個(gè)類(lèi)都實(shí)現(xiàn)了JavaRDDLike接口辫愉,該接口中可以找到操作RDD的大多數(shù)方法栅受。

運(yùn)行這個(gè)程序和運(yùn)行Scala版本一樣,除了類(lèi)名字是MaxTemperatureSpark 恭朗。

A Python Example

Spark也支持Python語(yǔ)言屏镊,API叫做PySpark。由于Python語(yǔ)言有l(wèi)ambda表達(dá)式痰腮,例子程序非常接近Scala的版本而芥。

示例19-3. 使用Spark找出最高氣溫的Python應(yīng)用

form pyspark import SparkContext
import re, sys

sc = SparkContext("local", "Max Temperature")
sc.textFile(sys.argv[1]) \
  .map(lambda s: s.split("\t")) \
  .filter(lambda rec: (rec[1] != "9999" and re.match("[01459]", rec[2]))) \
  .map(lambda rec: (int(rec[0]), int(rec[1]))) \
  .reduceByKey(max) \
  .saveAsTextFile(sys.argv[2])

注意到在reduceByKey()的轉(zhuǎn)變中,我們可以使用Python語(yǔ)言內(nèi)建的max函數(shù)膀值。

需要留意的重點(diǎn)是棍丐,這個(gè)程序是用CPython寫(xiě)的,Spark會(huì)創(chuàng)建一個(gè)Python子進(jìn)程來(lái)執(zhí)行用戶的Python代碼(在啟動(dòng)程序launcher和在集群上運(yùn)行用戶任務(wù)的executor上)沧踏。兩個(gè)進(jìn)程間使用socket通訊來(lái)傳遞RDD分區(qū)數(shù)據(jù)歌逢。

要運(yùn)行這個(gè)程序,只需指定Python文件即可:

% spark-submit --master local \
  ch19-spark/src/main/python/MaxTemperature.py \
  input/ncdc/micro-tab/sample.txt output

還可以使用pyspark命令翘狱,以交互模式運(yùn)行Spark和Python秘案。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市潦匈,隨后出現(xiàn)的幾起案子阱高,更是在濱河造成了極大的恐慌,老刑警劉巖茬缩,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赤惊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凰锡,警方通過(guò)查閱死者的電腦和手機(jī)未舟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)寡夹,“玉大人处面,你說(shuō)我怎么就攤上這事∑刑停” “怎么了魂角?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)智绸。 經(jīng)常有香客問(wèn)我野揪,道長(zhǎng)访忿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任斯稳,我火速辦了婚禮海铆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挣惰。我一直安慰自己卧斟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布憎茂。 她就那樣靜靜地躺著珍语,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竖幔。 梳的紋絲不亂的頭發(fā)上板乙,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音拳氢,去河邊找鬼募逞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛馋评,可吹牛的內(nèi)容都是我干的放接。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼留特,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼透乾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起磕秤,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捧韵,沒(méi)想到半個(gè)月后市咆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡再来,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年蒙兰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芒篷。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搜变,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出针炉,到底是詐尸還是另有隱情挠他,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布篡帕,位于F島的核電站殖侵,受9級(jí)特大地震影響贸呢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拢军,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一楞陷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茉唉,春花似錦固蛾、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至坚芜,卻和暖如春览芳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸿竖。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工沧竟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缚忧。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓悟泵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親闪水。 傳聞我的和親對(duì)象是個(gè)殘疾皇子糕非,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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