1. 程式人生 > >spark築基篇-01-Eclipse開發Spark HelloWorld

spark築基篇-01-Eclipse開發Spark HelloWorld

1 前言

Spark這麼火,越來越多的小夥伴開始搞大資料。
通過多方查閱資料,這個單機版的Spark的HelloWorld終於跑出來了。
此HelloWorld非彼HelloWorld,並不是打印出HelloWorld那麼簡單,而是一個單詞統計程式,就是統計出一個檔案中單詞出現的次數並排序。

會通過原生的scala的方式,傳統的java方式和java8的方式分別實現同一功能。

其實單機版和運行於叢集之上的Spark程式,差別就在於執行環境,開發流程是一樣的。
以後的文章會記錄如何建立叢集。

另外,該系列文章會在本人閒暇時同時在 CSDN簡書 更新。

歡迎各位道友糾錯。

2 環境搭建

本人所使用環境如下:

C:\Users\hylexus>java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

C:\Users\hylexus>scala -version
Scala code runner version 2.11.8 -- Copyright 2002-2016, LAMP/EPFL

Eclipse for scala:

Scala IDE build of Eclipse SDK
Build id: 4.4.1-vfinal-2016-05-04T11:16:00Z-Typesafe

注意:使用的spark-core_2.11依賴的jar檔案多的嚇人,耐心等待下載jar吧…………^_^

2.1 scala版

pom.xml部分內容如下:

<properties>
    <maven.compiler.source>1.6</maven.compiler.source>
    <maven.compiler.target>1.6</maven.compiler.target
>
<encoding>UTF-8</encoding> <scala.version>2.11.5</scala.version> <scala.compat.version>2.11</scala.compat.version> </properties> <dependencies> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core_2.11 --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.0.0</version> </dependency> <!-- Test --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.specs2</groupId> <artifactId>specs2-junit_2.11</artifactId> <version>2.4.16</version> </dependency> </dependencies> <build> <sourceDirectory>src/main/scala</sourceDirectory> <testSourceDirectory>src/test/scala</testSourceDirectory> <plugins> <plugin> <!-- see http://davidb.github.com/scala-maven-plugin --> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> <configuration> <args> <!-- <arg>-make:transitive</arg> --> <arg>-dependencyfile</arg> <arg>${project.build.directory}/.scala_dependencies</arg> </args> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <compilerArguments> <!-- <extdirs>src/main/webapp/plugins/ueditor/jsp/lib</extdirs> --> </compilerArguments> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.18.1</version> <configuration> <useFile>false</useFile> <disableXmlReport>true</disableXmlReport> <!-- If you have classpath issue like NoDefClassError,... --> <!-- useManifestOnlyJar>false</useManifestOnlyJar --> <includes> <include>**/*Test.*</include> <include>**/*Suite.*</include> </includes> </configuration> </plugin> </plugins> </build>

2.2 java版

pom.xml檔案內容如下:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core_2.11 -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
                <compilerArguments>
                    <!-- <extdirs>src/main/webapp/plugins/ueditor/jsp/lib</extdirs> -->
                </compilerArguments>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <configuration>
                <useFile>false</useFile>
                <disableXmlReport>true</disableXmlReport>
                <!-- If you have classpath issue like NoDefClassError,... -->
                <!-- useManifestOnlyJar>false</useManifestOnlyJar -->
                <includes>
                    <include>**/*Test.*</include>
                    <include>**/*Suite.*</include>
                </includes>
            </configuration>
        </plugin>
    </plugins>
</build>

3 程式碼

3.1 scala-低調版

object WordCount {
    def main(args: Array[String]): Unit = {
        val conf = new SparkConf()
        conf.setAppName("WordCount") //
            .setMaster("local")

        val sc = new SparkContext(conf)

        val fileName = "E:/workspace/eclipse/scala/spark-base/src/main/scala/log4j.properties"
        //獲取檔案內容
        val lines = sc.textFile(fileName, 1)
        //分割單詞,此處僅以空格分割作為示例
        val words = lines.flatMap(line => line.split(" "))
        //String===>(word,count),count==1
        val pairs = words.map(word => (word, 1))
        //(word,1)==>(word,count)
        val result = pairs.reduceByKey((word, acc) => word + acc)
        //sort by count DESC
        val sorted=result.sortBy(e => { e._2 }, false, 1)

        val mapped=sorted.map(e => (e._2, e._1))

        mapped.foreach(e => { println("【" + e._1 + "】出現了" + e._2 + "次") })

        sc.stop()
    }
}

3.2 scala-高調版

object WordCount {
    def main(args: Array[String]): Unit = {
        val conf = new SparkConf
        conf.setAppName("rank test").setMaster("local")

        val sc = new SparkContext(conf)

        val fileName = "E:/workspace/eclipse/scala/spark-base/src/main/scala/log4j.properties"

        sc.textFile(fileName, 1) //lines
            .flatMap(_.split(" ")) //all words
            .map(word => (word, 1)) //to pair
            .reduceByKey(_ + _) //count
            .map(e => (e._2, e._1)) //
            .sortByKey(false, 1) //
            .map(e => (e._2, e._1)) //
            .foreach(e => { println("【" + e._1 + "】出現了" + e._2 + "次") })

        sc.stop()

    }
}

3.3 java-傳統版

程式碼噁心的沒法看啊……
到處都是匿名內部類……
還好有java8的lambda來拯救你

import java.util.Arrays;
import java.util.Iterator;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;

import scala.Tuple2;

public class WordCount {

    public static void main(String[] args) {
        SparkConf conf = new SparkConf();

        conf.setAppName("WordCounter")//
                .setMaster("local");

        String fileName = "E:/workspace/eclipse/scala/spark-base/src/main/scala/log4j.properties";

        JavaSparkContext sc = new JavaSparkContext(conf);
        JavaRDD<String> lines = sc.textFile(fileName, 1);

        JavaRDD<String> words = lines
                .flatMap(new FlatMapFunction<String, String>() {
                    private static final long serialVersionUID = 1L;

                    // 以前的版本好像是Iterable而不是Iterator
                    @Override
                    public Iterator<String> call(String line) throws Exception {
                        return Arrays.asList(line.split(" ")).iterator();
                    }
                });

        JavaPairRDD<String, Integer> pairs = words
                .mapToPair(new PairFunction<String, String, Integer>() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public Tuple2<String, Integer> call(String word)
                            throws Exception {
                        return new Tuple2<String, Integer>(word, 1);
                    }
                });

        JavaPairRDD<String, Integer> result = pairs.reduceByKey(
                new Function2<Integer, Integer, Integer>() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public Integer call(Integer e, Integer acc)
                            throws Exception {
                        return e + acc;
                    }
                }, 1);

        result.map(
                new Function<Tuple2<String, Integer>, Tuple2<String, Integer>>() {

                    private static final long serialVersionUID = 1L;

                    @Override
                    public Tuple2<String, Integer> call(
                            Tuple2<String, Integer> v1) throws Exception {
                        return new Tuple2<>(v1._1, v1._2);
                    }
                })//
                .sortBy(new Function<Tuple2<String, Integer>, Integer>() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public Integer call(Tuple2<String, Integer> v1)
                            throws Exception {
                        return v1._2;
                    }
                }, false, 1)//
                .foreach(new VoidFunction<Tuple2<String, Integer>>() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public void call(Tuple2<String, Integer> e)
                            throws Exception {
                        System.out.println("【" + e._1 + "】出現了" + e._2 + "次");
                    }
                });
        sc.close();

    }
}

3.4 java-lambda版

用上java8的lambda之後,還是挺清爽的嘛^_^

import java.util.Arrays;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

import scala.Tuple2;

public class WordCountByJava8 {

    public static void main(String[] args) {
        SparkConf conf = new SparkConf();

        conf.setAppName("WordCounter")//
                .setMaster("local");

        String fileName = "src/main/java/hylexus/spark/test1/WordCountByJava8.java";

        JavaSparkContext sc = new JavaSparkContext(conf);
        JavaRDD<String> lines = sc.textFile(fileName, 1);

        lines.flatMap(line -> Arrays.asList(line.split(" ")).iterator())
                .mapToPair(word -> new Tuple2<>(word, 1))
                .reduceByKey((e, acc) -> e + acc, 1)
                .map(e -> new Tuple2<>(e._1, e._2))
                .sortBy(e -> e._2, false, 1)
                .foreach(e -> {
                    System.out.println("【" + e._1 + "】出現了" + e._2 + "次");
                });
        sc.close();

    }
}

4 執行效果

//...............
//...............->】出現了6次
【+】出現了5次
【import】出現了5次
【new】出現了4次
【=】出現了4//...............
//...............

相關推薦

spark-01-Eclipse開發Spark HelloWorld

1 前言 Spark這麼火,越來越多的小夥伴開始搞大資料。 通過多方查閱資料,這個單機版的Spark的HelloWorld終於跑出來了。 此HelloWorld非彼HelloWorld,並不是打印出HelloWorld那麼簡單,而是

Spark效能優化二: 開發調優

Spark效能優化 篇二 : 開發調優 1、前言        在大資料計算領域,Spark已經成為了越來越流行、越來越受歡迎的計算平臺之一。Spark的功能涵蓋了大資料領域的離線批處理、SQL類處理、流式/實時計

docker-03-使用docker-commit構建自己的映象

docker構建映象,至少有兩種方法: docker commit 命令 Dockerfile 本篇文章介紹如何使用docker commit命令來構建自己的映象。並推送到DockerHub。 1 準備 登入到Dockerhub,如下所

docker-04-使用Dockerfile構建自己的映象

上一篇文章介紹了使用docker commit命令來構建自己的映象。 本篇文章將使用Dockerfile實現上篇文章中的需求。 1 構建自己的映象 此處我們打算,給一個centos:6.8容器安裝nginx伺服器。 並將其狀態保留,以便不用每次

基礎--01 JAVA開發環境

1、Java簡介(1)Java SE簡介    Java SE(Java Platform,Standard Edition)稱之為“Java平臺標準版,是Java平臺的基礎。    Java SE包含了執行Java應用所需要的基礎環境和核心類庫    Java SE還定義了

docker-02-映象管理

映象再探 基礎命令 1 檢視映象 2 拉取映象 3 搜尋映象 4 刪除映象 1 映象再探 docker映象是由FileSystem疊加而成的。 和傳統的linux一樣,最底層是bootfs;之上是rootfs。 和linux不同的是,d

Java執行緒池的瞭解使用—

## 前言 Java中的執行緒池是一個很重要的概念,它的應用場景十分廣泛,可以被廣泛的用於高併發的處理場景。J.U.C提供的執行緒池:ThreadPoolExecutor類,可以幫助我們管理執行緒並方便地並行執行任務。因此瞭解併合理使用執行緒池非常重要。 本文對執行緒池採用 3W 的策略結合原始碼進行思考

spark你媽喊你回家吃飯-05】RDD程式設計之旅基礎-01

1.RDD工作流程 1.1 RDD理解 RDD是spark特有的資料模型,談到RDD就會提到什麼彈性分散式資料集,什麼有向無環圖,本文暫時不去展開這些高深概念,在閱讀本文時候,大家可以就把RDD當作一個數組,這樣的理解對我們學習RDD的API是非常有幫助的。本文所有示例程式

eclipse配置spark開發環境

前言   無論Windows 或Linux 作業系統,構建Spark 開發環境的思路一致,基於Eclipse 或Idea,通過Java、Scala 或Python 語言進行開發。安裝之前需要提前準備好JDK、Scala 或Python 環境,然後在Eclipse 中下載安裝Scala 或Python 外掛(

spark windows單機安裝,intellij、eclipse開發

1.首先到官網下載spark包,我下載的是spark-1.4.1-bin-hadoop2.6 2.下載hadoop Windwos的工具,下載地址為:http://download.csdn.net/detail/wangyang_software/9030945 3.配置

基於eclipsespark開發環境搭建

1、下載spark安裝包,然後直接解壓即可。 2、配置環境變數      SPARK_HOME  F:\spark-2.1.0-bin-hadoop2.6      Path追加F:\spark-2.1.0-bin-hadoop2.6\bin; 3、建立maven工程。加

機器學習 - 開發環境安裝pycharm + pyspark + spark集成

package ron latest flat 數據量 oop ima 1.0 sklearn AS WE ALL KNOW,學機器學習的一般都是從python+sklearn開始學,適用於數據量不大的場景(這裏就別計較“不大”具體指標是啥了,哈

在Windows下用Eclipse開發和執行Spark程式

我們想現在windows環境下開發除錯好spark程式,然後打包,最後放到linux spark叢集環境去執行。 Windows環境準備 Windows本地測試執行 打包 為了可以選擇哪些第三方庫打進jar包,我們需要安裝Fat Jar

01. Eclipse for PHP + phpStudy 搭建php開發環境

alt img lips 編譯器 phpstudy 服務 border php編譯 -1 配置php編譯器 配置phpStudy服務器項目發布目錄 修改hosts文件127.0.0.1 www.350zx.cn 新建項目 啟動的你的phpStudy

spark學習(基礎)--(第三節)Spark幾種運行模式

一些記錄 image ica runner 1.3 函數 ive 啟動 driver h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff

spark2.x由淺入深深到底系列五之python開發spark環境配置

spark 大數據 rdd 開發環境 python 學習spark任何的技術前,請先正確理解spark,可以參考: 正確理解spark以下是在mac操作系統上配置用python開發spark的環境一、安裝pythonspark2.2.0需要python的版本是Python2.6+ 或者 P

Spark 2.0視頻|快學Spark 2.0(新特性、含真實項目、純Scala語言開發、CDH5.7)

spark快學Spark 2.0(新特性、含真實項目、純Scala語言開發、CDH5.7)分享網盤下載——https://pan.baidu.com/s/1c2F9zO0 密碼: pzx9Spark進入2.0時代,引入了很多優秀特性,性能上有較大提升,API更易用。在“編程統一”方面非常驚艷,實現了離線計算和

Spark筆記整理(三):Spark WC開發與應用部署

大數據 Spark [TOC] Spark WordCount開發 創建的是maven工程,使用的依賴如下: <dependency> <groupId>org.scala-lang</groupId> <artifactId>scal

利用KNIME建立Spark Machine learning 模型 1:開發環境搭建

大數據分析 KNIME Machine Learning Spark 建模 1、Knime Analytics 安裝從官方網站下載合適的版本 https://www.knime.com/downloads 將下載的安裝包在安裝路徑解壓 https://www.knime.com/insta

IDEA搭建scala開發環境開發spark應用程序

編寫 運行程序 通過 https apach import input inf 搭建 一、idea社區版安裝scala插件 因為idea默認不支持scala開發環境,所以當需要使用idea搭建scala開發環境時,首先需要安裝scala插件,具體安裝辦法如下。 1、