我正在尝试使用Apache spark在Elastic搜索中创建索引(将大量数据写入ES)。我已经完成了一个Scala程序来使用Apache spark创建索引。我必须索引大量数据,这是我的LinkedList中的产品bean。然后。然后我试图遍历产品bean列表并创建索引。我的代码如下。
val conf = new SparkConf().setAppName("ESIndex").setMaster("local[*]")
conf.set("es.index.auto.create", "true").set("es.nodes", "127.0.0.1")
.set("es.port", "9200")
.set("es.http.timeout", "5m")
.set("es.scroll.size", "100")
val sc = new SparkContext(conf)
//Return my product bean as a in a linkedList.
val list: util.LinkedList[product] = getData()
for (item <- list) {
sc.makeRDD(Seq(item)).saveToEs("my_core/json")
}
这种方法的问题是花费太多时间来创建索引。 有没有办法以更好的方式创建索引?
答案 0 :(得分:3)
除非有必要,否则不要通过驱动程序传递数据。根据从getData
返回的数据来源,您应该使用相关的输入法或创建自己的输入法。如果数据来自MongoDB,请使用例如mongo-hadoop
,Spark-MongoDB
或Drill with JDBC connection。然后使用map
或类似方法构建所需对象,并在转换后的RDD上使用saveToEs
。
使用单个元素创建RDD并不合理。它根本不受Spark架构的影响。您只需启动潜在的大量任务,而这些任务只有一个活动的执行程序。