sparksql读写elasticsearch
sparksql将elasticsearch数据转换成RDD进行计算,测试下sparksql对elasticsearch的读和写的操作。
1环境
1.1软件环境
- hadoop 2.7.3
- spark 2.2
- elasticsearch 5.6.4
- jdk 1.8
1.2机器环境
节点 | 配置 | 组件 | 角色 |
---|---|---|---|
node11 | 24core、16g、1块硬盘、千兆网卡 | hadoop、es、spark | namoenode、datanode、resourcemanager、nodemanager、es、spark |
node19 | 24core、16g、1块硬盘、千兆网卡 | hadoop、es | datanode、nodemanager、es |
1.3相关
需要下载spark-elasticsearch支持包
https://www.elastic.co/downloads/past-releases/elasticsearch-apache-hadoop-5-6-5
将里面的elasticsearch-spark-20_2.11-5.6.4.jar放到spark/jars下面。
2.写入操作
- 启动sparksql
sbin/start-thriftserver.sh --master yarn \
--driver-cores 2 --driver-memory 2g \
--executor-cores 13 --executor-memory 8g \
--num-executors 3 --conf spark.sql.warehouse.dir=hdfs://node11:9000/user/hive/warehouse
- sparksql中创建textfile表,并导入测试数据
导入的文本数据2.2G大小,变为3个字段为6.6G
##创建textfile表
create table test_txt1 (f1 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\r' STORED AS TEXTFILE;
##加载测试数据
load data local inpath '/opt/pass.txt' into table test_txt1;
- 初始化一个es index
es相关可看这里,
http://blog.csdn.net/dante_003/article/details/78563303
http://blog.csdn.net/dante_003/article/details/78501066
并向里面导入数据,不导入数据的话,在sparksql里面创建es临时表会出现资源不存在的错误信息。
PUT http://node11:9200/es_test1/testtype/1?
{
"f1":"test",
"f2":"test",
"f3":"test",
}
##curl命令
curl -XPUT "http://node11:9200/test_es1/testtype/1" -d '{"f1":"test"}'
- sparksql操作
# 创建elasticsearch临时表,es的地址在创建表时指定
CREATE TEMPORARY TABLE myIndex1 USING org.elasticsearch.spark.sql OPTIONS ( resource 'test_es1/testtype', nodes 'http://node11:9200,http://node19:9200');
# 向其中导入数据
insert into myIndex1 select * from test_txt1;
任务进行中的截图
spark任务的详细信息
硬件监控
任务结束后的截图
es-head信息
spark任务信息
由此可见,使用sparksql向es中写入数据的时候,会占用大量的CPU来创建索引,一个字符串字段建立一个索引,此测试环境中写入速度为500KB/S,4.6万条/S
数据增长7倍(不算副本),原始数据2.2G,导入到es中变为15.6G
3.读操作
#内连接查询,测试从es读取速度
select count(*) from test_txt2 t1,myIndex1 t2 where t1=t2;
任务进行中的截图
spark任务信息
spark任务详细信息
硬件监控
PS:hadoop、spark用的都是hostname,elasticsearch配置以及sparksql中指定的主机用的也都是hostname,没有用IP。
stage8是加载textfile的数据到内存,stage9是加载elasticsearch的数据,stage9加载数据的本地级别为“RACK_LOCAL”而不是“NODE_LOCAL”,这时观测流量和硬盘读写情况,网络一直有流量,可以判断sparksql从elasticsearch拿数据并没有遵从”本地数据本地计算”的分布式原则,所以这种计算速度低下。
4.结论
- 写操作
- 会占用大量cpu创建es的索引
- 数据体积是原始数据的7倍(不算副本)
- 读操作
- 即使spark的执行节点在es的数据节点上,也不会加载本地数据计算,不是”本地数据本地计算”