首页 文章 精选 留言 我的

精选列表

搜索[日志框架],共10000篇文章
优秀的个人博客,低调大师

《Flume日志收集与MapReduce模式》一导读

Preface 前 言 Hadoop是个非常优秀的开源工具,可以将海量的非结构化数据转换为易于管理的内容,从而更好地洞察客户需求。它很便宜(几乎是免费的),只要数据中心有空间和电源,它就能够水平扩展,并且可以处理传统数据仓库难以解决的问题。需要注意的是,你得将数据填入Hadoop集群中,否则你所得到的只不过是昂贵的热量产生器而已。你很快就会发现,一旦对Hadoop的使用经过 “试验性”阶段后,你就需要工具来自动化地将数据填充到集群中。过去,你需要自己找到该问题的解决方案,但现在则不必如此!Flume一开始是Cloudera的项目,当时它们的集成工程师需要一次又一次地为客户编写工具来实现数据的自动化导入。时至今日,Flume已经成为Apache软件基金会的项目,并且处于活跃开发状态中,很多用户已经将其用于产品环境多年。本书将会通过F

优秀的个人博客,低调大师

MapReduce实现手机上网日志分析(排序)

一、背景 1.1 流程 实现排序,分组拍上一篇通过Partitioner实现了。 实现接口,自动产生接口方法,写属性,产生getter和setter,序列化和反序列化属性,写比较方法,重写toString,为了方便复制写够着方法,不过重写够着方法map里需要不停地new,发现LongWritable有set方法,text也有,可以用,产生默认够着方法。 public void set(String account,double income,double expense,double surplus) { this.account = account; this.income = income; this.expense = expense; this.surplus = income-expense; } 1.2 数据集 为了和上一篇保在知识上持递进,数据及换了,名字没变。 下面是输出结果,其实mr也会自动排序,不过string按字典序排序了。 二、理论知识 字符串拼接,记得以前自己写过,现在拿出来看看,http://www.cnblogs.com/hxsyl/archive/2012/10/18/2729112.html 简单总结扩展如下:String是final的,不能改变也不能继承,因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。 如果for循环1w次,这句 string += "hello";的过程相当于将原有的string变量指向的对象内容取出与"hello"作字符串相加操作再存进另一个新的String对象当中,再让string变量指向新生成的对象。反编译出的字节码文件可以很清楚地看出,每次循环会new出一个StringBuilder对象,然后进行append操作,最后通过toString方法返回String对象。也就是说这个循环执行完毕new出了10000个对象,试想一下,如果这些对象没有被回收,内存浪费不说,有可能重复使用赵成系统卡死。从上面还可以看出:string+="hello"的操作事实上会自动被JVM优化成: StringBuilder str = new StringBuilder(string); str.append("hello"); str.toString(); 如果直接for循环里StringBuilder 的话会只是new一次。效率高。 而StringBuffer是线程安全的,多了synchronized关键字,也就是在多线程下会顺序读取换冲刺。 参考了这个http://blog.csdn.net/loveyaozu/article/details/47037957 三、实体类 收入相同的话按消费从低到高,否则收入从高到低。 package cn.app.hadoop.mr.sort; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.math.BigDecimal; import org.apache.hadoop.io.WritableComparable; import org.apache.jasper.tagplugins.jstl.core.Out; //Writable是序列化接口 //泛型是InfoBean,就像比较学生信息一样,成绩,性别等 ,封装在了一个bean里 //不过发现WritableComparable 有了序列化和反序列化 public class InfoBean implements WritableComparable<InfoBean>{ private String account; //金钱类都需要BigDecimal,double顺势精度,不过不知道下边序列化咋写类型,所以先用double,估计writeUTF可以 private double income; private double expense; private double surplus; public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public double getIncome() { return income; } public void setIncome(double income) { this.income = income; } public double getExpense() { return expense; } public void setExpense(double expense) { this.expense = expense; } public double getSurplus() { return surplus; } public void setSurplus(double surplus) { this.surplus = surplus; } public void readFields(DataInput in) throws IOException { // TODO Auto-generated method stub this.account = in.readUTF(); this.income = in.readDouble(); this.expense = in.readDouble(); this.surplus = in.readDouble(); } public void write(DataOutput out) throws IOException { // TODO Auto-generated method stub out.writeUTF(account); out.writeDouble(income); out.writeDouble(expense); out.writeDouble(surplus); } public void set(String account,double income,double expense) { this.account = account; this.income = income; this.expense = expense; this.surplus = income - expense; } public InfoBean() { super(); // TODO Auto-generated constructor stub } @Override public String toString() { return "InfoBean [income=" + income + ", expense=" + expense + ", surplus=" + surplus + "]"; } public int compareTo(InfoBean o) { // TODO Auto-generated method stub if(this.income == o.getIncome()) { return this.expense>o.getExpense()?1:-1; }else { return this.income>o.getIncome()?-1:1; } } } 四、第一种实现 4.1 Mapper //第一个处理文本的话一般是LongWritable 或者object //一行一行的文本是text //输出的key的手机号 定位Text //结果是DataBean 一定要实现Writable接口 public class InfoSortMapper extends Mapper<LongWritable, Text, Text, InfoBean> { private InfoBean v = new InfoBean(); private Text k = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); String[] fields = line.split("\t"); String account = fields[0]; double in = Double.parseDouble(fields[1]); double out = Double.parseDouble(fields[2]); //不用每次new 几遍不重写内存引用,也很站用资源 k.set(account); v.set(account, in, out); context.write(k, v); } 4.2 Reducer public class InfoSortReducer extends Reducer<Text, InfoBean, Text, InfoBean> { //k就是key,不需要 private InfoBean v = new InfoBean(); public void reduce(Text key, Iterable<InfoBean> value, Context context) throws IOException, InterruptedException { // process values double incomeSum = 0; double expenseSum = 0; for (InfoBean o : value) { incomeSum += o.getIncome(); expenseSum += o.getExpense(); } v.set(key.toString(), incomeSum, expenseSum); //databean会自动调用toString context.write(key,v); } } 五、第二种实现 5.1 Mapper //对 InfoBean 排序 k2就是他 public class SortMapper extends Mapper<LongWritable, Text, InfoBean, NullWritable> { private InfoBean k = new InfoBean(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); String[] fields = line.split("\t"); String account = fields[0]; double in = Double.parseDouble(fields[1]); double out = Double.parseDouble(fields[2]); //不用每次new 几遍不重写内存引用,也很站用资源 k.set(account, in, out); //value必须是NullWritable.get(),NullWritable不行,提示不是变量 context.write(k, NullWritable.get()); } } 5.2 Reducer //对 InfoBean 排序 k2就是他 public class SortMapper extends Mapper<LongWritable, Text, InfoBean, NullWritable> { private InfoBean k = new InfoBean(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); String[] fields = line.split("\t"); String account = fields[0]; double in = Double.parseDouble(fields[1]); double out = Double.parseDouble(fields[2]); //不用每次new 几遍不重写内存引用,也很站用资源 k.set(account, in, out); //value必须是NullWritable.get(),NullWritable不行,提示不是变量 context.write(k, NullWritable.get()); } } 六、结束语 如果k2 v2和k4 v4,也就是mapp的输出和reducer的输出类型不一致的话必须在Main里也设置Mapper的输出,上面的第二种就是。 job.setMapOutputKeyClass(InfoBean.class); job.setMapOutputValueClass(NullWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(InfoBean.class); 否则java里不报错,加上log4j后看到类型不匹配。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册