TOP

Spark再體驗之springboot整合spark
2018-12-03 09:47:10 】 瀏覽:1073
Tags:

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/qqHJQS/article/details/70216961

有說胎記是前世死的方式,偶肚子上有個,于是想,難不成上輩子是被人捅死的,誰那么狠。。。后來遇到個人,在同樣的位置也有個類似的,忽然就平衡了。
神回復:也可能你們倆上輩子是很烤串

spark

前言

  主要講的是spark環境的搭建和任務的提交优乐棋牌app下载,這一篇是將spark直接部署在springboot搭建的web服務里,一些數據邏輯交給spark去處理,至于原理等我對spark有了更深的理解再來一一講述!

編碼

  使用springboot快速搭建一個web框架,之前對pom中的依賴配置不是怎么在意,進過spark和scala版本的坑之后,發現想配置一個完美的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需要的依賴

然后再寫一個計算單詞個數的方法,這個程序跟以前的一樣,只是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;
    }
}

注意 注意 注意
上面兩點寫法需要注意
implements Serializableprivate transient JavaSparkContext sc
transient為的是不讓sc序列化,如果沒有它做修飾,你會遇到這樣錯

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

別說我怎么知道的优乐棋牌app下载,這個問題花了整整一下午一把血與淚啊,中文优乐棋牌app下载,,英文和日文的解答都尼瑪看了。。。文本我用的是《巴黎圣母院》的英文版,下面是結果

結果

字數統計
代碼我放在了上,有興趣的可以看一看。

后記

  代碼都放在了公司了,自己住的地方網速慢的要死,短短一篇文章寫了半個多小時。。。
  接觸spark不到四天,通過demo對其有了更進一步的認識,前幾天買的書《Spark快速大數據分析》今天剛到,值得去看一看。
  

后續

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

lambda

代碼量減少了一倍,據說效率還提高了。。。

請關注公眾號獲取更多資料



】【打印繁體】【】【】 【】【】【】 【關閉】 【返回頂部
上一篇spark的logDebug模式設置 下一篇eclipse上運行spark程序