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.aux.jars.path 属性(可以通过命令行指定,或者如果可用,可以通过 hive-site.xml 文件指定)来注册额外的 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 时,可以使用 TBLPROPERTIES 来指定配置属性(作为 Hadoop Configuration 对象的替代方案),当声明由 Elasticsearch 支持的外部表时。

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 的形式返回。