持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
spark 简介和安装
首先我们下载一下scala, hadoop的环境安装在前文的几个部分已经有介绍,这里就不再多言了。 找到官网:www.scala-lang.org/download/2.… 点击下载以后解压。之后编辑一下配置
#编辑配置文件
vim ~/.bash_profile
#增加环境变量
SCALA_HOME=/Users/xxx/Documents/Develop/scala-2.11.12
export PATH=$PATH:$SCALA_HOME/bin
#使环境变量生效
source ~/.bash_profile
然后查看一下:
scala -version
在 镜像站下载一下spark mirrors.bfsu.edu.cn/apache/spar… 执行如下命令打开配置文件:
source ~/.bash_profile
添加如下配置
export SPARK_HOME=你的spark路径
export PATH=$PATH:$SPARK_HOME/bin
使用下述命令使配置生效
source ~/.bash_profile
使用spark-shell就可以启动:
用浏览器访问http://localhost:4040/jobs/ 可以查看spark的任务信息;
spark rdd-api简单研究
RDD,是 Spark 中最基础的抽象。它表示了一个可以并行操作的、不可变的、被分区了的元素集合。用户不需要关心底层复杂的抽象处理,直接使用方便的算子处理和计算就可以了
首先我们要研究一下spark rdd-api的一些简单的运用,只有了解了api才好进行下面的计算。
flatMap方法:
public static void flatMap() {
final List<String> list = Arrays.asList("BANNA APPLE", "MElON ORANGE");
final JavaRDD<String> rdd = sc.parallelize(list);
System.out.println("Lambda表达式实现:");
rdd.flatMap(names -> Arrays.asList(names.split(" ")).iterator())
.map(name -> "Hello " + name)
.foreach(name -> println(name));
}
rdd.flatMap主要用于处理原来的初始JavaRDD,输入输出为一比多
运行的结果如下
mapToPair方法 以及aggregateByKey方法:
final List<String> list = Arrays.asList("you,jump", "i,jump");
final JavaRDD<String> rdd = sc.parallelize(list);
System.out.println("Lambda表达式实现:");
rdd.flatMap(lines -> Arrays.asList(lines.split(",")).iterator())
.mapToPair(word -> new Tuple2<>(word, 1))
.aggregateByKey(0, (v1, v2) -> v1 + v2, (v1, v2) -> v1 + v2)
.foreach(v -> println(v._1 + " -> " + v._2));
}
mapToPair方法 返回Tuple类型的数据,把原有的 rdd类型返回为 javaPairRdd,对数据进行初步的处理。 aggregateByKey()是先对每个partition中的数据根据不同的Key进行aggregate,然后将结果进行shuffle,完成各个partition之间的aggregate。
方法进行了一个简单的统计。上文的两个rdd方法已经可以支持我们完成这次需要的功能。
spark rdd-索引
首先我们创建好spark rdd的上下文:
//创建sparkconf 和JavaSparkContext
public static SparkConf conf = new SparkConf().setMaster("local").setAppName("test");
public static JavaSparkContext sc = new JavaSparkContext(conf);
然后通过地址把数据导入我们的javaRdd 也就是spark的java rddapi数据结构:
String input = "/Users/xuejiameng/java_big_data/spark/data/";
JavaRDD<String> unionrdd = sc.emptyRDD();
JavaPairRDD<String, String> wordFileNameRDD = null;
int num =0;
while (num<=2){
String file_name = input+num; //文件名称
JavaRDD<String> rdd1 = sc.textFile(file_name);
int fileName = num;
//4.将遍历的多个rdd拼接成1个Rdd
unionrdd=unionrdd.union(rdd1);;
wordFileNameRDD=
unionrdd.flatMap(lines -> Arrays.asList(lines.split(" ")).iterator()).mapToPair(word -> new Tuple2<>(word,String.valueOf(fileName)));
num++;
}
导入以后把文件的名称直接拼在我们的数据后面
JavaPairRDD<Tuple2<String, String>, Integer> wordFileNameCountPerPairs = wordFileNameRDD.mapToPair(wordFileNamePair -> new Tuple2<>(wordFileNamePair, 1))
.reduceByKey(Integer::sum);
JavaPairRDD<String, Tuple2<String, Integer>> wordCountPerFileNamePairs = wordFileNameCountPerPairs.mapToPair(wordFileNameCountPerPair -> new Tuple2<>(wordFileNameCountPerPair._1._1, new Tuple2<>(wordFileNameCountPerPair._1._2, wordFileNameCountPerPair._2)));
JavaPairRDD<String, String> result = wordCountPerFileNamePairs.groupByKey().mapToPair(wordCountPerFileNamePairIterator -> new Tuple2<>(wordCountPerFileNamePairIterator._1, StringUtils.join(wordCountPerFileNamePairIterator._2.iterator(), ','))).sortByKey();
然后计算,文件中出现的词频,以及文件的顺序进行倒排
然后最后打印出我们的结果:
结果如图所示
打包jar以后运行:
./spark-submit --class Test.Test
--master spark://你的ip:7077
--deploy-mode cluster
/Users/xuejiameng/java_big_data/spark/out/artifacts/test/test.jar
首先我尝试了使用Structure的artifacts 打jar 包,一直报一个异常:
Error: Failed to load class Test.
找了很多办法也难以解决,直接在pom文件下添加:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
然后用maven package打包运行
./spark-submit --class Test.SparkCount --master spark://192.168.2.40:7077 /Users/xuejiameng/java_big_data/spark/target/spark-1.0-SNAPSHOT.jar
直接就运行成功了。有时候网上找的这些文章可能是比较过时的,要举一反三,利用平时经验进行汇总使用。