Springboot2.X 集成 spark2.X 实现WordCount

1.创建springboot项目 引入spark依赖

项目结构

项目 pom文件 项目使用spark2.4.5 依赖中自带scala无需安装

    <groupId>com.lionli</groupId>
    <artifactId>springboot-spark-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.13.RELEASE</version>
    </parent>

    <properties>
        <scala.version>2.11.12</scala.version>
        <spark.version>2.4.5</spark.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.61</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

</project>

2.编写相关代码

application.yml 无设置

SparkApplication.java 启动类 无变化

SparkConfig.java spark配置类

/**
 * spark 配置类
 * @Author Lion Li
 * @Date 2020/4/8
 */
@Configuration
public class SparkConfig {

    @Bean
    public SparkConf sparkConf() {
        return new SparkConf()
                // 设置模式为本地模式 [*] 为使用本机核数
                .setMaster("local[*]")
                // 设置应用名
                .setAppName("springboot-spark-demo");
    }

    @Bean
    public JavaSparkContext javaSparkContext() {
        return new JavaSparkContext(sparkConf());
    }

}

WordCount.java 数据实体类 (这是使用了Lombok)

/**
 * spark 配置类
 * @Author Lion Li
 * @Date 2020/4/8
 */
@Data
@ToString
@AllArgsConstructor
public class WordCount implements Serializable {

    private String word;
    private Integer count;

}

SparkController.java 

/**
 * spark 配置类
 * @Author Lion Li
 * @Date 2020/4/8
 */
@RestController
public class SparkController {

    @Autowired
    private SparkService sparkService;

    @GetMapping("/wordCount")
    public String wordCount() {
        List<WordCount> list = sparkService.doWordCount();
        return JSONObject.toJSONString(list);
    }

}

SparkService.java 业务类(代码中有详细注释,,请仔细观看)

/**
 * spark 业务类
 * @Author Lion Li
 * @Date 2020/4/8
 */
@Service
public class SparkService implements Serializable {

    @Autowired
    private transient JavaSparkContext javaSparkContext;

    public List<WordCount> doWordCount() {
        // 获取本地文件 生成javaRDD
        JavaRDD<String> file = javaSparkContext.textFile("E:\\wordcount.txt");
        // 按空格分解为数组 生成新的javaRDD
        JavaRDD<String> words = file.flatMap(
            line -> Arrays.asList(line.split(" ")).iterator()
        );
        // 统计每个词出现的次数 生成新的javaRDD
        JavaRDD<WordCount> wordcount = words.map(
                word -> new WordCount(word, 1)
        );
        // 将词与数转换为 key-value形式
        JavaPairRDD<String, Integer> pair = wordcount.mapToPair(
                wordCount -> new Tuple2<>(wordCount.getWord(), wordCount.getCount())
        );
        // 根据key进行整合
        JavaPairRDD<String, Integer> wordcounts = pair.reduceByKey(
                (count1, count2) -> count1 + count2
        );
        // 将结果转换为 WordCount对象
        JavaRDD<WordCount> map = wordcounts.map(
                (tuple2) -> new WordCount(tuple2._1, tuple2._2)
        );
        // 将结果转换为 list并返回
        List<WordCount> result = map.collect();
        return result;
    }

}

这里在E盘准备一个名为wordcount的测试txt文件 内容为

java python php java golang php java

3.测试

启动项目

启动项目会报一个异常

这是因为我们没有装hadoop 但是不耽误我们使用spark 具体解决方案  请百度 很简单 这里不细讲了

出现tomcat日志 JVM日志  则启动成功

访问WordCount接口

得到返回值,与我们文件中的数量一直

查看日志 

系统分成了两个任务 执行无异常 

 

项目已上传到gitee

地址: springboot-spark-demo

如果帮到您了,请帮忙点个star

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章