分享

flume的MorphlineSolrSink的配置方式

mjjian0 2014-6-18 16:34:42 发表于 疑问解答 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 10 25682
由于公司业务需要,我需要通过flume监控日志上传到solr服务器,目前这一步已经做到
但是最终的目的还没有达成,遇到了点问题。
我们要做统计搜索关键字的次数。
目前监控的日志文件数据格式:
keyword hits
沙发 1
沙发 1
床 1
床 1
solr显示的数据是这样的:

<result name="response" numFound="811" start="0">  <doc>    <str name="id">93ec2008bdd976e9cb2bb51e13dbf0b1</str>    <str name="keyword">沙发</str>    <int name="hits">1</int>    <long name="_version_">1437794097399070720</long></doc>  <doc>    <str name="id">a6d937fcb68f9d58fbb31f7aa862f3a0</str>    <str name="keyword">沙发</str>    <int name="hits">1</int>    <long name="_version_">1437794097401167872</long></doc>
<doc>    <str name="id">a6d937fcb68f9d58fbb31f7aa862f3a0</str>    <str name="keyword">床</str>    <int name="hits">1</int>    <long name="_version_">1437794097401167872</long></doc>  <doc>    <str name="id">f19a14483460fbd68cb2c40fed4c9f3a</str>    <str name="keyword">床</str>    <int name="hits">1</int>    <long name="_version_">1437794097401167873</long></doc>
</result>
我们想显示相同keyword 只显示一条,而hits相加(这一步骤好像是要通过配置文件morphline.conf控制的,具体的要懂里面的语法,但是问题就是这种语法,只有在官方文档有,全英文,看不懂,我看了好像也没有我需要的,或者是我没有发现,有没有大神能帮忙的啊,急救啊,
http://cloudera.github.io/cdk/docs/current/cdk-morphlines/morphlinesReferenceGuide.html#/if
):
<result name="response" numFound="811" start="0">  <doc>    <str name="id">93ec2008bdd976e9cb2bb51e13dbf0b1</str>    <str name="keyword">沙发</str>    <int name="hits">2</int>    <long name="_version_">1437794097399070720</long></doc>  <doc>    <str name="id">a6d937fcb68f9d58fbb31f7aa862f3a0</str>    <str name="keyword"></str>    <int name="hits">2</int>    <long name="_version_">1437794097401167872</long></doc>
</result>


已有(10)人评论

跳转到指定楼层
sstutu 发表于 2014-6-18 17:00:55
你直接更新文档就好了,比如下面:

利用SolrJ完成Index Document的添加操作
  1. /**
  2. * <b>function:</b> 添加doc文档
  3. * @author hoojo
  4. * @createDate 2011-10-21 上午09:49:10
  5. */
  6. @Test
  7. public void addDoc() {
  8.     //创建doc文档
  9.      SolrInputDocument doc = new SolrInputDocument();
  10.     doc.addField("id", 1);
  11.     doc.addField("name", "Solr Input Document");
  12.     doc.addField("manu", "this is SolrInputDocument content");
  13.    
  14.     try {
  15.         //添加一个doc文档
  16.         UpdateResponse response = server.add(doc);
  17.         fail(server.commit());//commit后才保存到索引库
  18.         fail(response);
  19.         fail("query time:" + response.getQTime());
  20.         fail("Elapsed Time:" + response.getElapsedTime());
  21.         fail("status:" + response.getStatus());
  22.     } catch (SolrServerException e) {
  23.         e.printStackTrace();
  24.     } catch (IOException e) {
  25.         e.printStackTrace();
  26.     }
  27.     query("name:solr");
  28. }
复制代码




在apache-solr-3.4.0\example\solr\conf目录下的schema.xml中可以找到有关于field属性的配置,schema.xml中的field就和上面Document文档中的field(id、name、manu)对应。如果出现ERROR:unknown field 'xxxx'就表示你设置的这个field在schema.xml中不存在。如果一定要使用这个field,请你在schema.xml中进行filed元素的配置。具体请参考前面的章节。

注意这里对你的问题很重要:在schema.xml中配置了uniqueKey为id,就表示id是唯一的。如果在添加Document的时候,id重复添加。那么后面添加的相同id的doc会覆盖前面的doc,类似于update更新操作,而不会出现重复的数据,(这里也就是你说说hits增加,你直接做一个更新不就行了)





回复

使用道具 举报

sstutu 发表于 2014-6-18 17:58:25
你这个属于solr更新操作吧。

可以参考下面内容

solr索引操作
在 Solr 中,通过向部署在 servlet 容器中的 Solr Web 应用程序发送 HTTP 请求来启动索引和搜索。Solr 接受请求,确定要使用的适当 SolrRequestHandler,然后处理请求。通过 HTTP 以同样的方式返回响应。默认配置返回 Solr 的标准 XML 响应。你也可以配置 Solr 的备用响应格式,如json、csv格式的文本。

索引就是接受输入元数据(数据格式在schema.xml中进行配置)并将它们传递给 Solr,从而在 HTTP Post XML 消息中进行索引的过程。你可以向 Solr 索引 servlet 传递四个不同的索引请求:

add/update 允许您向 Solr 添加文档或更新文档。直到提交后才能搜索到这些添加和更新。
commit 告诉 Solr,应该使上次提交以来所做的所有更改都可以搜索到。
optimize 重构 Lucene 的文件以改进搜索性能。索引完成后执行一下优化通常比较好。如果更新比较频繁,则应该在使用率较低的时候安排优化。一个索引无需优化也可以正常地运行。优化是一个耗时较多的过程。
delete 可以通过 id 或查询来指定。按 id 删除将删除具有指定 id 的文档;按查询删除将删除查询返回的所有文档。
Lucene中操作索引也有这几个步骤,但是没有更新。Lucene更新是先删除,然后添加索引。因为更新索引在一定情况下,效率没有先删除后添加的效率好。

详细可以参考:
Solr开发文档:Solr详细介绍



回复

使用道具 举报

hyj 发表于 2014-6-18 18:02:54
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

mjjian0 发表于 2014-6-19 09:18:27
hyj 发表于 2014-6-18 18:02
你是想说,里面的文件追加后,不是增加文件,而是增加参数hits+1?

比如说我的日志文件内容是:床       1
沙发    1
床       1
沙发    1

(床,沙发表示关键字,1表示客户搜索了一次)
而我要做的就是 统计次数

在solr 相同的关键字只出现一次,但是hits是代表总次数



回复

使用道具 举报

mjjian0 发表于 2014-6-19 09:19:22
sstutu 发表于 2014-6-18 17:58
你这个属于solr更新操作吧。

可以参考下面内容

你的思路我先好好体会一下,然后再看看行不行的通
回复

使用道具 举报

mjjian0 发表于 2014-6-19 15:55:14
我用flume把数据放在solr  但是不符合要求 我要通过java程序 操作 solr里的数据并更新solr 不知道 java能不能实现,如果这样实现了,效率会很低吧
回复

使用道具 举报

hyj 发表于 2014-6-19 19:09:08
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

mjjian0 发表于 2014-6-20 13:40:18
hyj 发表于 2014-6-19 19:09
你理想的方式什么?

我现在考虑用flume把数据上传到hdfs上,然后在用hive经过分析传到solr。目前正在搭建这样一套环境。
回复

使用道具 举报

wtaisi 发表于 2017-5-5 15:29:12
hyj 发表于 2014-6-19 19:09
你理想的方式什么?

flume采集到的数据是怎样上传到solr服务器?大神,morphline不懂。有没有参考?求教
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条