Apache Spark:采用本地方式执行任务
Posted 你是小KS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache Spark:采用本地方式执行任务相关的知识,希望对你有一定的参考价值。
1.声明
当前内容主要为本人学习,内容来源:官方文档
当前内容主要为:
- 基本的官方demo操作,访问本地的Spark(采用spark-core)
- 执行文件读取收集
- 尝试连接CentOS7的Spark
- 执行过程中出现的问题
基本pom依赖:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>2.4.6</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>2.4.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.iotdb</groupId>
<artifactId>spark-iotdb-connector</artifactId>
<version>0.11.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
2.配置访问的master
这里描述:本地使用local
,远程使用spark://ip:7077
3.配置本地访问demo
import java.util.Arrays;
import java.util.List;
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 scala.Tuple2;
public class VisitUrlSpark {
public static void main(String[] args) {
// spark://192.168.1.101:7077
// 使用本地方式访问,官方描述,如果使用测试的话,就使用local
SparkConf conf = new SparkConf().setAppName("My App").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf);
List<Integer> data = Arrays.asList(1, 2, 3, 4, 5);
JavaRDD<Integer> distData = sc.parallelize(data);
int sum = distData.reduce((a, b) -> a + b);
System.out.println("当前计算的总和为:" + sum);
// 开始操作本地的文件
String readFilePath = "resources/data.txt";
JavaRDD<String> lines = sc.textFile(readFilePath);
JavaRDD<Integer> lineLengths = lines.map(s -> s.length());
int totalLength = lineLengths.reduce((a, b) -> a + b);
System.out.println("当前" + readFilePath + "的字符总长度为:" + totalLength);
JavaPairRDD<String, Integer> pairs = lines.mapToPair(s -> new Tuple2(s, 1));
JavaPairRDD<String, Integer> counts = pairs.reduceByKey((a, b) -> a + b);
List<Tuple2<String, Integer>> collect = counts.collect();
System.out.println("当前文件转换为map的结果为" + collect);
}
}
执行结果:
Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapred.FileInputFormat
通过百度搜索,发现问题为:当前的guava-21.0.jar这个包的问题
所以修改spark-core_2.12中并排除guava,最后xml为:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>2.4.6</version>
<scope>provided</scope>
<!--
tried to access method com.google.common.base.Stopwatch.<init>()V
from class org.apache.hadoop.mapred.FileInputFormat
使用低版本的可以解决问题
-->
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>15.0</version>
</dependency>
执行的结果为
执行是成功的!
4.配置远程访问的master(有问题)
1.启动CentOS7中的Spark并指定绑定的ip地址
./sbin/start-master.sh -h 192.168.1.101
此时访问webUI界面
修改master为:spark://192.168.1.101:7077
再次执行:
结果执行报错(如果找到解决办法写在下面)
5.总结
1.按照官方标准,这个spark执行的时候,和那个java的stream的执行方式一样,只有特定的函数才会进行执行
2.使用spark-core可以在本机启动一个spark进行测试使用,需要设置master为local
以上是关于Apache Spark:采用本地方式执行任务的主要内容,如果未能解决你的问题,请参考以下文章
Spark教程——(11)Spark程序本地执行和集群执行的差异