Spark再體驗(yàn)之springboot整合spark

有說(shuō)胎記是前世死的方式,偶肚子上有個(gè),于是想锯岖,難不成上輩子是被人捅死的介袜,誰(shuí)那么狠。出吹。遇伞。后來(lái)遇到個(gè)人,在同樣的位置也有個(gè)類似的捶牢,忽然就平衡了鸠珠。
神回復(fù):也可能你們倆上輩子是很烤串

spark

前言

上一篇主要講的是spark環(huán)境的搭建和任務(wù)的提交,這一篇是將spark直接部署在springboot搭建的web服務(wù)里叫确,一些數(shù)據(jù)邏輯交給spark去處理跳芳,至于原理等我對(duì)spark有了更深的理解再來(lái)一一講述!

編碼

使用springboot快速搭建一個(gè)web框架竹勉,之前對(duì)pom中的依賴配置不是怎么在意飞盆,進(jìn)過(guò)spark和scala版本的坑之后,發(fā)現(xiàn)想配置一個(gè)完美的pom是多么的不容易次乓,下面傾情奉送

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <scala.version>2.10.4</scala.version>
        <spark.version>1.6.2</spark.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.4.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.10</artifactId>
            <version>${spark.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-launcher_2.10</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_2.10</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.10</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.specs</groupId>
            <artifactId>specs</artifactId>
            <version>1.2.5</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.ansj</groupId>
            <artifactId>ansj_seg</artifactId>
            <version>5.1.1</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

        </plugins>
    </build>

這里包含了springboot和spark需要的依賴

然后再寫(xiě)一個(gè)計(jì)算單詞個(gè)數(shù)的方法吓歇,這個(gè)程序跟以前的一樣,只是SparkConfig的配置有所改變

@Component
public class WordCountService implements Serializable {
    private static final Pattern SPACE = Pattern.compile(" ");

    @Autowired
    private transient JavaSparkContext sc;

    public Map<String, Integer> run() {
        Map<String, Integer> result = new HashMap<>();
        JavaRDD<String> lines = sc.textFile("C:\\Users\\bd2\\Downloads\\blsmy.txt").cache();

        lines.map(new Function<String, String>() {
            @Override
            public String call(String s) throws Exception {
                System.out.println(s);
                return s;
            }
        });
        
        System.out.println(lines.count());

        JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {


            @Override
            public Iterable<String> call(String s) throws Exception {
                return Arrays.asList(SPACE.split(s));
            }
        });

        JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {

            private static final long serialVersionUID = 1L;

            public Tuple2<String, Integer> call(String s) {
                return new Tuple2<String, Integer>(s, 1);
            }
        });

        JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {

            private static final long serialVersionUID = 1L;

            public Integer call(Integer i1, Integer i2) {
                return i1 + i2;
            }
        });

        List<Tuple2<String, Integer>> output = counts.collect();
        for (Tuple2<String, Integer> tuple : output) {
            result.put(tuple._1(),tuple._2());

        }

        return result;

    }
}

注意 注意 注意
上面兩點(diǎn)寫(xiě)法需要注意
implements Serializableprivate transient JavaSparkContext sc
transient為的是不讓sc序列化票腰,如果沒(méi)有它做修飾城看,你會(huì)遇到這樣錯(cuò)

Task not serializable] with root cause
java.io.NotSerializableException: com.quick.spark.xxx

別說(shuō)我怎么知道的,這個(gè)問(wèn)題花了整整一下午一把血與淚啊杏慰,中文测柠,,英文和日文的解答都尼瑪看了缘滥。轰胁。。文本我用的是《巴黎圣母院》的英文版朝扼,下面是結(jié)果

結(jié)果

字?jǐn)?shù)統(tǒng)計(jì)

代碼我放在了GitHub上,有興趣的可以看一看赃阀。

后記

代碼都放在了公司了,自己住的地方網(wǎng)速慢的要死擎颖,短短一篇文章寫(xiě)了半個(gè)多小時(shí)榛斯。。搂捧。
  接觸spark不到四天驮俗,通過(guò)demo對(duì)其有了更進(jìn)一步的認(rèn)識(shí),前幾天買的書(shū)《Spark快速大數(shù)據(jù)分析》今天剛到允跑,值得去看一看意述。

后續(xù)

早上使用java8提供的lambda表達(dá)式改了以下代碼,如下圖

lambda

代碼量減少了一倍吮蛹,據(jù)說(shuō)效率還提高了荤崇。。潮针。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末术荤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子每篷,更是在濱河造成了極大的恐慌瓣戚,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焦读,死亡現(xiàn)場(chǎng)離奇詭異子库,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)矗晃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)仑嗅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事【顾危” “怎么了败许?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)愈诚。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么地沮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮羡亩,結(jié)果婚禮上摩疑,老公的妹妹穿的比我還像新娘。我一直安慰自己夕春,他們只是感情好未荒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著及志,像睡著了一般片排。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上速侈,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天率寡,我揣著相機(jī)與錄音,去河邊找鬼倚搬。 笑死冶共,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捅僵,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼家卖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了庙楚?” 一聲冷哼從身側(cè)響起上荡,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馒闷,沒(méi)想到半個(gè)月后酪捡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纳账,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年逛薇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疏虫。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡永罚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出议薪,到底是詐尸還是另有隱情尤蛮,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布斯议,位于F島的核電站产捞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏哼御。R本人自食惡果不足惜坯临,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恋昼。 院中可真熱鬧看靠,春花似錦、人聲如沸液肌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嗦哆。三九已至谤祖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間老速,已是汗流浹背粥喜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留橘券,地道東北人额湘。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓卿吐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锋华。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗡官,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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