腾讯云EMR&Elasticsearch中使用ES-Hadoop之MR&Hive篇
腾讯云EMR&Elasticsearch中使用ES-Hadoop之Spark篇
通过前面几篇文章的介绍,相信大家已经基本了解了大数据组件结合ES使用的方法。
在该系列文章发布后,后台收到了大量的私信,询问了很多性能调优的问题。比如很多开发者测试Hive,Spark等数据导出写入到ES性能非常慢,百万级别的数据导出需要数小时之久。
在帮助部分开发者调优的过程中发现,固然有小部分case的问题原因是使用的集群规模较小,不能很好地承载大数据场景下高压力高吞吐的写入。但是,更多的case问题,还是因为我们没有对ES-Hadoop的参数做详细的了解及调优,过小的默认参数设置与我们的集群规模及写入吞吐不匹配,导致写入性能不高。
ES-Hadoop的参数非常多,包含了索引setting,mapping,网络,读写等等,其中的一些Advance高级参数非常重要,和我们的读写性能息息相关。这一类参数的默认值,都是假定用户使用的集群是一个在日常应用中常见的规模比较小的集群,但是国内的大数据场景下,动辄几亿用户画像人群数据的场景,如果不对这些参数调优,很难发挥应有的写入性能。
我们以Spark RDD写入ES为例:
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.spark_project.guava.collect.ImmutableList;
import org.spark_project.guava.collect.ImmutableMap;
import org.elasticsearch.spark.rdd.api.java.JavaEsSpark;
import java.util.Map;
import java.util.List;
public class WriteToESUseRDD {
public static void main(String[] args) {
SparkConf conf = new SparkConf().setAppName("my-app").clone()
.set("es.nodes", "10.0.4.17")
.set("es.port", "9200")
.set("es.nodes.wan.only", "true")
.set("es.batch.size.bytes", "30MB")
.set("es.batch.size.entries", "20000")
.set("es.batch.write.refresh", "false")
.set("es.batch.write.retry.count", "50")
.set("es.batch.write.retry.wait", "500s")
.set("es.http.timeout", "5m")
.set("es.http.retries", "50")
set("es.action.heart.beat.lead", "50s");
JavaSparkContext sc = new JavaSparkContext(conf);
Map<String, ?> logs = ImmutableMap.of("clientip", "255.255.255.254",
"request", "POST /write/using_spark_rdd HTTP/1.1",
"status", 200,"size", 802,
"@timestamp", 895435190);
List<Map<String, ?>> list = ImmutableList.of(logs);
JavaRDD<Map<String, ?>> javaRDD = sc.parallelize(list);
JavaEsSpark.saveToEs(javaRDD, "logs-201998/type");
sc.stop();
}
}
可以看到,我们使用set方法设置了非常多的参数,下面就来逐一的介绍:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。