现有一需求,需要将Hive的表与ElasticSearch关联起来,数据插入Hive表后,可以直接在elasticsearch中查询。

1.下载elasticsearch-hadoop依赖

请前往https://www.elastic.co/downloads/past-releases下载对应版本的依赖包,我这边的ES集群版本为5.2.2。所以下面的示例都已ES5.2.2版本来演示。 解压依赖包,将其中的elasticsearch-hadoop-5.2.2.jar上传到hive的机器上。

2.给Hive添加Elasticsearch的依赖

在hive的机器上执行hive,进入交互模式:

1
hive

执行如下命令,将ES的依赖添加到hive中去。

1
ADD JAR /var/lib/hadoop-hdfs/elasticsearch-hadoop-5.2.2.jar;

看到如下提示:

1
2
Added /var/lib/hadoop-hdfs/elasticsearch-hadoop-5.2.2.jar to class path
Added resources: /var/lib/hadoop-hdfs/elasticsearch-hadoop-5.2.2.jar

此时表示hive已经支持elasticsearch了。 接着创建hive表

1
2
3
4
5
CREATE EXTERNAL TABLE user\_hive (
ID BIGINT,
USER\_ID BIGINT,
USER\_NAME STRING
) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES( 'es.mapping.id'='id','es.resource' = 'user\_hive/user\_info', 'es.nodes'='10.10.161.1','es.port'='9200','es.mapping.date.rich' = 'false');

其中'es.mapping.id'='id'表示将hive表中的id作为es中的索引ID。参考文档:https://www.elastic.co/guide/en/elasticsearch/hadoop/current/hive.html#_writing_data_to_elasticsearch_2 'es.resource' = 'user_hive/user_info'表示elasticsearch中的索引名称/索引类型 es.nodes表示elasticsearch的节点地址。 接着创建ElasticSearch,mapping如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"mappings": {
"user_info": {
"properties": {
"ID": {
"type": "long"
},
"USER_ID": {
"type": "integer"
},
"USER_NAME": {
"type": "text"
}
}
}
}
}

在hive中执行如下命令查看数据:

1
insert into table user_hive select 1,2,'abc';

在Kibana中查看数据

1
2
3
4
5
6
7
8
9
10
11
12
13
GET user_hive/user_info/_search

{
"_index": "user_hive",
"_type": "user_info",
"_id": "1",
"_score": 1,
"_source": {
"ID": 1,
"USER_ID": 2,
"USER_NAME": "abc"
}
}

此时将数据加载到Hive的时候,便可以通过ElasticSearch去查询了。