一:准备开发环境
1. 启动HDFS,如下图所示:
通过web端查看节点正常启动,如下图所示:
2. 启动Spark集群,如下图所示:
通过web端查看集群启动正常,如下图所示:
3. 启动start-history-server.sh,如下图所示:
二:案例实战
package com.dt.spark.SparkApps.sparkstreaming;
import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
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.streaming.Durations;
import org.apache.spark.streaming.api.java.*;
import scala.Tuple2;
import java.util.Arrays;
public class SparkStreamingOnHDFS {
public static void main(String[] args){
final SparkConf conf = new SparkConf().setMaster("spark://Master:7077").setAppName("SparkOnStreamingOnHDFS");
// JavaStreamingContext jsc = new JavaStreamingContext(conf, Durations.seconds(5));//Durations.seconds(5)设置每隔5秒
final String checkpointDirectory = "hdfs://Master:9000/library/SparkStreaming/Checkpoint_Data";
JavaStreamingContextFactory factory = new JavaStreamingContextFactory() {
@Override
public JavaStreamingContext create() {
return createContext(checkpointDirectory,conf);
}
};
JavaStreamingContext jsc = JavaStreamingContext.getOrCreate(checkpointDirectory, factory);
//指定从HDFS中监控的目录
JavaDStream lines = jsc.textFileStream("hdfs://Master:9000/library/SparkStreaming/Data");
JavaDStream words = lines.flatMap(new FlatMapFunction,String>() {
public Iterable call(String line) throws Exception {
return Arrays.asList(line.split(" "));
}
});
JavaPairDStream,Integer> pairs = words.mapToPair(new PairFunction, String, Integer>() {
public Tuple2, Integer> call(String word) throws Exception {
return new Tuple2,Integer>(word,1);
}
});
JavaPairDStream,Integer> wordscount = pairs.reduceByKey(new Function2, Integer, Integer>() {
public Integer call(Integer v1, Integer v2) throws Exception {
return v1 + v2;
}
});
wordscount.print();
jsc.start();
jsc.awaitTermination();
jsc.close();
}
private static JavaStreamingContext createContext(String checkpointDirectory,SparkConf conf){
System.out.println("Creating new context");
SparkConf = conf;
JavaStreamingContext ssc = new JavaStreamingContext(sparkConf,Durations.seconds(5));
ssc.checkpoint(checkpointDirectory);
return ssc;
}
}
集群运行
1. 创建目录
2. 脚本运行
脚本内容如下:
此时Spark Streaming会每隔5秒执行一次,不断的扫描监控目录下是否有新的文件。
3. 上传文件到HDFS中的Data目录下
4. 输出结果
三:Spark Streaming on HDFS源码解密
1. JavaStreamingContextFactory的create方法可以创建JavaStreamingContext
2. 而我们在具体实现的时候覆写了该方法,内部就是调用createContext方法来具体实现。上述实战案例中我们实现了createContext方法。
trait JavaStreamingContextFactory {
def create(): JavaStreamingContext
}
3. checkpoint:
一方面:保持容错
一方面保持状态
在开始和结束的时候每个batch都会进行checkpoint
def checkpoint(directory: String) {
ssc.checkpoint(directory)
}
4. remember:
流式处理中过一段时间数据就会被清理掉,但是可以通过remember可以延长数据在程序中的生命周期,另外延长RDD更长的时间。
应用场景:
假设数据流进来,进行ML或者Graphx的时候有时需要很长时间,但是bacth定时定条件的清除RDD,所以就可以通过remember使得数据可以延长更长时间。
def remember(duration: Duration) {
ssc.remember(duration)
}
5. 在JavaStreamingContext中,getOrCreate方法源码如下:
如果设置了checkpoint ,重启程序的时候,getOrCreate()会重新从checkpoint目录中初始化出StreamingContext。
@deprecated("use getOrCreate without JavaStreamingContextFactor", "1.4.0")
def getOrCreate(
checkpointPath: String,
factory: JavaStreamingContextFactory
): JavaStreamingContext = {
val ssc = StreamingContext.getOrCreate(checkpointPath, () => {
factory.create.ssc
})
new JavaStreamingContext(ssc)
}
异常问题思考:
为啥会报错?
1. Streaming会定期的进行checkpoint。
2. 重新启动程序的时候,他会从曾经checkpoint的目录中,如果没有做额外配置的时候,所有的信息都会放在checkpoint的目录中(包括曾经应用程序信息),因此下次再次启动的时候就会报错,无法初始化ShuffleDStream。
1. 启动HDFS,如下图所示:
通过web端查看节点正常启动,如下图所示:
2. 启动Spark集群,如下图所示:
通过web端查看集群启动正常,如下图所示:
3. 启动start-history-server.sh,如下图所示:
二:案例实战
package com.dt.spark.SparkApps.sparkstreaming;
import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
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.streaming.Durations;
import org.apache.spark.streaming.api.java.*;
import scala.Tuple2;
import java.util.Arrays;
public class SparkStreamingOnHDFS {
public static void main(String[] args){
final SparkConf conf = new SparkConf().setMaster("spark://Master:7077").setAppName("SparkOnStreamingOnHDFS");
// JavaStreamingContext jsc = new JavaStreamingContext(conf, Durations.seconds(5));//Durations.seconds(5)设置每隔5秒
final String checkpointDirectory = "hdfs://Master:9000/library/SparkStreaming/Checkpoint_Data";
JavaStreamingContextFactory factory = new JavaStreamingContextFactory() {
@Override
public JavaStreamingContext create() {
return createContext(checkpointDirectory,conf);
}
};
JavaStreamingContext jsc = JavaStreamingContext.getOrCreate(checkpointDirectory, factory);
//指定从HDFS中监控的目录
JavaDStream lines = jsc.textFileStream("hdfs://Master:9000/library/SparkStreaming/Data");
JavaDStream words = lines.flatMap(new FlatMapFunction,String>() {
public Iterable call(String line) throws Exception {
return Arrays.asList(line.split(" "));
}
});
JavaPairDStream,Integer> pairs = words.mapToPair(new PairFunction, String, Integer>() {
public Tuple2, Integer> call(String word) throws Exception {
return new Tuple2,Integer>(word,1);
}
});
JavaPairDStream,Integer> wordscount = pairs.reduceByKey(new Function2, Integer, Integer>() {
public Integer call(Integer v1, Integer v2) throws Exception {
return v1 + v2;
}
});
wordscount.print();
jsc.start();
jsc.awaitTermination();
jsc.close();
}
private static JavaStreamingContext createContext(String checkpointDirectory,SparkConf conf){
System.out.println("Creating new context");
SparkConf = conf;
JavaStreamingContext ssc = new JavaStreamingContext(sparkConf,Durations.seconds(5));
ssc.checkpoint(checkpointDirectory);
return ssc;
}
}
集群运行
1. 创建目录
2. 脚本运行
脚本内容如下:
此时Spark Streaming会每隔5秒执行一次,不断的扫描监控目录下是否有新的文件。
3. 上传文件到HDFS中的Data目录下
4. 输出结果
三:Spark Streaming on HDFS源码解密
1. JavaStreamingContextFactory的create方法可以创建JavaStreamingContext
2. 而我们在具体实现的时候覆写了该方法,内部就是调用createContext方法来具体实现。上述实战案例中我们实现了createContext方法。
trait JavaStreamingContextFactory {
def create(): JavaStreamingContext
}
3. checkpoint:
一方面:保持容错
一方面保持状态
在开始和结束的时候每个batch都会进行checkpoint
def checkpoint(directory: String) {
ssc.checkpoint(directory)
}
4. remember:
流式处理中过一段时间数据就会被清理掉,但是可以通过remember可以延长数据在程序中的生命周期,另外延长RDD更长的时间。
应用场景:
假设数据流进来,进行ML或者Graphx的时候有时需要很长时间,但是bacth定时定条件的清除RDD,所以就可以通过remember使得数据可以延长更长时间。
def remember(duration: Duration) {
ssc.remember(duration)
}
5. 在JavaStreamingContext中,getOrCreate方法源码如下:
如果设置了checkpoint ,重启程序的时候,getOrCreate()会重新从checkpoint目录中初始化出StreamingContext。
@deprecated("use getOrCreate without JavaStreamingContextFactor", "1.4.0")
def getOrCreate(
checkpointPath: String,
factory: JavaStreamingContextFactory
): JavaStreamingContext = {
val ssc = StreamingContext.getOrCreate(checkpointPath, () => {
factory.create.ssc
})
new JavaStreamingContext(ssc)
}
异常问题思考:
为啥会报错?
1. Streaming会定期的进行checkpoint。
2. 重新启动程序的时候,他会从曾经checkpoint的目录中,如果没有做额外配置的时候,所有的信息都会放在checkpoint的目录中(包括曾经应用程序信息),因此下次再次启动的时候就会报错,无法初始化ShuffleDStream。
主编辑:王家林
资料来源于:DT_大数据梦工厂(IMF传奇行动绝密课程)
更多私密内容,请关注微信公众号:DT_Spark
如果您对大数据Spark感兴趣,可以免费听由王家林老师每天晚上20:00开设的Spark永久免费公开课,YY房间号:68917580
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31133864/viewspace-2086388/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31133864/viewspace-2086388/