首页 文章 精选 留言 我的

精选列表

搜索[mapreduce],共3590篇文章
优秀的个人博客,低调大师

MapReduce原理及实例分析

前言 由于最近开始涉及MR程序的编写,之前会一点HIVE,对MR接触不多,不论从原理还是实际操作上,都有些障碍,终于在今天柳暗花明,将这一过程记录下,与大家分享~ 环境准备 在VM上搭建好LINUX虚拟机,并安装配置好HADOOP2.2.0,我这里是单节点的伪分布式 在eclipse中安装hadoop插件 对我们这种MR的新手而言,最好在本地有一个HADOOP运行环境,这样有许多好处: 如果我们每次写完MR程序,都打成JAR包上传至线上服务器上运行,那么每次MR运行的时间非常长,也许等待了许久,运行结果和我们预期不一致,又得改程序重新来一边,这会有一点痛苦! 在我们本地的HADOOP上运行MR程序非常快,就那么几秒,更加重要的是,我们可以再 本地准备输入文件去测试MR的逻辑,这对调试/开发程序非常方便! 实例及原理分析 假设,我们有这样的输入文件: cate-aspu-11 cate-aspu-12 cate-aspu-23 cate-aspu-24 cate-aspu-35 cate-aspu-36 cate-aspu-17 cate-aspu-48 cate-aspu-49 cate-aspu-18 ... 我们希望得到分cate,分spu的总和,并且取分cate分spu的TOP3 如上图示,大致描述了MAP/REDUCE的运行流程: 输入文件+InputFormat 提供给MAP 需要清楚提供给MAP的KEY1/VALUE1是什么?MAP准备输出的KEY2/VALUE2是什么? MAP输出后,会进行分区操作,也就是决定KEY2/VALUE2发到哪些reduce上 分区由job.setPartitionerClass决定 在同一个分区内,会对KEY2进行排序,依据是job.setSortComparatorClass, 如果没有设置则根据KEY的compareTo方法 接下来进入分组阶段,会构造KEY3和VALUE迭代器 分组的依据是job.setGroupingComparatorClass,只要比较器比较的相同就在同一组 KEY3/VALUE迭代器交给reduce方法处理 步骤: 自定义KEY KEY应该是可序列化,可比较的,只需要注意实现WritableComparable即可。 重点关注compareTo方法。 1 2 3 4 5 6 7 8 @Override public int compareTo(Cate2SpuKeythat){ System.out.println( "开始对KEY进行排序..." ); if (cate2.equals(that.getCate2())){ return spu.compareTo(that.getSpu()); } return cate2.compareTo(that.getCate2()); } 分区 分区,是KEY的第一次比较,extends Partitioner 并提供getPartition即可。 这里根据cate分区。 分组 需要注意的是,分组类必须提供构造方法,并且重载 public int compare(WritableComparable w1, WritableComparable w2) 。这里根据cate,spu分组。 通过上述的,就可以取得分cate分spu的SUM(counts)值了。 通过eclipse hadoop插件,可以方便我们上传测试文件到HDFS,可以浏览,删除HDFS文件,更加方便的是,就像运行普通JAVA程序一样的运行/调试MR程序(不在需要打成JAR包),让我们可以追踪MR的每一步,非常方便进行逻辑性测试~ 那么怎么取分cate分spu的TOP3呢? 我们只需要把上一个MR的输出文件,作为另一个MR的输入,并且以cate+counts 为KEY ,以spu为VALUE,根据cate分区,分组,排序的话:cate相同情况下,根据counts倒序; 最后在reduce阶段取TOP3即可。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Override protected void reduce(Cate2CountsKeykey,Iterable<Text>values, Reducer<Cate2CountsKey,Text,Text,Text>.Contextcontext) throws IOException,InterruptedException{ System.out.println( "reduce..." ); System.out.println( "VALUES迭代前...key:" +key.toString()); System.out.println( "VALUES迭代前...key:" +key.getCounts()); int top= 3 ; for (Textt:values){ if (top> 0 ){ System.out.println( "VALUES迭代中...key:" +key.toString()); System.out.println( "VALUES迭代中...key:" +key.getCounts()); context.write( new Text(key.getCate2()+ "\t" +t.toString()), new Text(key.getCounts() + "" )); top--; } } System.out.println( "reduceover..." ); } 那么到现在,分组取TOP就完成了。 一个疑问:reduce阶段中的KEY到底是什么? 在上面例子中的取TOP3的MR中,我们是以cate+counts为KEY,spu为VALUE。 cate作为分区,分组的依据,排序根据同一个cate下counts倒序。如下图所示: 那么reduce方法中的KEY是什么? spu1,spu4,spu3...是VALUES中的,那么这个迭代器的对应KEY是什么呢? 是cate+42吗?还是其他? 在VALUES迭代过程中,这个KEY会变化吗? 我们可以看下ECLIPSE中的控制台打印输出的内容: 从打印上来看,可以分析出如下结论: 分组后,交给reduce方法处理的KEY是同一组的所有KEY的第一个KEY,并且在VALUES迭代过程中,KEY并不会重新NEW,而是利用SETTER反射的方式重新设置属性值,这样在VALUES迭代过程中取得的KEY都是与之对应的KEY了。 本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1638361,如需转载请自行联系原作者

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

通过SDK提交MapReduce作业

大数据计算服务(MaxCompute) 快速、完全托管的TB/PB级数据仓库解决方案,向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决用户海量数据计算问题,有效降低企业成本,并保障数据安全。 了解更多 通过SDK提交MR作业的步骤如下: 步骤一: 编写MR程序,导出jar包,jar包可以不包含main方法(main方法是在本地执行) 步骤二: 上传jar包及所需的资源 (1) 通过console上传jar包到server端: add jar xxx.jar (2)也可以通过SDK写程序上传,参考相关方法:com.aliyun.odps.ODPS.resources().create(xxx,xxx) 步骤三: 对main方法进行改进 ,主要包括两部分

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

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

Rocky Linux

Rocky Linux

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

用户登录
用户注册