![](/img/trans.png)
[英]Receive streaming data from dataset with custom receiver [Spark Streaming]
[英]How to access metadata stored by Spark Streaming custom receiver?
Spark Streaming提供了创建自定义接收器的功能,详见此处 。 为了将接收器接收的数据存储到Spark中,需要使用store(data)
方法。
我存储到Spark的数据具有与之关联的某些属性。 由自定义接收器扩展的Spark Receiver类提供了表单store(data, metadata)
多种存储方法,这意味着元数据/属性可以与数据一起存储。 下面的代码提取显示了我如何使用此方法来存储数据及其元数据/属性。
public class CustomReceiver extends Receiver<String> {
public CustomReceiver() {
super(StorageLevel.MEMORY_AND_DISK_2());
}
@Override
public void onStart() {
new Thread() {
@Override
public void run() {
try {
receive();
} catch (IOException e) {
restart("Error connecting: ", e);
}
}
}.start();
}
@Override
public void onStop() {
// Not needed as receive() method closes resources when stopped
}
private void receive() throws IOException {
String str = getData();
Map<String, String> metadata = getMetadata();
Iterator<String> it = Arrays.asList(str.split("\n\r")).iterator();
store(it, metadata);
if (isStopped()) {
closeConnections();
}
}
}
从另一个类访问此存储的数据,如以下代码提取中所示:
private void testCustomReceiver() {
JavaDStream<String> custom = ssc.receiverStream(new CustomReceiver());
JavaDStream<String> processedInput = custom.flatMap(row -> {
return Arrays.asList(row.split("\\r?\\n"));
});
processedInput.print();
}
现在我们提出了一个问题 :如何从上面显示的testCustomReceiver()
方法访问与自定义接收器中的数据一起存储的元数据/属性?
我已经尝试搜索文档并在调试器中探索JavaDStream
对象来搜索元数据,但无济于事。 非常感谢您对此事的任何帮助或建议,谢谢。
我一直在寻找Spark代码,我相信你再也无法访问它了。 事实上,我不相信它曾被使用过。
接收器的主管采用metadataOption并将其放入ReceivedBlockInfo(对org.apache.spark.streaming是私有的)。 从那里开始......无处可去。 我在流代码库中找不到ReceivedBlockInfo.metadataOption的引用。 假设有可能将ReceivedBlockInfo序列化然后反序列化为不同的类,或者某些时髦的反射检索元数据,但这两者都是这样的反模式,我不会指望它发生。
为什么会这样? 我相信它的目的是让它成为元数据检查点系统的一部分,但它要么从未被连接过,要么连接到Receiver元数据和流检查点之间的连接。
无论哪种方式,一旦块被放入流中,块元数据就会消失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.