Hadoop第十一讲-搜索推荐

案例1:(Search Suggestion)在搜索引擎中打入字的时候会提示常用的搜索,并且显示最常搜索的几个推荐给用户。

采用virtual box模拟Linux集群,要是有任务时就在虚拟机中运行这些任务。使用eclipse进行Hadoop的开发前面有讲到这里不再叙述。

首先建立一个web项目并且导入struts相关jar包,并且添加相应的过滤器到web.xml中。使得该web项目能够运行。同时配置struts.xml文件。

现在一份bootstrap放在WebContent目录下面。网址:http://www.bootcss.com/

首先在WebContent建立一个suggestion目录其中创建一个jsp文件sug.jsp,然后实现其内容代码如下:

            

这里需要使用Ajasx技术,即用户每输入一个词就会先后太发送当前输入的数据。这里使用JQuery的autocomplete,向后台提供输入内容,然后后台讲处理后的信息在传递到该input中。因此需要引入JQuery:

           

然后在head标签类添加JavaScript脚本:

minLength:1表示当输入框中有多少字符的时候先后台发送数据,这里设置为1。每一次改变都会执行source里面的function,该函数就发起了一个Ajax请求。一个Ajax请求有以下部分构成:url请求的目的地址,数据类型是 json;data是指将输入框input的内容传递到Ajax中request.query中(实际上就是发起一个带query参数的请求);然后success是指当Ajax成功返回后,使用function对数据进行处理,处理过程是将Ajax返回的数据填充到对话框里面。可以用firebug的XHR选项查看是否有Ajax请求。

          

下面需要配置struts,处理action请求:需要注意的是报名时ajax,继承自json-default,且结果也是 json类型。

           

然后需要创建Action,对action请求进行处理,返回到处理的结果。

            

最后需要根据用户的输入query,通过Hadoop进行查找最近搜索频率最给的词组推荐给用户。

在Hadoop中安装Redis

下面讲一下需要用到的缓存系统Redis,系统提供的源代码需要进行编译。下载到Ubuntu系统中,进入源代码目录使用make进行编译。

编译完成后,根据提示进入utils目录运行脚本install_server.sh进行安装,并且根据提示进行设置。安装成功后使用命令service redis start启动服务。

使用命令ps -ef | grep redis查看是否已经运行。进入Redis的命令行界面的命令为:redis-cli即可进入。

常用get、set命令有:

      

我们还需要使用Redis的有序集,具体使用可以参见中文参考文档http://redisdoc.com/ 

      

由于我们需要在web项目中使用java访问redis,因此需要引入redis的jar客户端,需要独立下载jedis-2.1.0.jar,引入到web项目中。在getResult中访问redis取其中的数据的相关代码是:

        

上面仅仅显示前六个访问频率最高(zscore)的值其中key=query,可选项是key对应的value值而我们要实现的取出和打入关键字开头的频率最高的词组。这样的话就需要通过分词建立倒排索引。因此用户查询时必须要保证数据能够在1s就返回,因此我们需要建立索引放在内存数据库中,这样才能快速查询。

那么应该如何准备查询的数据呢?使用Hadoop对数据进行处理建立确定每一个查询字符串出现的次数,因此需要Hadoop对查询日志中的查询字符串进行处理。

那么如何在搜索日志中统计出现的频率呢,我们在tomcat的conf/servser.xml文件中的<Host></Host>元素中的Access log中配置,因为每一次请求tomcat就会记录相应的日志信息,这里我们需要将Value中的fileDateFormat配置成安秒写入日志,这样能够方便Hadoop日志的查看。

        

在jsp页面中添加一个button然后较之后就会被tomcat记录下来,然后需要将web打包后war部署到tomcat的webapp目录下面,记录的日志格式如下图所示:


如输入的中文则显示的编码后的内容:


然后在eclipse中新建一个count项目,引入hadoop的相关jar包,jedis相关jar包。用于分析日志并计算出查询查询字符串的频率。

建立包org.robby.mr包表示这个是mapreduce的相关处理逻辑。建立一个类WordCount,我们需要统计的是用户主动点击点击提交按钮之后的查询字符串,而不是Ajax发送的查询字符串。例如下面的例子:


在WordCunt类中定义Maper和Reducer的子类用于处理,日志,代码如下:下面的Reducer类定义位置错了, 应该在Map类的外面。

          

           

Reducer的输出结果会保存到HDFS的文件系统中,我们希望输出能够写到Redis的数据库中,因此这里我们新建立一个类用于reducer的输出重定向到Rdeis。该类要继承hadoop提供的OutputFormat,这里使用FileOutputFormat类,然后重写类中的方法。  

      

write的具体实现如下:

 


下面我们让WordCount继承Configured实现Tools接口,是用于发起任务时用的。


然后实现接口中的run方法:

       

在main函数中调用,用于运行任务:

            

由于我们在类中引用了第三方jar提供的类Jedis,因此当导出时,默认是不含有这些jar包的。通常的做法是:

1. 将第三方jar包放在所有的hadoop的工作节点上,即放在hadoop安装目录下的lib目录下,并且需要重启hadoop集群。

2. 将第三方jar包一起打包,这里需要使用eclipse插件Fatjar,安装完成后,在导出项目时选择other->Fat Jar Exporter,点击下一步,其中有一个选项可以选择要打包的jar。

                     

最后部署到hadoop集群中运行即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值