核心内容:
1、Java开发Spark程序(本地模式)
2、Maven使用的相关注意事项
今天学习了用Java开发Spark程序,果然是非常的麻烦,但是相比于Hadoop中的MapReduce还是简单很多。好吧,直接贴代码:
Spark本地模式下的开发程序:
package com.appache.SparkOfJava;
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 org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import scala.Tuple2;
import scala.actors.threadpool.Arrays;
/**
* Created by hp on 2016/11/22.
* 本地模式下开发Spark程序:WordCount
*/
public class WordCount
{
public static void main(String[] args)
{
//先设置相关的信息
SparkConf conf = new SparkConf();
conf.setAppName("WordCountOfSpark");
conf.setMaster("local");
//获取对Spark操作的客户端实例对象SparkContext
JavaSparkContext sc = new JavaSparkContext(conf);
//进行Spark中RDD的相关操作
//1、读取日志中的行数据、并封装成一个RDD
JavaRDD<String> lines = sc.textFile("C:\\word.txt", 1);
//2、依次拿到日志中的每一行数据,切分字段,最终得到单词集合words
JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() //创建匿名类对象之实现接口
{ //FlatMapFunction<String, String>的含义……
@Override
public Iterable<String> call(String line) throws Exception {
//拿到日志中的一行数据,切分各个字段,得到一个字符串数组Array[String]
String[] splited = line.split(" ");
//将字符串数组返回:Array(Array[String],Array[String])
return Arrays.asList(splited);
//经过flat操作之后变为Array[String]
}
});
//3、对每一个单词进行计数为1
JavaPairRDD<String, Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() { //Array[String]->Array[(String,Integer)]
@Override //对每一个单词计数为1
public Tuple2<String, Integer> call(String word) throws Exception {
return new Tuple2<String, Integer>(word, 1);
}
});
//4、统计文件中每一个单词出现的总次数
JavaPairRDD<String, Integer> wordCounts = pairs.reduceByKey(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer a, Integer b) throws Exception {
return a + b;
}
});
//5、将统计的最终结果进行输出
wordCounts.foreach(new VoidFunction<Tuple2<String, Integer>>()
{
@Override
public void call(Tuple2<String, Integer> wordnum) throws Exception
{
System.out.println(wordnum._1+"\t"+wordnum._2);
}
});
sc.close();
}
}
运行结果:
Spark 1
you 2
Hello 4
hello 2
baby 1
me 1
Hadoop 1
在程序的编写过程中涉及到了一些内容,在这里面说明一下:
由上面的程序我们可以看出,由于在Java当中没有实现高阶函数,导致我们只能去通过创建匿名类对象去实现相同的功能,但是这一点确实让我们感觉很不舒服,因为有的时候我们只对方法的参数和方法的内部实现感兴趣,对诸如匿名类、方法的名称、函数的回调等等并不感兴趣,但是这里恰恰突出了Scala语言面向函数式编程的优势。
还有就是:在Spark程序的编写过程中,整个数据集是被RDD封装的,即RDD说白了就是数据集嘛。
接下来我们将Maven使用的相关注意事项总结一下:
Maven是一个通用的管理包依赖的工具,Maven会自动帮助我们下载相应的依赖包,在Maven的使用过程中,需要配置pom.xml文件添加程序开发时候 的相关依赖,并配置具体的build打包的信息。
在这里面在说一下Spark Sql与Hive的关系:
我们后面用Spark Sql的时候会用Hive做数据仓库来存储数据,Spark Sql不能取代Hive的原因:
我们的Hive包含两部分:
1、一部分是计算引擎:Spark Sql取代的只是计算引擎。
2、另外一部分是存储引擎:所谓存储引擎就是数据仓库层面。Hive的数据仓库的存储引擎还是不错的。
在废话一句:任务倾斜是很重要的!