Apache Hive 集成

编辑

Hive 是一个用于 Hadoop 的数据仓库系统,它简化了数据汇总、即席查询以及存储在 Hadoop 兼容文件系统中的大型数据集的分析。

-- Hive 网站

Hive 通过类似 SQL 的语言 HiveQL 对 Hadoop 进行抽象,以便用户可以像使用 SQL 一样对它应用数据定义和操作。在 Hive 中,数据集通过(公开类型信息)进行定义,其中数据可以通过内置操作符或自定义/用户定义函数(或UDF)进行加载选择和转换

安装

编辑

使 elasticsearch-hadoop jar 在 Hive 类路径中可用。根据您的选项,有多种方法可以实现这一点。使用ADD 命令将文件、jar(我们想要的内容)或归档文件添加到类路径

ADD JAR /path/elasticsearch-hadoop.jar;

该命令需要一个正确的 URI,该 URI 可以位于本地文件系统或远程位置。通常最好使用分布式文件系统(如 HDFS 或 Amazon S3),因为脚本可能在多台机器上执行。

当使用 JDBC/ODBC 驱动程序时,ADD JAR 命令不可用,将被忽略。因此,建议使 jar 在 Hive 全局类路径中可用,并在下面指示。

或者,可以使用命令行

CLI 配置。

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

或使用通过命令行或(如果可用)通过hive-site.xml 文件指定的hive.aux.jars.path 属性来注册其他 jar(也接受 URI)

$ bin/hive -hiveconf hive.aux.jars.path=/path/elasticsearch-hadoop.jar

或者,如果可以修改hive-site.xml 配置,则可以通过hive.aux.jars.path 选项(也接受 URI)注册其他 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>

配置

编辑

当使用 Hive 时,可以在声明由 Elasticsearch 支持的外部表时,使用TBLPROPERTIES 指定配置属性(作为 Hadoop Configuration 对象的替代方法)

CREATE EXTERNAL TABLE artists (...)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'radio/artists',
              'es.index.auto.create' = 'false'); 

elasticsearch-hadoop 设置

映射

编辑

默认情况下,elasticsearch-hadoop 使用 Hive 表架构来映射 Elasticsearch 中的数据,在此过程中使用字段名称和类型。但是,在某些情况下,Hive 中的名称不能与 Elasticsearch 一起使用(字段名称可能包含 Elasticsearch 接受但 Hive 不接受的字符)。对于此类情况,可以使用es.mapping.names 设置,该设置接受以下格式的逗号分隔映射名称列表:Hive 字段名称:Elasticsearch 字段名称

例如

CREATE EXTERNAL TABLE artists (...)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'radio/artists',
            'es.mapping.names' = 'date:@timestamp, url:url_123'); 

Hive 列date 映射到 Elasticsearch 中的@timestamp;Hive 列url 映射到 Elasticsearch 中的url_123

Hive 不区分大小写,而 Elasticsearch 区分大小写。信息丢失会导致无效查询(因为 Hive 中的列可能与 Elasticsearch 中的列不匹配)。为了避免这种情况,elasticsearch-hadoop 将始终将 Hive 列名称转换为小写。也就是说,建议使用默认的 Hive 样式,仅对 Hive 命令使用大写名称,并避免使用混合大小写名称。

Hive 通过一个特殊值NULL 处理缺失值,如此处所示。这意味着,当运行不正确的查询(使用不正确或不存在的字段名称)时,Hive 表将填充NULL,而不是抛出异常。请务必验证您的数据并密切关注您的架构,因为由于这种宽松的行为,否则更新将不会被注意到。

将数据写入 Elasticsearch

编辑

使用 elasticsearch-hadoop,Elasticsearch 成为一个外部,可以在其中加载或读取数据

CREATE EXTERNAL TABLE artists (
    id      BIGINT,
    name    STRING,
    links   STRUCT<url:STRING, picture:STRING>)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'radio/artists'); 

-- insert data to Elasticsearch from another table called 'source'
INSERT OVERWRITE TABLE artists
    SELECT NULL, s.name, named_struct('url', s.url, 'picture', s.picture)
                    FROM source s;

Elasticsearch Hive StorageHandler

与给定存储关联的 Elasticsearch 资源(索引和类型)

对于需要指定文档的 id(或其他元数据字段,如ttltimestamp)的情况,可以通过设置相应的映射(即es.mapping.id)来实现。按照前面的示例,要指示 Elasticsearch 使用字段id 作为文档 id,请更新table 属性

CREATE EXTERNAL TABLE artists (
    id      BIGINT,
    ...)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.mapping.id' = 'id'...);

将现有 JSON 写入 Elasticsearch

编辑

对于作业输入数据已为 JSON 的情况,elasticsearch-hadoop 允许直接索引,无需应用任何转换;数据按原样获取并直接发送到 Elasticsearch。在这种情况下,需要通过设置es.input.json 参数来指示 json 输入。因此,在这种情况下,elasticsearch-hadoop 期望输出表仅包含一个字段,其内容用作 JSON 文档。也就是说,库将识别特定的文本类型(如stringbinary)或简单地调用(toString)。

表 3. 用于 JSON 表示的 Hive 类型

Hive 类型 注释

binary

当 JSON 数据表示为byte[] 或类似类型时,请使用此类型

string

如果 JSON 数据表示为String,请使用此类型

其他任何类型

确保toString() 返回所需的 JSON 文档

varchar

用作 Hive string 的替代方案

确保数据已正确编码,使用UTF-8。字段内容被视为发送到 Elasticsearch 的文档的最终形式。

CREATE EXTERNAL TABLE json (data STRING) 
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = '...',
              'es.input.json` = 'yes'); 
...

表声明仅包含一个类型为STRING 的字段

指示 elasticsearch-hadoop 表内容采用 JSON 格式

写入动态/多资源

编辑

可以通过使用模式将数据索引到不同的资源,具体取决于正在读取的。回到前面提到的媒体示例,可以将其配置如下

CREATE EXTERNAL TABLE media (
    name    STRING,
    type    STRING,
    year    STRING,
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'my-collection-{type}/doc'); 

资源模式使用的表字段。可以使用任何已声明的字段。

使用字段type 的资源模式

对于即将写入的每个,elasticsearch-hadoop 将提取type 字段并使用其值来确定目标资源。

在处理原始 JSON 时,此功能也可用 - 在这种情况下,将从 JSON 文档本身提取该值。假设 JSON 源包含具有以下结构的文档

{
    "media_type":"music",
    "title":"Surfing With The Alien",
    "year":"1987"
}

模式将使用的 JSON 文档中的字段

表声明可以如下所示

CREATE EXTERNAL TABLE json (data STRING) 
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'my-collection-{media_type}/doc', 
              'es.input.json` = 'yes');

表的架构声明。由于使用了 JSON 输入,因此架构只是原始数据的持有者

依赖于 JSON 文档内部的字段而非表架构的资源模式

从 Elasticsearch 读取数据

编辑

从 Elasticsearch 读取数据非常相似

CREATE EXTERNAL TABLE artists (
    id      BIGINT,
    name    STRING,
    links   STRUCT<url:STRING, picture:STRING>)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'radio/artists', 
              'es.query' = '?q=me*');          

-- stream data from Elasticsearch
SELECT * FROM artists;

相同的 Elasticsearch Hive StorageHandler

Elasticsearch 资源

Elasticsearch 查询

类型转换

编辑

如果使用自动索引创建,请查看部分以获取更多信息。

Hive 提供了多种类型来定义数据,并在内部使用不同的实现,具体取决于目标环境(从 JDK 原生类型到二进制优化类型)。Elasticsearch 与所有这些类型集成,包括 Serde2 lazylazy binary

Hive 类型 Elasticsearch 类型

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

不支持(尚不支持)

decimal

string

date

date

varchar

string

char

string

虽然 Elasticsearch 理解 Hive 2.0 版本之前的类型,但它与 Hive 1.0 向后兼容

值得一提的是,Elasticsearch 中仅有的丰富数据类型,例如GeoPointGeoShape,都支持将其结构转换为上表中提供的基本类型。例如,基于其存储,geo_point 可能作为stringarray 返回。