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

来源:互联网 发布:php会员卡系统源码 编辑:程序博客网 时间:2024/06/02 03:16

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临时表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.相关文档参考

  • https://www.elastic.co/guide/en/elasticsearch/hadoop/current/spark.html
原创粉丝点击