`
guafei
  • 浏览: 321993 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

访问量定时程序新方案

阅读更多
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分割。
分享到:
评论

相关推荐

    快打折淘客程序

    快打折淘宝客折扣系统》是一款适用于淘宝客打折单品推广的程序,无论老手或新手 ...数据量,本程序运行起来也没有任何问题。整站前端采用最新的HTM5、DIV+CSS进行架构设计,风 格清新美观,用户体验极佳。

    服务器运维方案.docx

    c)数据库备份 数据备份不同于服务器硬盘的备份,该备份需对数据库直接进行操作,应由专人定时完成,因备份占用内存较大,也不易在访问量大的情况下进行。 d)访问性能优化及数据库同步 性能优化及参数调整由开发部门...

    快打折淘宝客折扣系统(免API采集) v3.0 免费版.zip

    本程序可手动添加商品,同时也配置强大的多功能采集插件,多种采集方案,内置9.9元、19.9元包邮采集规则,可采集评论,也可自定义采集规则,全自动无人值守采集更新网站,无需人工维护。默认提供精美的页面设计模版,...

    酷睿股票私募网站管理系统 v2011.rar

    是国内首家采用WAP手机及电脑WEB同步访问的股票私募系统,该系统基于ASP DIV CSS AJAX XML MSSQL技术专门为股票私募网站开发的一款CMS网站管理系统,是一个经过完善设计并适用于各种服务器环境的易用、安全、高效、...

    Jshop小程序商城-PHP

    Jshop小程序商城,是一款开源的电商系统,包含微信小程序、支付宝小程序、APP、公众号和H5端,为大中小企业提供移动电子商务优秀的解决方案。 后台采用Thinkphp5.1框架开发,执行效率、扩展性、稳定性值得信赖。并且...

    基于AT89S52 单片的频率计

    新的方法来进行板卡设计,使你能够享受极大的自由,从而能够使你在设计的 不同阶段随意转换,按你正常的设计流量进行工作。 Protel DXP 拥有:分级线路图设计、Spice 3f5 混合电路模拟、完全支持线路 图基础上的FPGA...

    DESTOON B2B网站管理系统 v7.0 bulid0115

    DESTOON B2B网站管理系统是一套完善的B2B(电子商务)行业门户解决方案。系统基于PHP+MySQL开发,采用B/S架构,模板与程序分离,源码开放。模型化的开发思路,可扩展或删除任何功能;创新的缓存技术与数据库设计,可...

    Mysql数据库表定期备份的实现详解

    实际开发环境中,前端程序需要在给定时间段内,将数据更新/插入到MySQL指定的库表中。随着数据量的增多,基础库表基数的增长,每更新一次都会有5s左右的卡顿。 改进方案一:批量更新,累计数10条或者100条进行一次...

    淘特Asp.Net Cms(1.0)

    另一个原因是:因为使用动态JS调用,那当访问CMS的时候,自然会增加JS文件所引用的论坛页面程序访问量,增加了数据库的负担,相比而言,使用CMS的动态嵌入标签,可以将论坛中提供的动态数据使用HTTP方式读取,然后...

    酷睿股票私募网站管理系统 V2011.rar

    是国内首家采用WAP手机及电脑WEB同步访问的股票私募系统,该系统基于ASP DIV CSS AJAX XML MSSQL技术专门为股票私募网站开发的一款CMS网站管理系统,是一个经过完善设计并适用于各种服务器环境的易用、安全、高效、...

    酷睿股票私募网站管理系统 V2011

    是国内首家采用WAP手机及电脑WEB同步访问的股票私募系统,该系统基于ASP+DIV+CSS+AJAX+XML+MSSQL技术专门为股票私募网站开发的一款CMS网站管理系统,是一个经过完善设计并适用于各种服务器环境的易用、安全、高效、...

    酷睿股票私募网站管理系统V2010 SP3

    是国内首家采用WAP手机及电脑WEB同步访问的股票私募系统,该系统基于ASP+DIV+CSS+AJAX+XML+MSSQL技术专门为股票私募网站开发的一款CMS网站管理系统,是一个经过完善设计并适用于各种服务器环境的易用、安全、高效、...

    酷睿股票私募网站管理系统 V2010 SP2

    是国内首家采用WAP手机及电脑WEB同步访问的股票私募系统,该系统基于ASP+DIV+CSS+AJAX+XML+MSSQL技术专门为股票私募网站开发的一款CMS网站管理系统,是一个经过完善设计并适用于各种服务器环境的易用、安全、高效、...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...

    CLR.via.C#.(中文第3版)(自制详细书签)

    · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...

    asp.net知识库

    InternalsVisibleToAttribute,友元程序集访问属性 Essential .NET 读书笔记 [第一部分] NET FrameWork的Collections支持 .NET的反射在软件设计上的应用 关于跨程序集的反射 实现C#和VB.net之间的相互转换 深入剖析...

    某集团数据库系统维护管理措施.doc

    某集团数据库系统维护管理规范 1、目的 为了保证业务系统稳定高效运行,针对目前的应用现状,加强对... 对于用户访问量较大,数据较大的数据库,需要对tempdb数据库增加数据文件的 数目,设置为CPU数目的1/2。 4.4、数

    基于单片机的数字温度计设计.doc

    当访问外部程序和数据存储器时,P0也被作 为低8位地址/数据使用。在这种模式下,P0具有内部上拉电阻。在FLASH编程时,P0口也 用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。 P1口:...

Global site tag (gtag.js) - Google Analytics