Hive数据导入ElasticSearch

关于如何将Hive中的数据导入ES,官方的网站有了详细的介绍。
我这里用的ES的版本为5.6.14。CDH集群用的是cdh6.1.0。
官网地址
es-hadoop的GitHub地址html

一. 主要分为三个步骤

  1. 引入相关的JAR包。
  2. 创建外部表。
  3. 将清洗后的数据写入外部表。

二. 下面详细介绍

1.引入JAR包

引入JAR包的方式比较多,这里参考博主qianshanding0708的文章:https://blog.csdn.net/qianshangding0708/article/details/50381966java

(1)在hive shell中加入

ADD JAR /home/leehom/jar/elasticsearch-hadoop-7.5.1.jarnode

链接方式 是否有效
Hive Shell 不须要重启Hive服务就有效
Hive Server 无效
(2) Jar放入${HIVE_HOME}/auxlib目录

在${HIVE_HOME}中建立文件夹auxlib,而后将自定义jar文件放入该文件夹中。
此方法添加不须要重启Hive。并且比较便捷。git

链接方式 是否有效
Hive Shell 不须要重启Hive服务就有效
Hive Server 重启Hive服务才生效
(3)直接将Jar加入${HIVE_HOME}/lib目录
链接方式 是否有效
Hive Shell 重启Hive服务才生效
Hive Server 重启Hive服务才生效

2. 创建外部表

create external table test.ir_rec_depart_district(
district_id string COMMENT '行政区域id',
depart_district_id string COMMENT '出发地行政区域id', 
product_id string COMMENT '产品ID', 
category_id string COMMENT '品类ID', 
tag_list_level1 string COMMENT '一级标签列表与权重', 
tag_list_level2 string COMMENT '二级标签列表与权重', 
tag_list_level3 string COMMENT '三级标签列表与权重', 
browse_score decimal(12,8) COMMENT '浏览量归一化评分(90天)', 
order_score decimal(12,8) COMMENT '订单量归一化评分(90天)',  
collect_score decimal(12,8) COMMENT '收藏量归一化评分(90天)', 
exposure_score decimal(12,8) COMMENT '搜索曝光量归一化评分(90天)', 
click_score decimal(12,8) COMMENT '搜索点击量归一化评分(90天)', 
favorable_score decimal(12,8) COMMENT '好评率加分(分值有点大的(0~1),建议乘以0.001或更小的权重后使用)', 
up_browse_socre decimal(12,8) COMMENT '浏览量7日环比增量归一化评分', 
up_order_score decimal(12,8) COMMENT '订单量7日环比增量归一化评分', 
api_score_tf string COMMENT '自签评分【自签为10分,非自签为0分,在不一样维度之间加权时能起到绝对做用,保证自签产品排最前】', 
api_score string COMMENT '自签评分【自签为1分,非自签为0分,在不一样维度之间加权时能起到想做用,提高自签产品的排名】')
STORED BY "org.elasticsearch.hadoop.hive.EsStorageHandler" 
TBLPROPERTIES( 'es.nodes' = '10.95.3.172:9200,10.95.3.174:9200,10.95.3.231:9200', 'es.index.auto.create' = 'true','es.resource' = 'rec_depart_district/doc','es.mapping.id' = 'product_id');

3. 清洗后的数据写入外部表

insert overwrite table test.rec_depart_district
SELECT district_id, depart_district_id, product_id, category_id, 
tag_list_level1, tag_list_level2, tag_list_level3, browse_score, order_score, collect_score, 
exposure_score, click_score, favorable_score, up_browse_socre, up_order_score, api_score_tf, api_score  from dml.dml_personalrec_dimrec_district_depart
limit 10;

以后会生成一个mapreduce任务,执行完以后就能够在elasticsearch中看到索引了。
补充一下在hive中设置队列以及mapreduce内存的方法。github

hive --hiveconf mapreduce.job.queuename=leehom
set mapreduce.map.memory.mb=2048;​//在进入hiveshell以后设置
set mapreduce.reduce.memory.mb=2048;

注意:jar包若是不引入彻底的话,会报错。web

缺乏httpclient-4.5.5.jar会报以下错误:sql

Error: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/apache/commons/httpclient/protocol/ProtocolSocketFactory

缺乏org.apache.commons.httpclient.jar会报以下错误:shell

Error: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/apache/commons/httpclient/Credentials

导入成功的过程图以下:
在这里插入图片描述
查看ES中索引的数据:
在这里插入图片描述apache

相关JAR包的下载地址
若有问题能够私信我,或者进入个人主页:指尖飞码的博客 留言。api