我正在使用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),但答案似乎没有解决。 谁能发现问题?提前谢谢。