1、Spark是Hadoop生态( B )组件的替代方案。
A. Hadoop B. MapReduce C. Yarn D.HDFS
2、以下( D )不是Spark的主要组件。
A. Driver B. SparkContext C. ClusterManager D. ResourceManager
3、Spark中的Executor是( A )。
A.执行器 B.主节点 C.从节点 D.上下文
4、下面( D )不是Spark的四大组件之一。
A.Spark Streaming B.Spark MLlib
C.Spark GraphX D.Spark R
5、Scala属于哪种编程语言( C )。
A.汇编语言 B.机器语言
C.函数式编程语言 D.多范式编程语言
6、Spark组件中,SparkContext是应用的( C ),控制应用的生命周期。
A.主节点 B.从节点
C.上下文 D.执行器
7、以下( D )不是Spark的主要组件。
A.DAGScheduler B.TaskScheduler
C.SparkContext D.MultiScheduler
8、Spark组件中,ClusterManager是( B )。
A.从节点 B.主节点
C.执行器 D.上下文
9、关于Spark中的RDD说法不正确的是( B )。
A.是弹性分布式数据集 B.是可读可写分区的集合
C.存在容错机制 D.是Spark中最基本的数据抽象
10、GraphX的BSP计算模型中,一个超步中的内容不包括( C )。
A.计算 B.消息传递
C.缓存 D.整体同步点
1、内存计算主要用于处理( 数据密集型 )的计算任务,尤其是数据量极大且需要实时分析处理的应用。
2、Ignite是一个可扩展的、( 容错性好的 )分布式内存计算平台。
3、RDD通过一种名为( 血统 )的容错机制进行错误的时的数据恢复。
4、数据分析栈BDAS包括( Spark SQL )、( Spark Streaming )、 ( Spark GraphX )、 ( MLlib )四个部分。
5、Spark Streaming是建立在Spark上的( 实时计算 )框架,提供了丰富的API、基于内存的高速执行引擎,用户可以结合流式、批处理进行交互式查询应用
1、在硬件、软件、应用与体系等方面,内存计算有哪些主要特性?
答:
2、请与MapReduce相比,Spark的优势有哪些?
答:
3、请描述Pregel计算模型的缺点或局限。
答:
4、请简要描述函数式编程中尾递归的含义。
答:
尾递归是递归的一种优化方法。递归的空间效率很低,当递归深度很深时,容易产生栈溢出的情况。尾递归就是将递归语句写在函数的最底部,这样在每次调用尾递归时,就不需要保存当前状态值,可以直接把当前的状态值传递给下次一次调用,然后清空当前的状态。占用的栈空间就是常量值,不会出现栈溢出的情况。
1、根据用户手机上网的行为记录,基于 Spark设计程序来分别统计不同设备的用户使用的上行总流量以及下行总流量。其中,数据记录的字段描述如下。
序号 |
字段 |
字段类型 |
描述 |
0 |
reportTime |
long |
记录报告时间戳 |
1 |
deviceId |
String |
手机号码 |
2 |
upPackNum |
long |
上行数据包数,单位:个 |
3 |
downPackNum |
long |
下行数据包总数,单位:个 |
数据文件的具体内容(一部分)如下:
1454307391161 77e3c9e1811d4fb291d0d9bbd456bb4b 79976 11496
1454315971161 f92ecf8e076d44b89f2d070fb1df7197 95291 89092
1454304331161 3de7d6514f1d4ac790c630fa63d8d0be 57029 50228
1454303131161 dd382d2a20464a74bbb7414e429ae452 20428 93467
1454319991161 bb2956150d6741df875fbcca76ae9e7c 51994 57706
答:
Step1:将SparkConf封装在一个类中。
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
public class CommSparkContext {
public static JavaSparkContext getsc(){
SparkConf sparkConf = new SparkConf().setAppName("CommSparkContext").setMaster("local");
return new JavaSparkContext(sparkConf);
}
}
Step2:自定义数据类型LogInfo
import java.io.Serializable;
public class LogInfo implements Serializable {
private long timeStamp;
private long upTraffic;
private long downTraffic;
public long getTimeStamp() {
return timeStamp;
}
public void setTimeStame(long timeStame) {
this.timeStamp = timeStame;
}
public long getUpTraffic() {
return upTraffic;
}
public void setUpTraffic(long upTraffic) {
this.upTraffic = upTraffic;
}
public long getDownTraffic() {
return downTraffic;
}
public void setDownTraffic(long downTraffic) {
this.downTraffic = downTraffic;
}
public LogInfo(){
}
public LogInfo(long timeStame, long upTraffic, long downTraffic) {
this.timeStamp = timeStame;
this.upTraffic = upTraffic;
this.downTraffic = downTraffic;
}
}
Step3:自定义key排序类LogSort
import scala.Serializable;
import scala.math.Ordered;
public class LogSort extends LogInfo implements Ordered
private long timeStamp;
private long upTraffic;
private long downTraffic;
@Override
public long getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(long timeStamp) {
this.timeStamp = timeStamp;
}
@Override
public long getUpTraffic() {
return upTraffic;
}
@Override
public void setUpTraffic(long upTraffic) {
this.upTraffic = upTraffic;
}
@Override
public long getDownTraffic() {
return downTraffic;
}
@Override
public void setDownTraffic(long downTraffic) {
this.downTraffic = downTraffic;
}
public LogSort(){
}
public LogSort(long timeStamp, long upTraffic, long downTraffic) {
this.timeStamp = timeStamp;
this.upTraffic = upTraffic;
this.downTraffic = downTraffic;
}
public int compare(LogSort that) {
int comp = Long.valueOf(this.getUpTraffic()).compareTo(that.getUpTraffic());
if (comp == 0){
comp = Long.valueOf(this.getDownTraffic()).compareTo(that.getDownTraffic());
}
if (comp == 0){
comp = Long.valueOf(this.getTimeStamp()).compareTo(that.getTimeStamp());
}
return comp;
}
public boolean $less(LogSort that) {
return false;
}
public boolean $greater(LogSort that) {
return false;
}
public boolean $less$eq(LogSort that) {
return false;
}
public boolean $greater$eq(LogSort that) {
return false;
}
public int compareTo(LogSort that) {
int comp = Long.valueOf(this.getUpTraffic()).compareTo(that.getUpTraffic());
if (comp == 0){
comp = Long.valueOf(this.getDownTraffic()).compareTo(that.getDownTraffic());
}
if (comp == 0){
comp = Long.valueOf(this.getTimeStamp()).compareTo(that.getTimeStamp());
}
return comp;
}
}
Step4:定义主类
import com.kfk.spark.common.CommSparkContext;
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.Function2;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2;
import java.util.List;
public class LogApp {
public static JavaPairRDD
JavaPairRDD
public Tuple2
long timeStamp = Long.parseLong(line.split("\t")[0]);
String diviceId = String.valueOf(line.split("\t")[1]);
long upTraffic = Long.parseLong(line.split("\t")[2]);
long downTraffic = Long.parseLong(line.split("\t")[3]);
LogInfo logInfo = new LogInfo(timeStamp,upTraffic,downTraffic);
return new Tuple2
}
});
return mapToPairRdd;
}
public static JavaPairRDD
JavaPairRDD
public LogInfo call(LogInfo v1, LogInfo v2) throws Exception {
long timeStamp = Math.min(v1.getTimeStamp(), v2.getTimeStamp());
long upTraffic = v1.getUpTraffic() + v2.getUpTraffic();
long downTraffic = v1.getDownTraffic() + v2.getDownTraffic();
LogInfo logInfo = new LogInfo();
logInfo.setTimeStame(timeStamp);
logInfo.setUpTraffic(upTraffic);
logInfo.setDownTraffic(downTraffic);
return logInfo;
}
});
return reduceByKeyRdd;
}
public static JavaPairRDD
JavaPairRDD
public Tuple2
String diviceId = stringLogInfoTuple2._1;
long timeStamp = stringLogInfoTuple2._2.getTimeStamp();
long upTraffic = stringLogInfoTuple2._2.getUpTraffic();
long downTraffic = stringLogInfoTuple2._2.getDownTraffic();
LogSort logSort = new LogSort(timeStamp,upTraffic,downTraffic);
return new Tuple2
}
});
return mapToPairSortRdd;
}
public static void main(String[] args) {
JavaSparkContext sc = CommSparkContext.getsc();
JavaRDD
// rdd map() ->
JavaPairRDD
// mapToPairRdd reduceByKey() ->
JavaPairRDD
// reduceByKeyRdd map() ->
JavaPairRDD
// sortByKey
JavaPairRDD
// TopN
List
for (Tuple2
System.out.println(logSortStringTuple2._2 + " : " + logSortStringTuple2._1.getUpTraffic() + " : " + logSortStringTuple2._1.getDownTraffic());
}
}
}
Step5:使用maven将程序打包成jar包
Step6:将数据文件上传到hdfs
Step7:运行jar包,进行SPARK_HOME/bin目录下,执行下面的操作
./spark-submit –class LogApp –master spark://master:7077 {jar包位置} {hdfs文件地址} {结果输出的地址}
Step8:查看结果
efde893d9c254e549f740d9613b3421c : 1036288 : 629025
84da30d2697042ca9a6835f6ccec6024 : 930018 : 737453
94055312e11c464d8bb16f21e4d607c6 : 827278 : 897382
c2a24d73d77d4984a1d88ea3330aa4c5 : 826817 : 943297
6e535645436f4926be1ee6e823dfd9d2 : 806761 : 613670
92f78b79738948bea0d27178bbcc5f3a : 761462 : 567899
1cca6591b6aa4033a190154db54a8087 : 750069 : 696854
f92ecf8e076d44b89f2d070fb1df7197 : 740234 : 779789
e6164ce7a908476a94502303328b26e8 : 722636 : 513737
537ec845bb4b405d9bf13975e4408b41 : 709045 : 642202