http://guafei.iteye.com/blog/938094
这个是之前的方案,结果遇到了一些问题。现在改变方案,不打算把访问量入库(因为数据量太大,是在太慢了)。新方案:把cache服务器中的访问量放入isearch的xml。
数据源1:萝卜cache服务器的数据,格式:key(MD5,city_storeId)+访问量
数据源2:店铺主表的信息。格式:key(city_storeId),storeId。
cache服务器分析:线上共有2台cache服务器,两台分别有一个从服务,并且存的是对方的访问量数据。访问量数据是实时更新的,并且是以一个文件的形式存在,我们只要得到这个文件,对他操作就可以,处理方式1:关闭从服务,拷贝数据到isearch主服务器,开启从服务。处理方式2:直接从从服务中拷贝数据。前者的优点是:数据相对完整,但是有宕机的风险,后者刚好相反。考虑到稳定的原因,采用方案2
拷贝cache服务器的数据之后,和store主表的信息放在一块,进行mapredure操作。
附上代码:
package com.koubei.store.fullbuild;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import com.alibaba.asc.ajoin.Utilities;
import com.koubei.store.fullbuild.common.IsearchDbInputFormat;
import com.koubei.store.isearch.common.IsearchUtil;
import com.koubei.store.isearch.common.Md5;
/**
* 获取萝卜的数据,只要去跑他给我的那个c文件,但是在跑之前要先把从节点给关掉 现在的方案是:不关闭从服务,直接copy数据
*
* @author guafei.wgf
*/
public class VisitCountMapper extends BaseDbMapper implements Tool {
private static final String NAME = "VisitCountMapper";
/**
* 输入1和输入2的数据要放在同一个目录下 输入1:id,key,store_id 输入2:
* memcache,key(MD5),value(score) 第一个字段为了判断是否是从memcache过来的数据 输出1:key(MD5) id
* 针对输入1的输出 输出2: key(MD5) score 针对输入2的输出
*/
//(还有需要把MD5的jar包去掉,光放一个方法在isearch-common工程中)。
public static class InnerMapper extends
Mapper<LongWritable, Text, Text, Text> {
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
Text[] values = Utilities.textToTexts(value, line_separator);
for (Text sData : values) {
Text[] data = Utilities.textToTexts(sData, filed_separator);
if (data != null && data.length >= 3) {
String id = IsearchUtil.getString(data[0].toString());
// 对两个不同的输入加标示,如果问memcache,那么就是从输入2过来的
if ("memcache".equals(id)) {
context.write(data[1], data[2]);
} else {
String city = IsearchUtil.getString(data[6].toString());
String d_key = city + "_" + id;
// TODO 这个key还需MD5一下
d_key = new String(Md5.digest(d_key));
context.write(new Text(d_key), new Text(id));
}
}
}
}
}
/**
* 输入:mapper的输出(输出1和输出2) 输出:id score
*/
public static class InnerReducer extends
Reducer<Text, Text, NullWritable, Text> {
public void reduce(Text key, Iterable<Text> texts, Context context)
throws IOException, InterruptedException {
StringBuffer result = null;
String id = null;
String score = null;
for (Text text : texts) {
if (text.toString().length() == 32) {
id = text.toString();
} else if (IsearchUtil.isNum(text.toString())) {
score = text.toString();
}
if (id != null && score != null) {
result = new StringBuffer(id.toString() + filed_separator
+ score.toString() + line_separator);
context.write(NullWritable.get(), new Text(result
.toString()));
id = null;
score = null;
}
}
}
}
public int run(String[] args) throws Exception {
Job job = getJob(args, NAME);
if (job == null) {
return printUsage(NAME);
}
// 主要用来切割文件
job.setInputFormatClass(IsearchDbInputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setMapperClass(InnerMapper.class);
job.setReducerClass(InnerReducer.class);
job.setJarByClass(VisitCountMapper.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
return 0;
}
public static void main(String[] args) throws Exception {
int errCode = ToolRunner.run(new Configuration(),
new VisitCountMapper(), args);
System.exit(errCode);
}
}
在写shell的时候,不能随便用空格,特别是在定义变量的时候,如果用空格,它会报错syntax error near unexpected token 。
通过mapredurce跑出来的数据,现在还需经过join处理,并且要修改/store-ajoin-conf.xml配置文件,几个类文件,因为total访问量本来在isearch的xml中就是有的 。
store-ajoin-conf.xml需要改的地方是:增加一张table表(但不是真正从数据库里存在的表),select_fields里添加属性:score.total,as里添加属性visits(因为这个值Fileds.java中已经有配了)
IsearchXMLFileUDP类中的process方法把IsearchStoreVO的map赋值。
IsearchDbReader类实现对文件的分割操作。
之前在我本机跑mapredurce程序的时候,经常会出现内存溢出的问题。
IsearchDbInputFormat来对文件进行切割,buffer最大设置成了64M,其实这个buffer大小对于本机来说如果全部读入就会出现内存溢出,而我们map,redurce一些程序是,切割文件是按key相同的,读入切割,所以很少有可能key相同的内容有64M,而这次是因为我们在萝卜的那匹数据(98M)面前加入memcache前缀,所以他的那匹数据就会以64M读入,导致内存溢出。
还有萝卜的这批数据是以\0\b分割的,其实没有什么必要,这批数据可以用hadoop自带的分割符进行分割(\0\b),原因是这批数据中不可能有\n这样的字符,而我们店铺的一些信息则是会有这些信息,所以只能改代码,进行\b分割。
分享到:
相关推荐
【C#定时关机小程序详解】 C#编程语言在Windows应用程序开发中有着广泛的应用,尤其在构建用户界面和系统级任务方面。本项目是利用C#实现的一个定时关机小程序,它允许用户自定义每天不同的关机时间,并能保存设定...
总的来说,"win定时请求网址"是一个实用的Windows应用程序,为需要定期访问网络资源的用户提供了一个简单而有效的解决方案。通过自动化定时任务,用户可以释放手动操作的时间,专注于其他更重要的工作。
这表明它可能是一个跨平台的应用,可能采用了Java、Python等跨平台语言编写,或者是一个用Web技术构建的轻量级应用程序。这样的工具简化了定时任务的设定,降低了对用户的技术要求,对于那些希望快速实现定时URL请求...
小程序作为一种轻量级的应用形式,无需安装即可使用,适合在各种设备上快速访问。在“工作日志周报定时提醒小程序”中,开发者可能采用了HTML5、CSS3和JavaScript等Web技术,结合微信小程序框架进行开发。此框架提供...
这个压缩包包含了与CC2430相关的多种基础程序示例,涵盖从基本的LED控制到高级的定时器中断、看门狗定时器、外部中断、ADC(模数转换)、DMA(直接存储器访问)等多个关键领域,下面将逐一深入解析。 1. **LED控制*...
然后,我们可以创建一个ASP.NET Web Forms或MVC项目,设置一个定时任务(如Windows服务或计划任务)每隔一段时间(如每小时或每天)更新数据库中的访问量。定时任务可以读取IIS日志或者使用Google Analytics API获取...
这种小程序可能采用轻量级的设计,使得在各种设备上运行更加便捷。描述中提到的“三菱ST结构文本”是指三菱FX5U系列PLC(可编程逻辑控制器)使用的编程语言——Structured Text,这是一种基于ISO 61131-3标准的高级...
1. **小程序开发**:小程序是一种轻量级的应用形式,介于传统App和网页之间,可以在微信、支付宝等平台上运行。开发小程序需要掌握微信开发者工具,理解小程序的框架结构和组件模型,以及WXML(结构层)和WXSS(样式...
SpringBoot是基于Spring框架的轻量级开发工具,它简化了Spring应用程序的创建和配置过程,让开发者可以更快地搭建项目并投入开发。SpringBoot集成了许多常用组件,如Web、数据访问、定时任务等,使得开发更加高效。 ...
这两个存储过程分别用于生成站点访问量排名和用户访问量排名等统计信息。这些报告对于监控网络流量和用户行为非常有用。 ##### 4. 追加月日志 为了长期跟踪统计数据,旧方案还需要定期将每日的日志数据汇总并追加到...
1. **预约小程序**:小程序是一种轻量级的应用形式,用户无需下载安装即可使用,特别适合快速访问和临时需求。在会议室预约场景中,用户可以通过小程序轻松查看可用会议室、预定时间并完成预订操作,极大地提升了...
【动态定时任务】是基于Java开发的一个功能模块,主要用于实现应用程序中的定时任务处理。这个压缩包文件包含了 Dao 层、Service 层以及 Controller 层的源代码,这意味着它提供了完整的业务逻辑处理,从数据访问到...
可能使用的编程语言是C#、Python、Java或类似的系统编程语言,并可能使用了操作系统API或第三方库(如Windows的FileSystemWatcher类)来实现文件监控,以及定时任务调度器(如Windows的任务计划程序或Linux的cron)...
3. **定时任务**:为了实时更新在线人数,程序可能包含一个定时任务或计划任务,定期检查当前活动的会话,并计算在线人数。 4. **防止重复计数**:考虑到同一用户可能通过多个浏览器窗口或设备访问,程序需要有机制...
1. **微信小程序开发**:微信小程序是一种轻量级的应用形式,它不需要下载安装即可使用,基于JavaScript、WXML和WXSS进行开发。开发者需要掌握微信开发者工具的使用以及小程序的生命周期管理。 2. **红包功能实现**...
掌上客网页小程序是一种基于Web技术的轻量级应用程序,它允许用户在无需下载安装的情况下,通过浏览器访问和使用各种功能服务。这种技术的出现,极大地提升了用户体验,尤其是在移动设备上,用户可以快速便捷地享受...
微信小程序是一种轻量级的应用开发平台,它允许开发者在微信内构建无需下载安装即可使用的应用。在这个名为"微信小程序--倒数日和天气预报"的项目中,开发者结合了倒数日功能和实时天气预报,为用户提供了一种便捷的...
JobPlus项目是一个集成SpringBoot和Vue.js技术的轻量级定时任务管理系统,旨在提供一个高效、易用且可扩展的平台来管理和调度各种任务。这个系统的核心特点是将后端的强大力量与前端的交互性相结合,使得任务的创建...
"C#定时差异备份数据库"项目就是针对这个问题提供的一种解决方案。这个程序设计用于在不影响服务器性能的情况下,实现高效且定时的数据库备份策略。 首先,我们要理解什么是差异备份。在数据库备份中,全库备份是指...
"hfs.exe"可能是HFS的执行程序,用户可以通过运行这个文件启动服务器,然后其他在同一网络下的设备就可以通过浏览器访问并下载分享的文件,大大提高了工作效率,尤其是在团队协作中。 【软件卸载】 软件卸载是指从...