标签:apache-spark spark-streaming java
这是一个非常简单的问题:
我通过以下方式使用Spark Streaming:
private static int count=0;
public static void main(String[] args) throws Exception {
if (args.length < 2) {
System.err.println("Usage: sparkstreaminggetjson <hostname> <port>");
System.exit(1);
}
SparkConf sparkConf = new
SparkConf().setMaster("local[2]").setAppName("sparkstreaminggetjson");
JavaSparkContext sc=new JavaSparkContext(sparkConf);
JavaStreamingContext ssc = new JavaStreamingContext(sparkConf,
Durations.seconds(1));
JavaReceiverInputDStream<String> lines = ssc.socketTextStream(
args[0],Integer.parseInt(args[1]), StorageLevels.MEMORY_AND_DISK_SER);
count=count+1;
lines.print;
ssc.start();
ssc.awaitTermination();
}
每当新的“批处理时间”开始时,变量行就会从套接字获取一个新值并进行打印,并且变量计数增加1.
我的问题是:现在,我在main()之外声明了count,因为如果我这样做的话
public static void main(String[] args) throws Exception {
if (args.length < 2) {
System.err.println("Usage: sparkstreaminggetjson <hostname> <port>");
System.exit(1);
}
//declare count here
int count=0;
SparkConf sparkConf = new
SparkConf().setMaster("local[2]").setAppName("sparkstreaminggetjson");
JavaSparkContext sc=new JavaSparkContext(sparkConf);
JavaStreamingContext ssc = new JavaStreamingContext(sparkConf,
Durations.seconds(1));
JavaReceiverInputDStream<String> lines = ssc.socketTextStream(
args[0],Integer.parseInt(args[1]), StorageLevels.MEMORY_AND_DISK_SER);
count=count+1;
lines.print;
ssc.start();
ssc.awaitTermination();
}
每次新的批处理时间开始时,变量计数都会重置为0,因此它基本上像while循环一样工作.
我有什么方法可以在main()方法中声明count,以使Spark Streaming循环不会将其重置为0?如果是这样,我在哪里声明呢?
基本上,我想知道是否在创建Spark上下文时使整个main()方法的行为类似于while循环,或者是否存在该循环开始的特定位置.
非常感谢您,我希望我不要感到困惑.
解决方法:
不可以.SparkStreaming不会在“主”上执行“ while循环”. Spark Streaming使用调度程序以提供的批处理间隔触发注册的output operators.
这些输出运算符将在每个批处理间隔触发基础RDD的实现.在此实现过程中,将在Spark集群中执行RDD操作.
与群集中序列化的任何代码交互的全局静态变量的使用将导致意外行为.
Spark是一个分布式计算框架,其操作针对该目标.经典的转换(例如“ map”,“ filter”,…)将对分布在集群中各个节点上的数据片段执行.
Spark中“全局变量”的最接近等效项是broadcast variables,但不能在闭包中进行更新.
从提供的代码中,我了解到这是了解Spark Streaming模型的初步实验.花一些时间研究related material,以完全了解它的工作方式.在这种特殊情况下,增加静态变量仅在本地模式下有效,因为所有代码都在同一JVM上执行,但这不是Spark Streaming的目标.
标签:apache-spark,spark-streaming,java
来源: https://codeday.me/bug/20191118/2031330.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。