Elasticsearch hadoop使用示例 & 运维实战之集群规划 &presto-elasticsearch connector

elasticsearch-hadoop使用示例

在elasticsearch-hadoop的具体使用中碰到了几个问题,有必要记录一下,避免下次遇到时又要重新研究。

利用spark读取es数据源的简单示例

import org.elasticsearch.spark.sql._

val esOptions = Map("es.nodes"->"192.168.1.2,192.168.1.3", "es.scroll.size"->"1000", "es.field.read.as.array.include"->"SampleField")

val esDF = sqlContext.read.format("org.elasticsearch.spark.sql").options(esOptions).load("sampleindex/es-spark")

esDF.registerTempTable("esdemotbl")

es.scroll.size 一次性读入的记录数,默认是10, 如果不设置为大一点的值,要从es中读取1亿条数据,那将是一个漫长的过程

es.field.read.as.array.include 有的字段在es中是以string类型存储,但其中包含逗号(,), spark默认认为这是数组类型,如果读取这种字段的话,就会报错,怎么办,那就用es.field.read.as.array.include来显式指明

spark读取es中数据的时候,partition数目取决于es中指定index的shard数目,为了获得比较高的并发读取性能,建议适当设置shard数目,为什么是适当,因为具体取决于集群规模等多种因素。

字段名的大小写问题

在hive中,字段名是_大小写不敏感_的, 但在ES中是大小写敏感的

你说,这又怎么样。 呵呵, 这意味着不做特殊处理,永远无法读出es中大写字段名的内容,你看到的将是满屏的_NULL_

这该怎么破,很简单,指定 es.mapping.names

比如在es中,字段名为DemoField, 要读出其中的内容,hive表的字义就该这样写

create external table es_demo_tbl(
demofield string)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.nodes'='192.168.1.2,192.168.1.3', 'es.resource'='demoindex/sample',
'es.mapping.names'='demofield:DemoField')

注意是先hive中的字段名,然后是es中的字段名

Elasticsearch 运维实战之集群规划

规划一个可用于生产环境的elasticsearch集群。

集群节点划分

整个集群的节点分为以下三种主要类型

  1. Master nodes -- 负责维护集群状态,不保存index数据, 硬件要求: 一般性的机器就可以,给es进程分配16g内存
  2. Data Nodes -- 只保存index的数据,不被选举为Master nodes 硬件要求: 配置要求越高越好,使用大硬盘,有条件可以上SSD硬盘
  3. Client Nodes -- 主要用于负载均衡,不被选举为Master node, 也不保存index数据 硬件要求: 24核CPU, 64G内存或更高

一个合理的集群应该包含三个master nodes, 1到多个data nodes, 最少一个client node

安装与配置

通用配置,以centos为例,使用rpm安装包

sudo rpm -ivh elasticsearch-version.rpm
sudo chkconfig --add elasticsearch

修改/etc/sysconfig/elasticsearch, 修改ES_HEAP_SIZE和JAVA_OPTS的内容,注意elasticsearch建议使用的最大内存是32G,

ES_HEAP_SIZE=32g
JAVA_OPTS="-Xms32g"

修改/etc/security/limits.conf, 添加如下内容

* hard memlock unlimited
* soft memlock unlimited

/etc/elasticsearch/elasticsearch.yml 内容配置

  • master节点

node.master: true
node.data: false
discovery.zen.ping.unicast.hosts: ["master1","master2","master3"]
network.host: ${HOSTNAME}
  • data节点

node.master: false
node.data: true
discovery.zen.ping.unicast.hosts: ["master1","master2","master3"]
network.host: ${HOSTNAME}

如果为elasticsearch配置了多块硬盘,可以修改 DATA_DIR 的值,多个目录使用逗号(,)分开

  • client节点

node.master: false
node.data: false
discovery.zen.ping.unicast.hosts: ["master1","master2","master3"]
network.host: ${HOSTNAME}

启动elasticsearch

sudo service elasticsearch start

需要注意的是elasticsearch在centos中使用service elasticsearch restart有时不能达到效果,需要分开来做

sudo kill -9 `pgrep -f elasticsearch`
sudo service elasticsearch start

nginx反向代理

为了记录针对集群的查询内容,建议使用nginx来做反向代理,nginx安装在client node上,conf.d/default.conf 最简单的配置如下

upstream elasticsearch {
        server 127.0.0.1:9200;
}

server {
    gzip on;
    access_log /var/log/nginx/access.log combined;
    listen       80 default_server;

    server_name  _;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;

        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass      http://elasticsearch;
    }

   error_page  404              /404.html;
    location = /404.html {
        root   /usr/share/nginx/html;
    }

    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

插件安装

建议安装如下插件

  • kopf 兼容es 1.x, 2.x

kopf

./elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf/{branch|version}
  • head 兼容es 1.x
  • bigdesk 兼容es 1.x

presto-elasticsearch connector

elasticsearch搜索功能强劲,就是查询语法复杂,presto提供了非常open的plugin机制,我改进了下原有的presto-elasticsearch connector,现发布于github

功能改进点

  • 自动加载elasticsearch schema
  • 支持分片数据加载
  • predication pushdown,注意由于presto spi接口的原因,目前只支持and类型的过滤器下推,对于OR表达式不支持,不支持like类型的过滤器下推
  • 避免重复加载schema

运行办法
在etc/catalog目录下添加es.properties即可,内容如下

connector.name=elasticsearch
elasticsearch-server=localhost
elasticsearch-port=9300
elasticsearch-clustername=elasticsearch_demo

时间仓促,错误在所难免,欢迎批评指正。

时间: 2024-11-17 00:27:26

Elasticsearch hadoop使用示例 & 运维实战之集群规划 &presto-elasticsearch connector的相关文章

高效运维之Redis集群技术及Codis实践

这篇是<中生代>转载的一个关于运维的文章.作者是触控科技运维总监萧田国.文章在运维圈子流传甚广.特别也发在社区,分享给感兴趣的朋友. 前言 诚如开篇文章所言,高效运维包括管理的专业化和技术的专业化.前两篇我们主要在说些管理相关的内容,本篇说一下技术专业化.希望读者朋友们能适应这个转换,谢谢. 互联网早在几年前就已进入Web 2.0时代,对后台支撑能力的要求,提高了几十倍甚至几百倍.在这个演化过程中,缓存系统扮演了举足轻重的角色. 运维进化到今天,已经不是重复造轮子的时代.所以,我们在架构优化和

OpenStack 部署运维实战

OpenStack 部署运维实战 OpenStack 简介 OpenStack 是一个开源的 IaaS 实现,它由一些相互关联的子项目组成,主要包括计算.存储.网络.由于以 Apache 协议发布,自 2010 年项目成立以来,超过 200 个公司加入了 OpenStack 项目,其中包括 AT&T.AMD.Cisco.Dell.IBM.Intel.Red Hat 等.目前参与 OpenStack 项目的开发人员有 17,000+,来自 139 个国家,这一数字还在不断增长中. OpenStac

E-MapReduce(Hadoop)10大类问题之集群规划

前言 目前E-MapReduce已经服务了很多客户,大部分的客户都有着相同类似的问题,本系列会总结这些问题,分为10篇文章,每隔一段时间会更新一大类的问题,欢迎大家交流学习.我们交流群为开源大数据技术社区召集令,欢迎大家关注.特别推荐 E-MapReduce产品,如果有大数据的需求,欢迎大家尝试使用,本系列所有的问题都是基于E-MapReduce平台的. 集群规划类问题 所有的使用Hadoop或者打算使用Hadoop的人肯定会遇到集群规划的问题,我到底使用多大的集群规模呢?有没有一个标准呢? 本

《Splunk智能运维实战》——第1章 游戏时间——导入数据 1.1 简介

第1章 游戏时间--导入数据 1.1 简介 加快运维智能的机器数据有很多不同的形式,来源也各不相同.Splunk可从多种来源收集并索引数据,其中包括Web服务器或商业应用程序创建的日志文件,网络设备生成的系统日志数据,及自定义开发脚本输出的数据.即便数据一开始看上去很复杂,我们也可以借助Splunk轻松地实时收集.索引.转化和呈现数据. 本章将学习一些基本的技巧,掌握如何将所需的数据导入Splunk,介绍如何使用样本数据集来构建自己的Splunk智能运维应用程序.该数据集是由一个虚拟的三层式电子

网易OpenStack部署运维实战

OpenStack自 2010 年项目成立以来,已经有超过 200 个公司加入了 OpenStack 项目,目前参与 OpenStack 项目的开发人员有 17,000+,而且这些数字还在增加,作为一个开源的IaaS实现,目前在企业的应用越来越普遍,网易公司私有云团队分享了他们在基于OpenStack 开发的一套云计算管理平台的实战经验,期待和广大的OpenStack 使用者进行交流. 本文为您介绍了网易公司基于 OpenStack 开发的一套云计算管理平台,以及在开发.运营.维护过程中遇到的问

《Splunk智能运维实战》——导读

前 言 在这个以科技为中心的世界里,各式各样的机器产生了大量的数据.Splunk因此推出了业内领先的大数据智能运维平台--Splunk Enterprise.这个强大的平台能让用户将机器数据转化为可操作的.非常重要的运维智能. 本书融合了各种实用方法,旨在提供指导和实用知识,以便使读者掌握Splunk Enterprise 6的各种功能,从数据中提取出强大而重要的运维智能. 本书通过简单易学.循序渐进的操作技巧,教授读者如何有效地收集.分析并创建所在环境的运营数据报表.这些技巧将展示如何加快智能

《Splunk智能运维实战》——1.9 定义事件类型和标签

1.9 定义事件类型和标签 Splunk中的事件类型是将数据中共同类型的事件归类的一种方法,这样可以使它们更易于搜索和制作报表.使用事件类型有助于把类似的事件归为同一类.事件类型本质上将数个搜索条件变为字段/值对.标签有助于更高效地搜索事件数据组.我们可以为包括事件类型在内的任何字段/值组合分配标签. 比如,Windows登录事件可以被赋予事件类型windows_logon,UNIX登录事件可以被赋予事件类型unix_logon,VPN登录事件可以被赋予事件类型vpn_logon.以上三种事件类

《Splunk智能运维实战》——1.4 使用脚本输入

1.4 使用脚本输入 智能运维所需的数据并非全部来自日志文件或网络端口.Splunk也可获取命令或脚本的输出,并将其与其他数据一起索引. 脚本输入是针对较难获取数据的一种有效方法.如果收集第三方提供的命令行程序输出的数据,Splunk可定期运行该命令来索引结果.通常来说,脚本输入常用于从某个源抓取信息,而网络输入则等待数据从某个源不断推送. 本节将介绍如何配置Splunk,使其每隔一段时间执行命令并将输出的数据导入Splunk. 做好准备 要进行本节的操作,需要运行Splunk Enterpri

《Splunk智能运维实战》——1.8 定义字段提取内容

1.8 定义字段提取内容 Splunk内置了许多功能,能识别多种常见的源类型,因此能自动识别出数据中的字段.Splunk默认也会提取日志数据中的所有键值对和JSON格式日志中的所有字段.但是原始日志数据中的字段不能直接解释,必须提供给Splunk相关信息使这些字段易于搜索. 随后章节要用到的样本数据包含了作为字段提交给Splunk的数据.大部分原始数据包含Splunk能自动提取的键值对,但需要告知Splunk如何提取代表页面响应时间的这一特殊字段.要进行该操作,需要添加自定义字段提取内容,以便告