第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密
博客详情 请查看链接 http://blog.sina.com.cn/s/blog_686c3cfb0102wbp8.html
一:准备开发环境
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

浙公网安备 33010602011771号