Spark Streaming-Receiver丢弃数据

时间:2015-06-28 15:20:03

标签: apache-spark streaming

我正在使用spark streaming来处理数据。我在每条记录上做一个简单的flatMap,如下所示

package bb;

import java.io.*;
import java.net.*;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URI;
import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.HashMap;
import java.util.Map;


import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.function.*;
import org.apache.spark.broadcast.Broadcast;
import scala.Tuple2;

import org.apache.spark.streaming.*;
import org.apache.spark.streaming.api.java.*;


public class ReceiverTest {

    public static void main(String[] args) throws Exception {

        SparkConf sparkConf = new SparkConf().setAppName("Receiver Test");
        JavaSparkContext sc = new JavaSparkContext(sparkConf);
        JavaStreamingContext jssc = new JavaStreamingContext(sc, new Duration(2000));

        //JavaReceiverInputDStream<String> inputStream = jssc.receiverStream(new JavaCustomReceiver("localhost", 3081));
        JavaReceiverInputDStream<String> inputStream = jssc.socketTextStream("localhost", 3081);


        JavaPairDStream<String, String> bab = inputStream.flatMapToPair(new PairFlatMapFunction<String, String, String>() {
            @Override
            public Iterable<Tuple2<String, String>> call(String t) {

                ArrayList<Tuple2<String, String>> ret = new ArrayList<Tuple2<String, String>>();
                System.out.println(t);
                if (t.length() > 2) return ret;
                for (int i = 0; i < 5; ++i) {
                    String str = t + i;
                    ret.add(new Tuple2("", str));

                    Socket socket = null;
                    PrintWriter pw = null;
                    try {
                        socket=new Socket("spark000",3081);
                        pw = new PrintWriter(socket.getOutputStream());
                        pw.println(str);
                        pw.flush();
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            pw.close();
                            socket.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
                return ret;
            }
        });

        bab.print();

        jssc.start();
        jssc.awaitTermination();
        System.exit(0);
    }
}

对于每个记录s,如果length(s)&lt; = 2,将产生{“s0”,“s1”,“s2”,“s3”,“s4”}。新记录将被发送回套接字服务器进一步处理。

一开始,我向套接字服务器发送“1”。在工作日志中(我使用一台机器,因此只有一名工人),我希望看到以下结果(可能会以不同的顺序): 1 10 11 12 13 14 100 101 102 103 104 110 111 112 ... 143 144

然而,结果如下 1 10 11 12 100 101 102 103 104 110 111 112 113 114 120 121 122 123 124

即在flatMap中不处理“13”和“14”。 我也尝试过自定义接收器(https://spark.apache.org/docs/1.4.0/streaming-custom-receivers.html中的第一个样本)而不是socketTextStream()。该指南说商店(单一记录)不可靠,但商店(多条记录)是可靠的,因此我将该部分改为

while (!isStopped() && (userInput = reader.readLine()) != null) {
    ArrayList<String> lt = new ArrayList<String>();
    lt.add(userInput);
    store(lt.iterator());
} 

但我仍然看到数据丢失。

其实我看到了类似的问题(Spark custom streaming dropping most of the data),但答案似乎没有解决。 谁能发现问题?提前谢谢。

0 个答案:

没有答案