如何访问Spark Streaming自定义接收器存储的元数据?

时间:2016-02-08 13:50:34

标签: java apache-spark spark-streaming

Spark Streaming提供了创建自定义接收器的功能,详见here。要将接收器接收的数据存储到Spark中,需要使用store(data)方法。

我存储到Spark的数据具有与之关联的某些属性。由自定义接收器扩展的Spark Receiver class提供了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对象来搜索元数据,但无济于事。非常感谢您对此事的任何帮助或建议,谢谢。

1 个答案:

答案 0 :(得分:0)

我一直在研究Spark代码,并且我相信您无法再访问它。实际上,我认为它从未使用过。

Receiver的主管将metadataOption拖放到ReceivedBlockInfo(这是org.apache.spark.streaming专用的)中。从那里开始……无处可去。我在流式代码库中找不到对ReceivedBlockInfo.metadataOption的引用。假设有可能先将ReceivedBlockInfo序列化然后反序列化为另一个类,或者某些时髦的反射会检索元数据,但是这两种都是反模式,我不希望它发生。

为什么在那儿?我相信其意图是使其成为Metadata Checkpointing系统的一部分,但它要么从未被挂钩,要么Receiver元数据与流检查点之间的连接被切断了。

无论哪种方式,一旦将块放入流中,块元数据都将消失。