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
如果帮到您了,请帮忙点个star