温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。
Fayson的github:https://github.com/fayson/cdhproject
提示:代码块部分可以左右滑动查看噢
1.文档编写目的
Fayson在上篇文章《如何在CDH中使用Solr对HDFS中的JSON数据建立全文索引》简单介绍了Solr,然后利用Cloudera提供的Morphline工具通过创建MapReduce可以实现对HDFS中的半/非结构化数据的批量建立全文索引。本文主要介绍如何使用Morphline工具通过Flume实时的对数据建立全文索引。
- 内容概述
1.索引建立流程
2.准备数据
3.在Solr中建立collection
4.编辑Morphline配置文件
5.启动Flume监听并实时建立索引
6.查询验证
- 测试环境
1.RedHat7.4
2.CM5.14.3
3.CDH5.14.2
4.Solr4.10.3
5.集群未启用Kerberos
- 前置条件
1.Solr服务已经安装并运行正常
2.Hue中已经配置集成Solr服务
2.索引建立流程
见下图为本文档将要讲述的使用Solr建立全文索引的过程:
1.先将准备好的半/非结构化数据放置在本地。
2.在Solr中建立collection,这里需要定义一个schema文件对应到本文要使用的json数据,需要注意格式对应。
3.修改Morphline的配置文件,使用Morphline解析json的功能。
4.配置flume的conf文件,使用MorphlineSolrSink,并配置指向到Morphline配置文件
5.启动flume agent的监听任务
6.启动flume的avro-client开始发送之前准备好的数据文件
Cloudera Search提供了一个比较方便的工具可以基于HDFS中的数据批量建立索引。见上图称作MapReduce Indexing Job,是属于Morphlines的一部分。
Morphline Commands是Cloudera Search项目的一部分,实现了Flume、MapReduce、HBase、Spark到Apache Solr的数据ETL。Morphline可以让你很方便的只通过使用配置文件,较为方便的解析如csv,json,avro等数据文件,并进行ETL入库到HDFS,并同时建立Solr的全文索引。从而避免了需要编写一些复杂的代码。
3.准备数据
1.准备生成一些json格式的样例数据,生成数据的Java代码如下。
(可左右滑动)
因为Fayson的AWS环境配置较低,这里只作为实验生成300W行数据,大约100MB。
Fayson为了方便后面观察Flume实时入库并建立索引的效果,这里比上一篇文章的数据放大了10倍,否则数据太少,一下入库完毕,看不出实时的效果。
2.将Java代码打包成jar并上传到服务器执行,生成数据。
(可左右滑动)
查看该数据,为300W行,1GB。
(可左右滑动)
4.在Solr中建立collection
1.根据json文件准备schema文件。根据第三章的json格式数据内容可以看到一共有id,username,created_at,text,text_cn几个属性项。在Solr的collection的schema文件中都要有相应的对应,如下所示:
(可左右滑动)
注意Solr在建立全文索引的过程中,必须指定唯一键(uniqueKey),类似主键,唯一确定一行数据,跟上篇文章不一样,我们没有使用json中的id属性项,而选择了让solr自动生成,因为Fayson的造数代码是使用的Java,id那一列是随机数函数Math,数据量大了,没办法保持id的唯一性,所以采用了Solr来自动生成,更好的保持唯一性,该uuid会在Morphline配置文件中配置,大家可以继续往后查看Morphline配置文件章节进行对比。
schema文件中的字段类型定义,标准如int,string,long等这里不再说明,注意有两个类型text_cn,text_ch,主要对应到英文或者中文的文字内容,涉及到分词和全文检索技术。英文的分词和全文检索是默认自带的,中文的这里使用了一个开源的Solr的中文分词包lucene-analyzers-smartcn。下载地址为:
2.准备建立collection的脚本
(可左右滑动)
ZK:Zookeeper的某台机器的hostname
COLLECTION:需要建立的collection名字
SHARD:需要建立的shard的数量
REPLICA:副本数
3.执行create.sh脚本建立collection
(可左右滑动)
5.编辑Morphline配置文件
1.准备Morphline的配置文件
(可左右滑动)
根据上图可以看到配置项里包括:
collection的名字,Zookeeper的地址
注意我们使用了readjson方法,然后对应到我们之前定义的schema文件里的json属性项
比上篇文章不一样的地方,我们引入了uuid,对应到第四章schema文件中的uuuid
6.下载分发中文分词jar包
1.将中文分词包拷贝到指定的目录,首先到以下网址下载中文分词的jar包
(可左右滑动)
将中文分词jar包分发到所有机器的Solr和YARN服务相关的目录
(可左右滑动)
2.分发到集群所有机器
(可左右滑动)
7.启动Flume监听并实时建立索引
1.配置Flume监听启动时需要使用的配置文件
(可左右滑动)
2.启动Flume监听
(可左右滑动)
3.启动flume的avro client开始发送数据
(可左右滑动)
4.使用Solr的查询界面可以实时的看到数据在慢慢进入Solr,并建立索引。
Flume的avro client发送数据完毕,已经关闭客户端。
Flume监听这边显示连接断开
入库数据约为176W,说明还在继续入库
再次等待一会,数据最终入库完毕,300W条。
8.Solr自带界面全文索引查询验证
1.从Cloudera Manger中选择Solr并进入其中一台Solr Server的界面
2.选择一个collection的shard并进入collection的查询界面
3.点击query按钮,准备开始查询数据
4.查询全部数据
5.得到查看结果是300W条,符合预期,表明所有数据都已经入库成功
6.查询关键字“实际”,发现查询结果会显示所有带有“实际”词语的条目,一共273250条。
9.使用Hue进行全文索引查询验证
1.进入Hue并选择“Indexes”页面
2.选择collection1
3.点击右上角放大镜查询图标
4.总数为300W条,符合预期
5.同样查询“实际”关键字,发现“实际”会被高亮,并且27453条符合预期,与第8节使用Solr自带界面查询的结果也是相符合的。
10.总结
1.使用Cloudera提供的Morphline工具,可以让你不需要编写一行代码,只需要通过使用一些配置文件就可以快速的对半/非机构化数据进行全文索引。而且还可以实现Flume的准实时建立索引
2.本文demo提供的中文分词是比较弱的,要想真正上生产使用,可以考虑使用更好的开源中文分词包或者其他第三方的。
3.注意如果全文索引的字段有需要做中文分词的,需要将中文分词的jar包上传到所有机器的Solr和YARN服务相关的目录。否则Solr会无法创建collection,YARN也无法启动创建索引的MapReduce任务。
4.本文只是以json格式的数据进行举例验证,实际Morphline还支持很多其他的格式,包括结构化数据csv,HBase中的数据等等。具体请参考:
5.如果数据文件没有唯一确定的id字段,类似主键,可以使用morphline的uuid功能,保证所有数据都能入库成功,否则可能导致数据丢失。
http://kitesdk.org/docs/1.1.0/morphlines/
https://www.cloudera.com/documentation/enterprise/latest/topics/search.html
本文所有代码或脚本源码已上传到github,参考:
https://github.com/fayson/cdhproject/tree/master/generatedata/solr-hdfs-flume
提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操