项目结构
项目 pom文件 项目使用spark2.4.5 依赖中自带scala无需安装
com.lionli
springboot-spark-demo
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
2.1.13.RELEASE
2.11.12
2.4.5
org.apache.spark
spark-core_2.11
${spark.version}
org.springframework.boot
spring-boot-starter-web
ch.qos.logback
logback-classic
com.alibaba
fastjson
1.2.61
org.projectlombok
lombok
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 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 doWordCount() {
// 获取本地文件 生成javaRDD
JavaRDD file = javaSparkContext.textFile("E:\\wordcount.txt");
// 按空格分解为数组 生成新的javaRDD
JavaRDD words = file.flatMap(
line -> Arrays.asList(line.split(" ")).iterator()
);
// 统计每个词出现的次数 生成新的javaRDD
JavaRDD wordcount = words.map(
word -> new WordCount(word, 1)
);
// 将词与数转换为 key-value形式
JavaPairRDD pair = wordcount.mapToPair(
wordCount -> new Tuple2<>(wordCount.getWord(), wordCount.getCount())
);
// 根据key进行整合
JavaPairRDD wordcounts = pair.reduceByKey(
(count1, count2) -> count1 + count2
);
// 将结果转换为 WordCount对象
JavaRDD map = wordcounts.map(
(tuple2) -> new WordCount(tuple2._1, tuple2._2)
);
// 将结果转换为 list并返回
List result = map.collect();
return result;
}
}
这里在E盘准备一个名为wordcount的测试txt文件 内容为
java python php java golang php java
启动项目会报一个异常
这是因为我们没有装hadoop 但是不耽误我们使用spark 具体解决方案 请百度 很简单 这里不细讲了
出现tomcat日志 JVM日志 则启动成功
访问WordCount接口
得到返回值,与我们文件中的数量一直
查看日志
系统分成了两个任务 执行无异常
项目已上传到gitee
地址: springboot-spark-demo
如果帮到您了,请帮忙点个star