(一)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数据
建表:
java
--存在表就删除 git
drop table if exists solr; github
--建立一个外部表 redis
create external table solr ( sql
--定义字段,这里面的字段须要与solr的字段一致 mongodb
rowkey string, apache
sname string 编程
) 服务器
--定义存储的storehandler
stored by "com.easy.hive.store.SolrStorageHandler"
--配置solr属性
tblproperties('solr.url' = 'http://192.168.1.28:8983/solr/a',
'solr.query' = '*:*',
'solr.cursor.batch.size'='10000',
'solr.primary_key'='rowkey'
);
执行bin/hive 命令,进行hive的命令行终端:
--查询全部数据
select * from solr limit 5;
--查询指定字段
select rowkey from solr;
--以mr的方式聚合统计solr数据
select sname ,count(*) as c from solr group by sname order by c desc
(2)使用hive给solr构建索引的例子
首先构建数据源表:
--若是存在就删除
drop table if exists index_source;
--构建一个数据表
CREATE TABLE index_source(id string, yname string,sname string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
--向数据源里面导入本地数据
load data local inpath '/ROOT/server/hive/test_solr' into table index_source;
其次,构建solr的关联表:
--删除已经存在的表
drop table if exists index_solr;
--建立关联solr表
create external table index_solr (
id string,
yname string,
sname string
)
--定义存储引擎
stored by "com.easy.hive.store.SolrStorageHandler"
--设置solr服务属性
tblproperties('solr.url' = 'http://192.168.1.28:8983/solr/b',
'solr.query' = '*:*',
'solr.cursor.batch.size'='10000',
'solr.primary_key'='id'
);
最后,执行下面的sql命令,便可给数据源中的数据,构建solr索引:
--注册hive-solr的jar包,不然MR方式运行的时候,将不能正常启动
add jar /ROOT/server/hive/lib/hive-solr.jar;
--执行插入命令
INSERT OVERWRITE TABLE index_solr SELECT * FROM index_source ;
--执行成功以后,便可在solr的终端界面查看,也能够再hive里面执行下面的solr查询
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