spark-sql(四)---读写elasticsearch数据

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机器环境
节点配置组件角色
node1124core、16g、1块硬盘、千兆网卡hadoop、es、sparknamoenode、datanode、resourcemanager、nodemanager、es、spark
node1924core、16g、1块硬盘、千兆网卡hadoop、esdatanode、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;
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的数据节点上,也不会加载本地数据计算,不是”本地数据本地计算”

5.相关文档参考

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值