现有一需求,需要将Hive的表与ElasticSearch关联起来,数据插入Hive表后,可以直接在elasticsearch中查询。
请前往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,进入交互模式:
hive
执行如下命令,将ES的依赖添加到hive中去。
ADD JAR /var/lib/hadoop-hdfs/elasticsearch-hadoop-5.2.2.jar;
看到如下提示:
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表
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如下:
{ "mappings": { "user_info": { "properties": { "ID": { "type": "long" }, "USER_ID": { "type": "integer" }, "USER_NAME": { "type": "text" } } } } }
在hive中执行如下命令查看数据:
insert into table user_hive select 1,2,'abc';
在Kibana中查看数据
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去查询了。