我正在进行编程以处理从Apache kafka到elasticsearch的数据。为此,我使用的是Apache Spark。我已经经历了很多链接,但无法找到将Apache Spark中的JavaDStream数据写入elasticsearch的示例。
下面是spark的示例代码,它从kafka获取数据并打印出来。
import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import scala.Tuple2;
import kafka.serializer.StringDecoder;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.*;
import org.apache.spark.streaming.api.java.*;
import org.apache.spark.streaming.kafka.KafkaUtils;
import org.apache.spark.streaming.Durations;
import org.elasticsearch.spark.rdd.api.java.JavaEsSpark;
import com.google.common.collect.ImmutableMap;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import java.util.List;
public class SparkStream {
public static JavaSparkContext sc;
public static List<Map<String, ?>> alldocs;
public static void main(String args[])
{
if(args.length != 2)
{
System.out.println("SparkStream <broker1-host:port,broker2-host:port><topic1,topic2,...>");
System.exit(1);
}
Logger.getLogger("org").setLevel(Level.OFF);
Logger.getLogger("akka").setLevel(Level.OFF);
SparkConf sparkConf=new SparkConf().setAppName("Data Streaming");
sparkConf.setMaster("local[2]");
sparkConf.set("es.index.auto.create", "true");
sparkConf.set("es.nodes","localhost");
sparkConf.set("es.port","9200");
JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, Durations.seconds(2));
Set<String> topicsSet=new HashSet<>(Arrays.asList(args[1].split(",")));
Map<String,String> kafkaParams=new HashMap<>();
String brokers=args[0];
kafkaParams.put("metadata.broker.list",brokers);
kafkaParams.put("auto.offset.reset", "largest");
kafkaParams.put("offsets.storage", "zookeeper");
JavaPairDStream<String, String> messages=KafkaUtils.createDirectStream(
jssc,
String.class,
String.class,
StringDecoder.class,
StringDecoder.class,
kafkaParams,
topicsSet
);
JavaDStream<String> lines = messages.map(new Function<Tuple2<String, String>, String>() {
@Override
public String call(Tuple2<String, String> tuple2) {
return tuple2._2();
}
});
lines.print();
jssc.start();
jssc.awaitTermination();
}
}
`
答案 0 :(得分:0)
保存为弹性搜索的一种方法是在saveToEs
函数中使用foreachRDD
方法。您希望使用的任何其他方法仍然需要{d}调用您的dstream。
例如:
foreachRDD
答案 1 :(得分:0)
dstream.foreachRDD{rdd=>
val es = sqlContext.createDataFrame(rdd).toDF("use headings suitable for your dataset")
import org.elasticsearch.spark.sql._
es.saveToEs("wordcount/testing")
es.show()
}
在此代码块&#34; dstream&#34;是从kafka服务器观察数据的数据流。 &#34; toDF()&#34;的括号内你必须使用标题。在&#34; saveToES()&#34;你有使用elasticsearch索引。在此之前,您已经创建了SQLContext。
val sqlContext = SQLContext.getOrCreate(SparkContext.getOrCreate())
如果您使用kafka发送数据,则必须添加下面提到的依赖性
libraryDependencies += "org.apache.kafka" % "kafka-clients" % "0.10.2.1"
在这个例子中,首先你需要创建kafka producer&#34; test&#34;然后开始elasticsearch 运行程序后。您可以使用上面的url查看完整的sbt和代码。