(一)Hive+Solr简介

Hive作为Hadoop生态系统里面离线的数据仓库,可以非常方便的使用SQL的方式来离线分析海量的历史数据,并根据分析的结果,来干一些其他的事情,如报表统计查询等。 
Solr作为高性能的搜索服务器,能够提供快速,强大的全文检索功能。

(二)为什么需要hive集成solr?

有时候,我们需要将hive的分析完的结果,存储到solr里面进行全文检索服务,比如以前我们有个业务,对我们电商网站的搜索日志使用hive分析完后 存储到solr里面做报表查询,因为里面涉及到搜索关键词,这个字段是需要能分词查询和不分词查询的,通过分词查询可以查看改词的相关的产品在某一段时间内的一个走势图。 有时候,我们又需要将solr里面的数据加载到hive里面,使用sql完成一些join分析功能, 两者之间优劣互补,以更好的适应我们的业务需求。当然网上已经有一些hive集成solr的开源项目,但由于 版本比较旧,所以无法在新的版本里面运行,经过散仙改造修补后的可以运行在最新的版本。

(三)如何才能使hive集成solr?

所谓的集成,其实就是重写hadoop的MR编程接口的一些组件而已。我们都知道MR的编程接口非常灵活,而且高度抽象,MR不仅仅可以从HDFS上加载 数据源,也可以从任何非HDFS的系统中加载数据,当然前提是我们需要自定义: 
InputFormat 
OutputFormat 
RecordReader 
RecordWriter 
InputSplit 
组件,虽然稍微麻烦了点,但从任何地方加载数据这件事确实可以做到,包括mysql,sqlserver,oracle,mongodb, solr,es,redis等等。

上面说的是定制Hadoop的MR编程接口,在Hive里面除了上面的一些组件外,还需要额外定义SerDe组件和组装StorageHandler,在hive里面 SerDe指的是 Serializer and Deserializer,也就是我们所说的序列化和反序列化,hive需要使用serde和fileinput来读写hive 表里面的一行行数据。 
读的流程: 
HDFS files / every source -> InputFileFormat --> --> Deserializer --> Row object 
写的流程: 
Row object --> Serializer --> --> OutputFileFormat --> HDFS files / every source

(四)hive集成solr后能干什么?

(1)读取solr数据,以hive的支持的SQL语法,能进行各种聚合,统计,分析,join等 
(2)生成solr索引,一句SQL,就能通过MR的方式给大规模数据构建索引

(五)如何安装部署以及使用? 
源码在这里,不在粘贴了,已经上传github了,有需要的朋友可以使用 git clonehttps://github.com/qindongliang/hive-solr 后,修改少许pom文件后,执行 
mvn clean package 
命令构建生成jar包,并将此jar包拷贝至hive的lib目录即可

例子如下: 
(1)hive读取solr数据

建表:

  1. --存在表就删除
  2. drop table  if exists solr;
  3. --创建一个外部表
  4. create external table solr (
  5. --定义字段,这里面的字段需要与solr的字段一致
  6. rowkey string,
  7. sname string
  8. )
  9. --定义存储的storehandler
  10. stored by "com.easy.hive.store.SolrStorageHandler"
  11. --配置solr属性
  12. tblproperties('solr.url' = 'http://192.168.1.28:8983/solr/a',
  13. 'solr.query' = '*:*',
  14. 'solr.cursor.batch.size'='10000',
  15. 'solr.primary_key'='rowkey'
  16. );
  17. 执行bin/hive 命令,进行hive的命令行终端:
  18. --查询所有数据
  19. select * from solr limit 5;
  20. --查询指定字段
  21. select rowkey from solr;
  22. --以mr的方式聚合统计solr数据
  23. select sname ,count(*) as c from solr group by sname  order by c desc

(2)使用hive给solr构建索引的例子

首先构建数据源表:

  1. --如果存在就删除
  2. drop table if exists index_source;
  3. --构建一个数据表
  4. CREATE TABLE index_source(id string, yname string,sname string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
  5. --向数据源里面导入本地数据
  6. load  data local inpath '/ROOT/server/hive/test_solr' into table index_source;
  7. 其次,构建solr的关联表:
  8. --删除已经存在的表
  9. drop table  if exists index_solr;
  10. --创建关联solr表
  11. create external table index_solr (
  12. id string,
  13. yname string,
  14. sname string
  15. )
  16. --定义存储引擎
  17. stored by "com.easy.hive.store.SolrStorageHandler"
  18. --设置solr服务属性
  19. tblproperties('solr.url' = 'http://192.168.1.28:8983/solr/b',
  20. 'solr.query' = '*:*',
  21. 'solr.cursor.batch.size'='10000',
  22. 'solr.primary_key'='id'
  23. );

最后,执行下面的sql命令,即可给数据源中的数据,构建solr索引:

  1. --注册hive-solr的jar包,否则MR方式运行的时候,将不能正常启动
  2. add jar /ROOT/server/hive/lib/hive-solr.jar;
  3. --执行插入命令
  4. INSERT OVERWRITE TABLE index_solr SELECT * FROM  index_source ;
  5. --执行成功之后,即可在solr的终端界面查看,也可以再hive里面执行下面的solr查询
  6. select * from index_solr limit 10 ;

(六)他们还能其他的框架集成么?

当然,作为开源独立的框架,我们可以进行各种组合, hive也可以和elasticsearch进行集成,也可以跟mongodb集成, solr也可以跟spark集成,也可以跟pig集成,但都需要我们自定义相关的组件才行,思路大致与这个项目的思路一致。

(七)本次测试通过的基础环境

Apache Hadoop2.7.1 
Apache Hive1.2.1 
Apache Solr5.1.0

(八)感谢并参考的资料:

https://github.com/mongodb/mongo-hadoop/tree/master/hive/src/main/java/com/mongodb/hadoop/hive 
https://github.com/lucidworks/hive-solr 
https://github.com/chimpler/hive-solr 
https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide#DeveloperGuide-HowtoWriteYourOwnSerDe

最新文章

  1. OpenCV模板匹配算法详解
  2. BZOJ 3224: Tyvj 1728 普通平衡树
  3. 科蓝软件急招前端开发、PHP、.NET工程师
  4. 【Alpha版本】十天冲刺集结令
  5. VPN添加静态路由表(指定程序或资源走VPN)
  6. CentOS-6 yum安装nginx php53 mysql55 搭建LNMP环境
  7. UIColor 分类 16进制转 RGB
  8. Objective-C 【protocol-协议 的了解使用】
  9. [转]《深度探索C++对象模型》读书笔记[一]
  10. 【Python】Python&&MySQL
  11. 使用Azure Policy(策略)强制实现资源Tag的坑
  12. 东风本田/XR-V/2017款
  13. React中this.props的主要属性
  14. Arduino Core For ESP8266
  15. Fidder 请求信息颜色的含义
  16. hdu 4960 数列合并
  17. SQL Server自动备份 备份到本地或者远程服务器
  18. DPSR随手笔记
  19. css3 弹性盒模型 变化
  20. string logo online customization

热门文章

  1. 10. Python面向对象
  2. LeetCode 相交链表&环形链表II
  3. webpack中代理配置(proxyTable)
  4. 前端(十一)—— JavaScript基础:JS存在的位置、JS变量定义、调试方式、JS数据类型、运算符
  5. Java各版本的含义
  6. Java 序列化和反序列化(三)Serializable 源码分析 - 2
  7. Spring Boot Restful WebAPI集成 OAuth2
  8. 爬虫抓取5大门户网站和电商数据day1:基础环境搭建
  9. vuex-along解决vuex中存储的数据在页面刷新之后失去的问题
  10. 网络编程之 TCP-UDP的详细介绍