怎么又是你

社区日报 第524期 (2019-01-29)

1、Elasticsearch分布式一致性原理分析之元数据。
http://t.cn/EtbgJxx
2、使用Amazon Elasticsearch Service和AWS Lambda对PCI-DSS感知进行警报、监控和报告。
http://t.cn/Etbgorf
3、Node.js和浏览器官方Elasticsearch客户端介绍。
http://t.cn/Etbg04v

编辑:叮咚光军
归档:https://elasticsearch.cn/article/6351
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1、Elasticsearch分布式一致性原理分析之元数据。
http://t.cn/EtbgJxx
2、使用Amazon Elasticsearch Service和AWS Lambda对PCI-DSS感知进行警报、监控和报告。
http://t.cn/Etbgorf
3、Node.js和浏览器官方Elasticsearch客户端介绍。
http://t.cn/Etbg04v

编辑:叮咚光军
归档:https://elasticsearch.cn/article/6351
订阅:https://tinyletter.com/elastic-daily 收起阅读 »

社区日报 第523期 (2019-01-28)

1.大数据搜索选开源还是商业软件?ElasticSearch 对比 Splunk
http://t.cn/EtVI8va
2.ELK做数据挖掘的优缺点
http://t.cn/EtVMwlq
3.导入CSV 和 日志文件到ES中,并使用可视化展示
http://t.cn/EtVM6TN

编辑:cyberdak
归档:https://elasticsearch.cn/article/6350
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1.大数据搜索选开源还是商业软件?ElasticSearch 对比 Splunk
http://t.cn/EtVI8va
2.ELK做数据挖掘的优缺点
http://t.cn/EtVMwlq
3.导入CSV 和 日志文件到ES中,并使用可视化展示
http://t.cn/EtVM6TN

编辑:cyberdak
归档:https://elasticsearch.cn/article/6350
订阅:https://tinyletter.com/elastic-daily 收起阅读 »

Hive 与 ElasticSearch 的数据交互

本文将详细介绍利用 ES 与 Hive 直接的数据交互;通过 Hive 外部表的方式,可以快速将 ES 索引数据映射到 Hive 中,使用易于上手的 Hive SQL 实现对数据的进一步加工。

一、开发环境

1、组件版本

  • CDH 集群版本:6.0.1
  • ES 版本:6.5.1
  • Hive 版本:2.1.1
  • ES-Hadoop 版本:6.5.1

2、Hive 简介

Hive 在 Hadoop 生态系统中扮演着数据仓库的角色,借助 Hive 可以方便地进行数据汇总、即席查询以及分析存储在 Hadoop 文件系统中的大型数据集。

Hive 通过类 SQL 语言(HSQL)对 Hadoop 上的数据进行抽象,这样用户可以通过 SQL 语句对数据进行定义、组织、操作和分析;在 Hive 中,数据集是通过表(定义了数据类型相关信息)进行定义的,用户可以通过内置运算符或用户自定义函数(UDF)对数据进行加载、查询和转换。

3、Hive 安装 ES-Hadoop

官方推荐的安装方式:

使用 add jar

add jar /path/elasticsearch-hadoop.jar

使用 hive.aux.jars.path

$ bin/hive --auxpath=/path/elasticsearch-hadoop.jar

修改配置(hive-site.xml)

<property>
  <name>hive.aux.jars.path</name>
  <value>/path/elasticsearch-hadoop.jar</value>
  <description>A comma separated list (with no spaces) of the jar files</description>
</property>

CDH6.X 推荐的安装方法

elasticsearch-hadoop.jar 复制到 Hive 的 auxlib 目录中,然后重启 Hive 即可。

cp elasticsearch-hadoop.jar /opt/cloudera/parcels/CDH/lib/hive/auxlib/

二、Hive 与 ElasticSearch 的数据交互

1、数据类型对照表

请务必注意,ES 中的类型是 index/_mapping 中对应的数据类型,非 _source 里面数据的类型。

Hive type Elasticsearch type
void null
boolean boolean
tinyint byte
smallint short
int int
bigint long
double double
float float
string string
binary binary
timestamp date
struct map
map map
array array
union not supported (yet)
decimal string
date date
varchar string
char string

2、建立 Hive 外部表

CREATE EXTERNAL TABLE default.surface(
    water_type STRING,
    water_level STRING,
    monitor_time TIMESTAMP,
    sitecode STRING,
    p492 DOUBLE,
    p311 DOUBLE,
    status STRING
)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES(
    'es.resource'='ods_data_day_surface*/doc',
    'es.query'='?q=status:001'
    'es.nodes'='sky-01','es.port'='9200',
    'es.net.http.auth.user'='sky',
    'es.net.http.auth.pass'='jointsky',
    'es.date.format'='yyyy-MM-dd HH:mm:ss',
    'es.ser.reader.value.class'='com.jointsky.bigdata.hive.EsValueReader'
    'es.mapping.names'='waterType:water_type,monitortime:monitor_time'
);

3、配置项说明

es.resource

es.resource 用于设置 ES 资源的位置,默认该配置项同时设置了读和写的索引,当然也可以分别设置读写索引名称:

  • es.resource.read:设置读取位置;
  • es.resource.write:设置写入位置。

es.query

es.query 设置查询过滤条件,目前支持 uri queryquery dslexternal resource 三种设置方式。

# uri (or parameter) query
es.query = ?q=costinl

# query dsl
es.query = { "query" : { "term" : { "user" : "costinl" } } }

# external resource
es.query = org/mypackage/myquery.json

es.mapping.names

es.mapping.names 用于设置 Hive 与 ES 的字段映射关系,如果不设置,则默认字段名不发生变化(即为 data type 区域定义的字段名);此外该部分还用于定义 Hive 到 ES 的数据映射类型。

'es.mapping.names' = 'date:@timestamp , url:url_123 ')

其他通用字段的说明请参考文章:使用 ES-Hadoop 将 Spark Streaming 流数据写入 ES

4、自定义日期类型解析

目前将 ES 的 date 类型映射到 Hive 的 TIMESTAMP 类型时,ES-Hadoop 组件只能识别时间戳格式或者标准的 XSD 格式的日期字符串:

@Override
protected Object parseDate(Long value, boolean richDate) {
    return (richDate ? new TimestampWritable(new Timestamp(value)) : processLong(value));
}

@Override
protected Object parseDate(String value, boolean richDate) {
    return (richDate ? new TimestampWritable(new Timestamp(DatatypeConverter.parseDateTime(value).getTimeInMillis())) : parseString(value));
}

关于 XSD(XML Schema Date/Time Datatypes)可用参考文章:https://www.w3schools.com/xml/schema_dtypes_date.asp

为了兼容自定义的日期格式,需要编写自定义的日期读取类:


import org.apache.hadoop.hive.serde2.io.TimestampWritable;
import org.elasticsearch.hadoop.cfg.Settings;
import org.elasticsearch.hadoop.hive.HiveValueReader;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;

public class EsValueReader extends HiveValueReader {
    private String dateFormat;
    private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    private static final String DEFAULT_DATE_FORMAT_MIN = "yyyy-MM-dd HH:mm";
    private static final String DEFAULT_DATE_FORMAT_HOUR = "yyyy-MM-dd HH";
    private static final String DEFAULT_DATE_FORMAT_DAY = "yyyy-MM-dd";

    @Override
    public void setSettings(Settings settings) {
        super.setSettings(settings);
        dateFormat = settings.getProperty("es.date.format");
    }

    @Override
    protected Object parseDate(String value, boolean richDate) {
        if (value != null && value.trim().length() > 0 && DEFAULT_DATE_FORMAT.equalsIgnoreCase(dateFormat)) {
            if (richDate){
                if (value.length() == 16){
                    return new TimestampWritable(new Timestamp(parseDate(value, DEFAULT_DATE_FORMAT_MIN).getTime()));
                }
                if (value.length() == 13){
                    return new TimestampWritable(new Timestamp(parseDate(value, DEFAULT_DATE_FORMAT_HOUR).getTime()));
                }
                if (value.length() == 10){
                    return new TimestampWritable(new Timestamp(parseDate(value, DEFAULT_DATE_FORMAT_DAY).getTime()));
                }
                return new TimestampWritable(new Timestamp(parseDate(value, DEFAULT_DATE_FORMAT).getTime()));
            }
            return parseString(value);
        }
        return super.parseDate(value, richDate);
    }

    /**
     * 解析日期,根據指定的格式進行解析.<br>
     * 如果解析錯誤,則返回null
     * @param stringDate 日期字串
     * @param format 日期格式
     * @return 日期型別
     */
    private static Date parseDate(String stringDate, String format) {
        if (stringDate == null) {
            return null;
        }
        try {
            return parseDate(stringDate, new String[] { format });
        } catch (ParseException e) {
            return null;
        }
    }

    public static Date parseDate(String str, String... parsePatterns) throws ParseException {
        return parseDateWithLeniency(str, parsePatterns, true);
    }

    private static Date parseDateWithLeniency(
            String str, String[] parsePatterns, boolean lenient) throws ParseException {
        if (str == null || parsePatterns == null) {
            throw new IllegalArgumentException("Date and Patterns must not be null");
        }

        SimpleDateFormat parser = new SimpleDateFormat();
        parser.setLenient(lenient);
        ParsePosition pos = new ParsePosition(0);
        for (String parsePattern : parsePatterns) {
            String pattern = parsePattern;
            if (parsePattern.endsWith("ZZ")) {
                pattern = pattern.substring(0, pattern.length() - 1);
            }
            parser.applyPattern(pattern);
            pos.setIndex(0);
            String str2 = str;
            if (parsePattern.endsWith("ZZ")) {
                str2 = str.replaceAll("([-+][0-9][0-9]):([0-9][0-9])$", "$1$2");
            }
            Date date = parser.parse(str2, pos);
            if (date != null && pos.getIndex() == str2.length()) {
                return date;
            }
        }
        throw new ParseException("Unable to parse the date: " + str, -1);
    }
}

上述代码的 Maven 依赖

<dependencies>
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>2.1.1</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch-hadoop</artifactId>
        <version>6.5.4</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

自定义日期解析包的部署

代码编写完成后,将代码进行打包,然后将打包好的 jar 包放置到 Hive 的 auxlib 目录中,然后重启 Hive 即可;该步骤与 ES-Hadoop 的安装步骤一样。

在编写 Spark 程序从 Hive 中读取数据的时候,需要添加对该包的依赖以及对 ES-Hadoop 的依赖。

三、总结

经过上述的步骤,Hive 与 ES 的映射已经不成问题,如果想从 ES 中导出数据,可用借助 HSQL insert into table XXX select * from XXXXX; 的方式从 ES 中读取数据写入到 HDFS;当然通过更为复杂的 HSQL 可以将数据进行处理,并将数据重新写入到 ES 或者存储到 HDFS。

充分利用 ES 的查询、过滤和聚合,可以很好的去服务数据标准化、数据清洗、数据分布情况等 ETL 流程。


Any Code,Code Any!

扫码关注『AnyCode』,编程路上,一起前行。

继续阅读 »

本文将详细介绍利用 ES 与 Hive 直接的数据交互;通过 Hive 外部表的方式,可以快速将 ES 索引数据映射到 Hive 中,使用易于上手的 Hive SQL 实现对数据的进一步加工。

一、开发环境

1、组件版本

  • CDH 集群版本:6.0.1
  • ES 版本:6.5.1
  • Hive 版本:2.1.1
  • ES-Hadoop 版本:6.5.1

2、Hive 简介

Hive 在 Hadoop 生态系统中扮演着数据仓库的角色,借助 Hive 可以方便地进行数据汇总、即席查询以及分析存储在 Hadoop 文件系统中的大型数据集。

Hive 通过类 SQL 语言(HSQL)对 Hadoop 上的数据进行抽象,这样用户可以通过 SQL 语句对数据进行定义、组织、操作和分析;在 Hive 中,数据集是通过表(定义了数据类型相关信息)进行定义的,用户可以通过内置运算符或用户自定义函数(UDF)对数据进行加载、查询和转换。

3、Hive 安装 ES-Hadoop

官方推荐的安装方式:

使用 add jar

add jar /path/elasticsearch-hadoop.jar

使用 hive.aux.jars.path

$ bin/hive --auxpath=/path/elasticsearch-hadoop.jar

修改配置(hive-site.xml)

<property>
  <name>hive.aux.jars.path</name>
  <value>/path/elasticsearch-hadoop.jar</value>
  <description>A comma separated list (with no spaces) of the jar files</description>
</property>

CDH6.X 推荐的安装方法

elasticsearch-hadoop.jar 复制到 Hive 的 auxlib 目录中,然后重启 Hive 即可。

cp elasticsearch-hadoop.jar /opt/cloudera/parcels/CDH/lib/hive/auxlib/

二、Hive 与 ElasticSearch 的数据交互

1、数据类型对照表

请务必注意,ES 中的类型是 index/_mapping 中对应的数据类型,非 _source 里面数据的类型。

Hive type Elasticsearch type
void null
boolean boolean
tinyint byte
smallint short
int int
bigint long
double double
float float
string string
binary binary
timestamp date
struct map
map map
array array
union not supported (yet)
decimal string
date date
varchar string
char string

2、建立 Hive 外部表

CREATE EXTERNAL TABLE default.surface(
    water_type STRING,
    water_level STRING,
    monitor_time TIMESTAMP,
    sitecode STRING,
    p492 DOUBLE,
    p311 DOUBLE,
    status STRING
)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES(
    'es.resource'='ods_data_day_surface*/doc',
    'es.query'='?q=status:001'
    'es.nodes'='sky-01','es.port'='9200',
    'es.net.http.auth.user'='sky',
    'es.net.http.auth.pass'='jointsky',
    'es.date.format'='yyyy-MM-dd HH:mm:ss',
    'es.ser.reader.value.class'='com.jointsky.bigdata.hive.EsValueReader'
    'es.mapping.names'='waterType:water_type,monitortime:monitor_time'
);

3、配置项说明

es.resource

es.resource 用于设置 ES 资源的位置,默认该配置项同时设置了读和写的索引,当然也可以分别设置读写索引名称:

  • es.resource.read:设置读取位置;
  • es.resource.write:设置写入位置。

es.query

es.query 设置查询过滤条件,目前支持 uri queryquery dslexternal resource 三种设置方式。

# uri (or parameter) query
es.query = ?q=costinl

# query dsl
es.query = { "query" : { "term" : { "user" : "costinl" } } }

# external resource
es.query = org/mypackage/myquery.json

es.mapping.names

es.mapping.names 用于设置 Hive 与 ES 的字段映射关系,如果不设置,则默认字段名不发生变化(即为 data type 区域定义的字段名);此外该部分还用于定义 Hive 到 ES 的数据映射类型。

'es.mapping.names' = 'date:@timestamp , url:url_123 ')

其他通用字段的说明请参考文章:使用 ES-Hadoop 将 Spark Streaming 流数据写入 ES

4、自定义日期类型解析

目前将 ES 的 date 类型映射到 Hive 的 TIMESTAMP 类型时,ES-Hadoop 组件只能识别时间戳格式或者标准的 XSD 格式的日期字符串:

@Override
protected Object parseDate(Long value, boolean richDate) {
    return (richDate ? new TimestampWritable(new Timestamp(value)) : processLong(value));
}

@Override
protected Object parseDate(String value, boolean richDate) {
    return (richDate ? new TimestampWritable(new Timestamp(DatatypeConverter.parseDateTime(value).getTimeInMillis())) : parseString(value));
}

关于 XSD(XML Schema Date/Time Datatypes)可用参考文章:https://www.w3schools.com/xml/schema_dtypes_date.asp

为了兼容自定义的日期格式,需要编写自定义的日期读取类:


import org.apache.hadoop.hive.serde2.io.TimestampWritable;
import org.elasticsearch.hadoop.cfg.Settings;
import org.elasticsearch.hadoop.hive.HiveValueReader;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;

public class EsValueReader extends HiveValueReader {
    private String dateFormat;
    private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    private static final String DEFAULT_DATE_FORMAT_MIN = "yyyy-MM-dd HH:mm";
    private static final String DEFAULT_DATE_FORMAT_HOUR = "yyyy-MM-dd HH";
    private static final String DEFAULT_DATE_FORMAT_DAY = "yyyy-MM-dd";

    @Override
    public void setSettings(Settings settings) {
        super.setSettings(settings);
        dateFormat = settings.getProperty("es.date.format");
    }

    @Override
    protected Object parseDate(String value, boolean richDate) {
        if (value != null && value.trim().length() > 0 && DEFAULT_DATE_FORMAT.equalsIgnoreCase(dateFormat)) {
            if (richDate){
                if (value.length() == 16){
                    return new TimestampWritable(new Timestamp(parseDate(value, DEFAULT_DATE_FORMAT_MIN).getTime()));
                }
                if (value.length() == 13){
                    return new TimestampWritable(new Timestamp(parseDate(value, DEFAULT_DATE_FORMAT_HOUR).getTime()));
                }
                if (value.length() == 10){
                    return new TimestampWritable(new Timestamp(parseDate(value, DEFAULT_DATE_FORMAT_DAY).getTime()));
                }
                return new TimestampWritable(new Timestamp(parseDate(value, DEFAULT_DATE_FORMAT).getTime()));
            }
            return parseString(value);
        }
        return super.parseDate(value, richDate);
    }

    /**
     * 解析日期,根據指定的格式進行解析.<br>
     * 如果解析錯誤,則返回null
     * @param stringDate 日期字串
     * @param format 日期格式
     * @return 日期型別
     */
    private static Date parseDate(String stringDate, String format) {
        if (stringDate == null) {
            return null;
        }
        try {
            return parseDate(stringDate, new String[] { format });
        } catch (ParseException e) {
            return null;
        }
    }

    public static Date parseDate(String str, String... parsePatterns) throws ParseException {
        return parseDateWithLeniency(str, parsePatterns, true);
    }

    private static Date parseDateWithLeniency(
            String str, String[] parsePatterns, boolean lenient) throws ParseException {
        if (str == null || parsePatterns == null) {
            throw new IllegalArgumentException("Date and Patterns must not be null");
        }

        SimpleDateFormat parser = new SimpleDateFormat();
        parser.setLenient(lenient);
        ParsePosition pos = new ParsePosition(0);
        for (String parsePattern : parsePatterns) {
            String pattern = parsePattern;
            if (parsePattern.endsWith("ZZ")) {
                pattern = pattern.substring(0, pattern.length() - 1);
            }
            parser.applyPattern(pattern);
            pos.setIndex(0);
            String str2 = str;
            if (parsePattern.endsWith("ZZ")) {
                str2 = str.replaceAll("([-+][0-9][0-9]):([0-9][0-9])$", "$1$2");
            }
            Date date = parser.parse(str2, pos);
            if (date != null && pos.getIndex() == str2.length()) {
                return date;
            }
        }
        throw new ParseException("Unable to parse the date: " + str, -1);
    }
}

上述代码的 Maven 依赖

<dependencies>
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>2.1.1</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch-hadoop</artifactId>
        <version>6.5.4</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

自定义日期解析包的部署

代码编写完成后,将代码进行打包,然后将打包好的 jar 包放置到 Hive 的 auxlib 目录中,然后重启 Hive 即可;该步骤与 ES-Hadoop 的安装步骤一样。

在编写 Spark 程序从 Hive 中读取数据的时候,需要添加对该包的依赖以及对 ES-Hadoop 的依赖。

三、总结

经过上述的步骤,Hive 与 ES 的映射已经不成问题,如果想从 ES 中导出数据,可用借助 HSQL insert into table XXX select * from XXXXX; 的方式从 ES 中读取数据写入到 HDFS;当然通过更为复杂的 HSQL 可以将数据进行处理,并将数据重新写入到 ES 或者存储到 HDFS。

充分利用 ES 的查询、过滤和聚合,可以很好的去服务数据标准化、数据清洗、数据分布情况等 ETL 流程。


Any Code,Code Any!

扫码关注『AnyCode』,编程路上,一起前行。

收起阅读 »

社区日报 第522期 (2019-01-27)

1.在现有Elasticsearch集群中添加或删除节点。
http://t.cn/EtUHo2i
2.运行400+节点Elasticsearch集群。
http://t.cn/EtUHqmF
3.(自备梯子)亚马逊变得比你意识到的更强大。
http://t.cn/EtUHBLe

编辑:至尊宝
归档:https://elasticsearch.cn/article/6348
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1.在现有Elasticsearch集群中添加或删除节点。
http://t.cn/EtUHo2i
2.运行400+节点Elasticsearch集群。
http://t.cn/EtUHqmF
3.(自备梯子)亚马逊变得比你意识到的更强大。
http://t.cn/EtUHBLe

编辑:至尊宝
归档:https://elasticsearch.cn/article/6348
订阅:https://tinyletter.com/elastic-daily 收起阅读 »

社区日报 第521期 (2019-01-26)

  1. ES使用中遇到的多种坑,以及解决方案。 http://t.cn/Etzlrca

2.使用Python ES Kibana构建的实时异常检测开源框架。 http://t.cn/R8Vu2q3

  1. Golang操作elasticsearch。 http://t.cn/EtzjhkJ
继续阅读 »
  1. ES使用中遇到的多种坑,以及解决方案。 http://t.cn/Etzlrca

2.使用Python ES Kibana构建的实时异常检测开源框架。 http://t.cn/R8Vu2q3

  1. Golang操作elasticsearch。 http://t.cn/EtzjhkJ
收起阅读 »

访谈:Elasticsearch在360企业安全集团的应用实践

欢迎来到Elastic社区电台的第十期节目,本期我们节目的嘉宾是来自于360企业安全集团的资深研发工程师张超和段军义,张超也是 Elasticsearch 相关新书《Elasticsearch 源码解析与优化实战》的作者,让我们一起走进360企业安全的大数据团队,了解他们是如何使用 Elasticsearch 来解决公司内部和外部客户的各类需求,以及在实践过程中的经验分享。

收听地址

WechatIMG120.jpeg

时间线

  • 00:20 - 嘉宾介绍
  • 02:10 - 张超的新书《Elasticsearch 源码解析与优化实战》
  • 04:21 - 360 与 Elasticsearch 的故事
  • 05:25 - Elasticsearch 在 360 的应用场景介绍
  • 07:30 - 产品选型与比较
  • 08:20 - 有关版本升级的经验分享
  • 12:00 - 典型场景的数据规模及配置情况
  • 15:00 - 360 基于 Elasticsearch 的源码优化
  • 21:00 - Frozen Index 与按需加载的需求
  • 22:00 - Rollup 数据上卷的功能介绍
  • 26:00 - 关于如何学习 Elasticsearch 的经验分享
  • 29:00 - Elasticsearch 踩坑故事分享
  • 37:00 - 关于入库与副本同步的改进问题讨论
  • 30:30 - 关于异地多活与 CCR 的介绍
  • 41:00 - 关于 Elasticsearch 相关职位的要求
  • 42:00 - 360 团队对于 Elastic 未来的期望
  • 43:50 - 有关目前 Elasticsearch 的痛点
  • 46:00 - 有关 Rollover 的功能介绍
  • 48:00 - 尾声

嘉宾

  • 张超,大数据平台内核资深研发工程师,《Elasticsearch源码解析与优化实战》作者,就职于360企业安全集团,在基础大数据平台部门负责 Elasticsearch 内核研发工作,喜欢研究底层原理与系统优化,尤其喜欢解决深层次的问题。

  • 段军义,大数据平台资深开发工程师,就职于360企业安全集团,主要负责Elasticsearch研发,喜欢研究Java、Linux、搜索相关技术。

主持人

Elastic 技术布道师,曾勇(Medcl)。

关于360企业安全

360企业安全创建于2012年,是360公司继个人安全市场后致力服务于政府企业机构网络安全与信息安全管理的安全产品业务线。作为中国互联网安全的领导者,360凭借在PC终端安全、移动终端安全、桌面安全管理、大数据分析、云安全等方面的深厚积累,成功推出各行业用户所急需的终端安全与管理一体化、未知高级威胁检测、移动终端安全管理、大数据安全分析等多项创新型企业安全产品。

关于Elastic社区电台

Elastic 开源社区举办的一款播客类节目, 邀请来自开源社区的用户,一起聊聊 Elastic 开源产品的使用案例、经验分享、架构变迁等等。

相关链接

继续阅读 »

欢迎来到Elastic社区电台的第十期节目,本期我们节目的嘉宾是来自于360企业安全集团的资深研发工程师张超和段军义,张超也是 Elasticsearch 相关新书《Elasticsearch 源码解析与优化实战》的作者,让我们一起走进360企业安全的大数据团队,了解他们是如何使用 Elasticsearch 来解决公司内部和外部客户的各类需求,以及在实践过程中的经验分享。

收听地址

WechatIMG120.jpeg

时间线

  • 00:20 - 嘉宾介绍
  • 02:10 - 张超的新书《Elasticsearch 源码解析与优化实战》
  • 04:21 - 360 与 Elasticsearch 的故事
  • 05:25 - Elasticsearch 在 360 的应用场景介绍
  • 07:30 - 产品选型与比较
  • 08:20 - 有关版本升级的经验分享
  • 12:00 - 典型场景的数据规模及配置情况
  • 15:00 - 360 基于 Elasticsearch 的源码优化
  • 21:00 - Frozen Index 与按需加载的需求
  • 22:00 - Rollup 数据上卷的功能介绍
  • 26:00 - 关于如何学习 Elasticsearch 的经验分享
  • 29:00 - Elasticsearch 踩坑故事分享
  • 37:00 - 关于入库与副本同步的改进问题讨论
  • 30:30 - 关于异地多活与 CCR 的介绍
  • 41:00 - 关于 Elasticsearch 相关职位的要求
  • 42:00 - 360 团队对于 Elastic 未来的期望
  • 43:50 - 有关目前 Elasticsearch 的痛点
  • 46:00 - 有关 Rollover 的功能介绍
  • 48:00 - 尾声

嘉宾

  • 张超,大数据平台内核资深研发工程师,《Elasticsearch源码解析与优化实战》作者,就职于360企业安全集团,在基础大数据平台部门负责 Elasticsearch 内核研发工作,喜欢研究底层原理与系统优化,尤其喜欢解决深层次的问题。

  • 段军义,大数据平台资深开发工程师,就职于360企业安全集团,主要负责Elasticsearch研发,喜欢研究Java、Linux、搜索相关技术。

主持人

Elastic 技术布道师,曾勇(Medcl)。

关于360企业安全

360企业安全创建于2012年,是360公司继个人安全市场后致力服务于政府企业机构网络安全与信息安全管理的安全产品业务线。作为中国互联网安全的领导者,360凭借在PC终端安全、移动终端安全、桌面安全管理、大数据分析、云安全等方面的深厚积累,成功推出各行业用户所急需的终端安全与管理一体化、未知高级威胁检测、移动终端安全管理、大数据安全分析等多项创新型企业安全产品。

关于Elastic社区电台

Elastic 开源社区举办的一款播客类节目, 邀请来自开源社区的用户,一起聊聊 Elastic 开源产品的使用案例、经验分享、架构变迁等等。

相关链接

收起阅读 »

社区日报 第520期 (2019-01-25)

1、帮助识别公开 Elasticsearch 服务器上的敏感信息开源项目
http://t.cn/EGszEDf
2、Elasticsearch + neo4j图搜索
http://t.cn/E53j9ZA
3、支持6.X版本的Elasticsearch PHP客户端
http://t.cn/R5IqIG6

编辑:铭毅天下
归档:https://elasticsearch.cn/article/6345
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1、帮助识别公开 Elasticsearch 服务器上的敏感信息开源项目
http://t.cn/EGszEDf
2、Elasticsearch + neo4j图搜索
http://t.cn/E53j9ZA
3、支持6.X版本的Elasticsearch PHP客户端
http://t.cn/R5IqIG6

编辑:铭毅天下
归档:https://elasticsearch.cn/article/6345
订阅:https://tinyletter.com/elastic-daily 收起阅读 »

社区日报 第519期 (2019-01-24)

1.Elasticsearch搜索Suggest功能优化
http://t.cn/E5BoAmR
2.Elasticsearch translog文件介绍
http://t.cn/E5BoqXd
3.Elasticsearch结合百度地图实现区域查询检索
http://t.cn/E5Bofgd

编辑:金桥
归档:https://elasticsearch.cn/article/6344
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1.Elasticsearch搜索Suggest功能优化
http://t.cn/E5BoAmR
2.Elasticsearch translog文件介绍
http://t.cn/E5BoqXd
3.Elasticsearch结合百度地图实现区域查询检索
http://t.cn/E5Bofgd

编辑:金桥
归档:https://elasticsearch.cn/article/6344
订阅:https://tinyletter.com/elastic-daily 收起阅读 »

社区日报 第518期 (2019-01-23)

1.BAT 等一线大厂 Elasticsearch面试题解读
http://t.cn/E5SHRTH
2.如何监控 Kubernetes 集群日志
http://t.cn/E5TrUwi
3.Elasticsearch 布尔查询
http://t.cn/E5TgM9d

编辑:江水
归档:https://elasticsearch.cn/article/6342
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1.BAT 等一线大厂 Elasticsearch面试题解读
http://t.cn/E5SHRTH
2.如何监控 Kubernetes 集群日志
http://t.cn/E5TrUwi
3.Elasticsearch 布尔查询
http://t.cn/E5TgM9d

编辑:江水
归档:https://elasticsearch.cn/article/6342
订阅:https://tinyletter.com/elastic-daily 收起阅读 »

自研基于StanfordNLP的ES分词插件

为ES构建Stanford NLP分词插件

Stanford NLP?

Stanford分词器是斯坦福大学NLP团队维护的一个开源分词器,支持了包括中文、英文…的语言,而且除了分词之外,它还支持了包括词性分析、情感分析…的各种功能。\ 这俩是这个project的项目主页

Why Stanford core NLP?

  市面上确实会有很多很有名的开源分词器,比如IK、Jieba,还有一些其他团队和公司提供的开源/商用的分词器,他们各有优劣。但是在各种分词器上比较了一大堆的分词case之后,我们发现Stanford NLP似乎是最适合我们当前需求的一个,因为我们不仅仅需要分词,还需要一些包括情感分析之类在内的更多的一些功能。

我们公司是做金融数据的搜索推荐的,在对比了各家分词器之后我们老板觉得Stanford NLP的效果最好,但是作为算法出身的人,他实现了一套非常重的分词、排序、搜索的服务。

在对比如研报、财报之类的信息进行搜索的时候确实会比较有效,但是在对经济类的新闻进行搜索的时候就会显得十分的笨重。

基于这个背景,我开始试图在ES里面引入老板推崇的Stanford 分词器来适应他的搜索、分词的需要,同时也能够不通过他那个笨重的分词排序服务来对我们系统中大量的经济、金融类的新闻进行分词、索引,并提供和他自己分词效果类似的分词和检索服务。

Why this project

我在包括百度、某谷姓404网站、GitHub以及国内的中文社区(Elastic中文社区)在内的各种地方搜过也问过了,但是似乎没有一个直接开箱可用的分词插件。所以,我只剩一条路了,就是搭建一个自己的插件来引用这个分词器。

How

对ES来说,插件主要分为两个部分:

  1. 让ES可以看到的部分(class extends Plugin)
  2. 自己行使职能的部分(functional part)

plugin

  1. 为了让ES可以加载我们的plugin,我们需要先继承Plugin类,然后我们这个是个分词器插件,所以还要实现AnalysisPlugin类
  2. 看过ES源码或者其他分词器源码的同学应该会知道,分词器插件需要实现两个方法,一个用来提供tokenizer,一个是analyzer分别对应分词器中的这俩。
    • 重写Map<String, AnalysisModule.AnalysisProvider<TokenizerFactory>>是为了可以提供搜索用分词器
    • 重写Map<String, AnalysisModule.AnalysisProvider<AnalyzerProvider<? extends Analyzer>>>是为了可以提供索引用分词器
  3. 在这个分词器里面我们主要是依靠Tokenizer来实现分词的

functional class

分词器,特别是Tokenizer主要是靠重写三个方法来实现分词的

  1. incrementToken:用来确定每一个词元,输出每一个单词(字)以及它的位置、长度等
  2. reset:用来重制分词结果
  3. end:用来告诉ES,这段文本的分词已经结束了

所以我们主要需要重写的就是这仨方法,当然了,为了能让分词器正确的使用,我们还需要添加一些分词器的配置和初始化的内容,具体代码不写了可以参考我的git,主要讲两个坑:

  1. ES是通过配置文件里的路径来寻找对应的插件类
  2. 然后通过配置文件里的key和刚才提到的代码里的key来寻找对应的分词器,所以这俩地方不要写错了 #plugin-descriptor.properties: classname=org.elasticsearch.plugin.analysis.AnalysisSDPlugin #plugin-descriptor.properties: name=stanford-core-nlp
  3. 在开发过程中由于有java-security的存在,所以需要通过AccessController来调用和加载我们需要的外部jar包

odds and ends

  1. Stanford分词器里面包含了很多功能,目前我使用了分词的部分
  2. 分词器自带词典文件,不过如果要做词典的修改可能需要解包,修改,再重新打包
  3. 我现在hardcode了一大堆的标点符号在里面,后面可能会去优化一下部分逻辑
  4. 待完成的功能还有其他功能包括情感分析之类的

also see

GitHub 地址

继续阅读 »

为ES构建Stanford NLP分词插件

Stanford NLP?

Stanford分词器是斯坦福大学NLP团队维护的一个开源分词器,支持了包括中文、英文…的语言,而且除了分词之外,它还支持了包括词性分析、情感分析…的各种功能。\ 这俩是这个project的项目主页

Why Stanford core NLP?

  市面上确实会有很多很有名的开源分词器,比如IK、Jieba,还有一些其他团队和公司提供的开源/商用的分词器,他们各有优劣。但是在各种分词器上比较了一大堆的分词case之后,我们发现Stanford NLP似乎是最适合我们当前需求的一个,因为我们不仅仅需要分词,还需要一些包括情感分析之类在内的更多的一些功能。

我们公司是做金融数据的搜索推荐的,在对比了各家分词器之后我们老板觉得Stanford NLP的效果最好,但是作为算法出身的人,他实现了一套非常重的分词、排序、搜索的服务。

在对比如研报、财报之类的信息进行搜索的时候确实会比较有效,但是在对经济类的新闻进行搜索的时候就会显得十分的笨重。

基于这个背景,我开始试图在ES里面引入老板推崇的Stanford 分词器来适应他的搜索、分词的需要,同时也能够不通过他那个笨重的分词排序服务来对我们系统中大量的经济、金融类的新闻进行分词、索引,并提供和他自己分词效果类似的分词和检索服务。

Why this project

我在包括百度、某谷姓404网站、GitHub以及国内的中文社区(Elastic中文社区)在内的各种地方搜过也问过了,但是似乎没有一个直接开箱可用的分词插件。所以,我只剩一条路了,就是搭建一个自己的插件来引用这个分词器。

How

对ES来说,插件主要分为两个部分:

  1. 让ES可以看到的部分(class extends Plugin)
  2. 自己行使职能的部分(functional part)

plugin

  1. 为了让ES可以加载我们的plugin,我们需要先继承Plugin类,然后我们这个是个分词器插件,所以还要实现AnalysisPlugin类
  2. 看过ES源码或者其他分词器源码的同学应该会知道,分词器插件需要实现两个方法,一个用来提供tokenizer,一个是analyzer分别对应分词器中的这俩。
    • 重写Map<String, AnalysisModule.AnalysisProvider<TokenizerFactory>>是为了可以提供搜索用分词器
    • 重写Map<String, AnalysisModule.AnalysisProvider<AnalyzerProvider<? extends Analyzer>>>是为了可以提供索引用分词器
  3. 在这个分词器里面我们主要是依靠Tokenizer来实现分词的

functional class

分词器,特别是Tokenizer主要是靠重写三个方法来实现分词的

  1. incrementToken:用来确定每一个词元,输出每一个单词(字)以及它的位置、长度等
  2. reset:用来重制分词结果
  3. end:用来告诉ES,这段文本的分词已经结束了

所以我们主要需要重写的就是这仨方法,当然了,为了能让分词器正确的使用,我们还需要添加一些分词器的配置和初始化的内容,具体代码不写了可以参考我的git,主要讲两个坑:

  1. ES是通过配置文件里的路径来寻找对应的插件类
  2. 然后通过配置文件里的key和刚才提到的代码里的key来寻找对应的分词器,所以这俩地方不要写错了 #plugin-descriptor.properties: classname=org.elasticsearch.plugin.analysis.AnalysisSDPlugin #plugin-descriptor.properties: name=stanford-core-nlp
  3. 在开发过程中由于有java-security的存在,所以需要通过AccessController来调用和加载我们需要的外部jar包

odds and ends

  1. Stanford分词器里面包含了很多功能,目前我使用了分词的部分
  2. 分词器自带词典文件,不过如果要做词典的修改可能需要解包,修改,再重新打包
  3. 我现在hardcode了一大堆的标点符号在里面,后面可能会去优化一下部分逻辑
  4. 待完成的功能还有其他功能包括情感分析之类的

also see

GitHub 地址

收起阅读 »

社区日报 第517期 (2019-01-22)

1、使用logstash搜集csv日志。
http://t.cn/E5Ml4lv
2、日志监控和分析:ELK、Splunk和Graylog对比。
http://t.cn/E5MlcsH
3、从 10 秒到 2 秒!ElasticSearch 性能调优。
http://t.cn/E59fgLI
编辑:叮咚光军
归档:
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1、使用logstash搜集csv日志。
http://t.cn/E5Ml4lv
2、日志监控和分析:ELK、Splunk和Graylog对比。
http://t.cn/E5MlcsH
3、从 10 秒到 2 秒!ElasticSearch 性能调优。
http://t.cn/E59fgLI
编辑:叮咚光军
归档:
订阅:https://tinyletter.com/elastic-daily 收起阅读 »

社区日报 第516期 (2019-01-21)

1.针对Logstash吞吐量一次优化
http://t.cn/E5X40JT

2.Opbeat已死,请用Elastic APM
http://t.cn/EyhRQRJ

3.亿级PV的ELK集群实践之路
http://t.cn/RnvPElX

编辑:cyberdak
归档:https://elasticsearch.cn/article/6339
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1.针对Logstash吞吐量一次优化
http://t.cn/E5X40JT

2.Opbeat已死,请用Elastic APM
http://t.cn/EyhRQRJ

3.亿级PV的ELK集群实践之路
http://t.cn/RnvPElX

编辑:cyberdak
归档:https://elasticsearch.cn/article/6339
订阅:https://tinyletter.com/elastic-daily 收起阅读 »

人民在线招聘ES搜索研发工程师

 岗位描述
1、负责众云大数据平台Elasticsearch相关服务的功能设计、开发、运营和维护工作;
2、持续优化Elasticsearch的性能,完善功能,支持各业务线检索、聚合等场景;
3、负责众云事业部ELK平台的运营和维护工作;
岗位要求
1. 计算机相关专业全日制本科及以上学历,三年以上开发工作经验;
2. 熟练掌握java语言,熟练使用linux,强悍的编码和troubleshooting能力;
3. 深入了解Elasticsearch、Solr等开源搜索引擎,了解Lucene、Elasticsearch源码优先;
4. 精通搜索引擎架构原理、排序算法、索引处理及分词算法,索引数据结构;
5. 熟练掌握常见SQL数据库原理、数据库设计、查询编写和优化;
6. 有基础框架、中间件、基础库的开发经验优先;
7. 具有大型搜索引擎或舆情相关项目经验优先;
8. 对linux kernel、存储、文件系统、分布式任一方向有深入研究者优先;
9. 逻辑分析能力强,善于沟通,有良好的团队合作精神,良好的学习能力;
继续阅读 »
 岗位描述
1、负责众云大数据平台Elasticsearch相关服务的功能设计、开发、运营和维护工作;
2、持续优化Elasticsearch的性能,完善功能,支持各业务线检索、聚合等场景;
3、负责众云事业部ELK平台的运营和维护工作;
岗位要求
1. 计算机相关专业全日制本科及以上学历,三年以上开发工作经验;
2. 熟练掌握java语言,熟练使用linux,强悍的编码和troubleshooting能力;
3. 深入了解Elasticsearch、Solr等开源搜索引擎,了解Lucene、Elasticsearch源码优先;
4. 精通搜索引擎架构原理、排序算法、索引处理及分词算法,索引数据结构;
5. 熟练掌握常见SQL数据库原理、数据库设计、查询编写和优化;
6. 有基础框架、中间件、基础库的开发经验优先;
7. 具有大型搜索引擎或舆情相关项目经验优先;
8. 对linux kernel、存储、文件系统、分布式任一方向有深入研究者优先;
9. 逻辑分析能力强,善于沟通,有良好的团队合作精神,良好的学习能力; 收起阅读 »

社区日报 第515期 (2019-01-20)

1.Java应用日志导入ELK。
http://t.cn/E5GiA1T
2.使用Tokens分发Cassandra数据。
http://t.cn/E5GIOd5
3.(自备梯子)为什么如此难以让计算机像人一样说话?
http://t.cn/EqFOf04

编辑:至尊宝
归档:https://elasticsearch.cn/article/6337
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1.Java应用日志导入ELK。
http://t.cn/E5GiA1T
2.使用Tokens分发Cassandra数据。
http://t.cn/E5GIOd5
3.(自备梯子)为什么如此难以让计算机像人一样说话?
http://t.cn/EqFOf04

编辑:至尊宝
归档:https://elasticsearch.cn/article/6337
订阅:https://tinyletter.com/elastic-daily 收起阅读 »