- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的应用程序中将 Spark Streaming 用于多个自定义接收器(2 个接收器用于不同的 UDP 数据套接字,1 个用于 HTTP 数据)。接收者的转换没有任何共同的资源。
当输入数据的数量增加时,我发现这3个接收器不是并行工作,而是一个接一个。
例如,如果我将批处理间隔设置为 20 秒,则每个接收器处理数据大约需要 5 秒,但是如果所有 3 个接收器一起启用,它们的汇总处理时间 = 3 * 5 秒(大约),而不是 5 秒。
所以我创建了这个测试,并看到了同样的情况。Environment: Core i5, 4 cores, 16 GB of memory.
4 个内核的 2 个 UDP 接收器(因此足以接收和处理)。 dstreams 的转换很奇怪并且没有缓存(持久化),但仅用于测试目的
问题:出了什么问题,如何启用并行处理?
Spark web ui 图片显示,接收者的信息一一处理。
@Slf4j
public class SparkApp {
public static void main(String[] args) throws InterruptedException {
SparkConf conf = new SparkConf().setMaster("local[*]")
.setAppName("ParallelReceiver");
// no changes in processing
conf.set("spark.cores.max", "4");
// undocumented, has some effect for parallel processing (spark web ui),
// but not for the whole processing time
conf.set("spark.streaming.concurrentJobs", "10");
JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(1));
RunCalc runCalc1 = new RunCalc(jssc, 5216, 2000, "1");
runCalc1.service();
RunCalc runCalc2 = new RunCalc(jssc, 5217, 2000, "2");
runCalc2.service();
jssc.start();
jssc.awaitTermination();
}
}
@Data
@Slf4j
public class RunCalc {
private final JavaStreamingContext jssc;
private final int port;
private final Integer defaultBitrate;
private final String suff;
public void service() {
// get stream nginx log data from UDP
JavaReceiverInputDStream<NginxRaw> records = jssc.receiverStream(new UdpReceiver(port, defaultBitrate));
records.print();
calc(records, suff);
records.foreachRDD(rdd -> DebugUtil.saveTestDataToDisk(rdd, suff));
}
private void calc(JavaReceiverInputDStream<NginxRaw> records, String suff) {
// first operation
JavaDStream<Integer> reduce = records.filter(r -> r.getChannelName() != null)
.map(NginxRaw::getBytesSent)
.reduce((r1, r2) -> r1 + r2);
reduce.foreachRDD(rdd -> DebugUtil.saveTestDataToDisk(rdd, "reduce" + "-" + suff));
// second operation
JavaPairDStream<String, NginxRaw> uidRawPairs = records.mapToPair(r -> new Tuple2<>(r.getMac()
.toUpperCase(), r))
.window(Durations.minutes(1), Durations.minutes(1));
JavaPairDStream<String, Iterable<NginxRaw>> groups = uidRawPairs.groupByKey();
JavaPairDStream<String, Long> uidSizePairs = groups.mapValues(v -> v.spliterator()
.getExactSizeIfKnown());
uidSizePairs.foreachRDD(rdd -> DebugUtil.saveTestDataToDisk(rdd, "uidSizeWindowCalc" + "-" + suff));
}
}
@Slf4j
public class UdpReceiver extends Receiver<NginxRaw> {
private final int port;
private final int defaultBitrate;
private DatagramSocket socket;
public UdpReceiver(int port, int defaultBitrate) {
super(StorageLevel.MEMORY_AND_DISK());
this.port = port;
this.defaultBitrate = defaultBitrate;
}
@Override
public void onStart() {
new Thread(this::receive).start();
}
@Override
public void onStop() {
}
private void receive() {
try {
log.debug("receive");
log.debug("thread: {}", Thread.currentThread());
String row;
initSocket();
byte[] receiveData = new byte[5000];
// Until stopped or connection broken continue reading
while (!isStopped()) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
socket.receive(receivePacket);
byte[] data = receivePacket.getData();
row = new String(data, 0, receivePacket.getLength());
NginxRaw rawLine = new NginxRaw(row, defaultBitrate);
filterAndSave(rawLine);
}
socket.close();
// Restart in an attempt to connect again when server is active again
log.debug("Trying to connect again");
restart("Trying to connect again");
} catch (ConnectException e) {
// restart if could not connect to server
log.error("Could not connect", e);
reportError("Could not connect: ", e);
restart("Could not connect", e);
} catch (Throwable e) {
// restart if there is any other error
log.error("Error receiving data", e);
reportError("Error receiving data: ", e);
restart("Error receiving data", e);
}
}
/**
* connect to the server
*/
private void initSocket() {
if (socket == null) {
try {
socket = new DatagramSocket(null);
socket.setReuseAddress(true);
socket.setBroadcast(true);
socket.bind(new InetSocketAddress(port));
} catch (SocketException e) {
log.debug("Error = {}", e);
e.printStackTrace();
}
}
}
private void filterAndSave(NginxRaw rawLine) {
if (!rawLine.getMac()
.equals(SyslogRaw.SYSLOG_NOT_FILLED_STRING)
&&
!rawLine.getChannelName()
.equals(SyslogRaw.SYSLOG_NOT_FILLED_STRING)
&& !rawLine.getChannelName()
.equals("vod")
&& !rawLine.getIp()
.equals("127.0.0.1")) {
store(rawLine);
}
}
}
最佳答案
我有一个类似的问题:同一个队列有多个接收器,但数据是串行处理的。
修复方法非常简单:我将所有流合并为一个流!
在我有这个之前:
sizeStream.foreachRDD(rdd -> {
...
});
for (JavaPairDStream<String, Long> dstream : streams) {
dstream.foreachRDD(rdd -> {
...
});
}
JavaPairDStream<String, Long> countStream = streamingContext.union(streams.get(0), streams.subList(1,streams.size()));
JavaPairDStream<String, Tuple2<Long, Long>> joinStream = sizeStream.join(countStream);
joinStream.foreachRDD(rdd -> {
...
});
关于parallel-processing - 多个接收器的 Spark 流并行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48024424/
目前正在学习 Spark 的类(class)并了解到执行者的定义: Each executor will hold a chunk of the data to be processed. Thisc
阅读了有关 http://spark.apache.org/docs/0.8.0/cluster-overview.html 的一些文档后,我有一些问题想要澄清。 以 Spark 为例: JavaSp
Spark核心中的调度器与以下Spark Stack(来自Learning Spark:Lightning-Fast Big Data Analysis一书)中的Standalone Schedule
我想在 spark-submit 或 start 处设置 spark.eventLog.enabled 和 spark.eventLog.dir -all level -- 不要求在 scala/ja
我有来自 SQL Server 的数据,需要在 Apache Spark (Databricks) 中进行操作。 在 SQL Server 中,此表的三个键列使用区分大小写的 COLLATION 选项
所有这些有什么区别和用途? spark.local.ip spark.driver.host spark.driver.bind地址 spark.driver.hostname 如何将机器修复为 Sp
我有大约 10 个 Spark 作业,每个作业都会进行一些转换并将数据加载到数据库中。必须为每个作业单独打开和关闭 Spark session ,每次初始化都会耗费时间。 是否可以只创建一次 Spar
/Downloads/spark-3.0.1-bin-hadoop2.7/bin$ ./spark-shell 20/09/23 10:58:45 WARN Utils: Your hostname,
我是 Spark 的完全新手,并且刚刚开始对此进行更多探索。我选择了更长的路径,不使用任何 CDH 发行版安装 hadoop,并且我从 Apache 网站安装了 Hadoop 并自己设置配置文件以了解
TL; 博士 Spark UI 显示的内核和内存数量与我在使用 spark-submit 时要求的数量不同 更多细节: 我在独立模式下运行 Spark 1.6。 当我运行 spark-submit 时
spark-submit 上的文档说明如下: The spark-submit script in Spark’s bin directory is used to launch applicatio
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6 个月前关闭。 Improve
我想了解接收器如何在 Spark Streaming 中工作。根据我的理解,将有一个接收器任务在执行器中运行,用于收集数据并保存为 RDD。当调用 start() 时,接收器开始读取。需要澄清以下内容
有没有办法在不同线程中使用相同的 spark 上下文并行运行多个 spark 作业? 我尝试使用 Vertx 3,但看起来每个作业都在排队并按顺序启动。 如何让它在相同的 spark 上下文中同时运行
我们有一个 Spark 流应用程序,这是一项长期运行的任务。事件日志指向 hdfs 位置 hdfs://spark-history,当我们开始流式传输应用程序时正在其中创建 application_X
我们正在尝试找到一种加载 Spark (2.x) ML 训练模型的方法,以便根据请求(通过 REST 接口(interface))我们可以查询它并获得预测,例如http://predictor.com
Spark newb 问题:我在 spark-sql 中进行完全相同的 Spark SQL 查询并在 spark-shell . spark-shell版本大约需要 10 秒,而 spark-sql版
我正在使用 Spark 流。根据 Spark 编程指南(参见 http://spark.apache.org/docs/latest/programming-guide.html#accumulato
我正在使用 CDH 5.2。我可以使用 spark-shell 运行命令。 如何运行包含spark命令的文件(file.spark)。 有没有办法在不使用 sbt 的情况下在 CDH 5.2 中运行/
我使用 Elasticsearch 已经有一段时间了,但使用 Cassandra 的经验很少。 现在,我有一个项目想要使用 Spark 来处理数据,但我需要决定是否应该使用 Cassandra 还是
我是一名优秀的程序员,十分优秀!