mapreduce 变量共享
mapreduce 全局变量共享
在编写MapReduce程序时,经常会遇到这样的问题,全局变量如何保存?如何让每个处理都能获取保存的这些全局变量?使用全局变量是不可避免的,但是 在MapRdeuce中直接使用代码级别的全局变量是不现实的。主要是因为继承Mapper基类的Map阶段类的运行和继承Reducer基类的 Reduce阶段类的运行都是独立的,并不共享一个Java虚拟机的资源,因此,下面介绍三种在MapReduce编程中相对有效的设置全局共享数据的方 法。
1,读写HDFS文件
在MapReduce框架中,Map Task和Reduce Task都运行在Hadoop集群的节点上,所以Map和Reduce Task、甚至不同的Job都可以通过读写HDFS中预定好的同一文件来实现全局共享数据。具体实现是利用Hadoop 的Java API来完成,需要注意的是,多个Map或Reduce的写操作会产生冲突,覆盖原有数据。
这种方法的优点是能够实现读写,也比较直观,但是缺点是需要共享一些很小的全局数据也需要使用IO,这将占用系统资源,增加作业完成的资源消耗。
2,配置Job属性
在MapReduce执行过程中,task可以读取Job的属性。基于这个特性,我们可以在任务启动之初利用Configuration类中的 set(String name,String value)将一些简单的全局数据封装到作业的配置属性中,然后task再利用Configuration中的get(String name)获取配置到属性中的全局数据。
这种方法的优点是简单,资源消耗小,但是对量比较大的共享数据显得比较无力。(个人推荐这种)
3,使用DistributedCache
DistributedCache是MapReduce为应用提供缓存文件的只读工具,它可以缓存文本文件,压缩文件和jar文件等。在使用时,用户可以 在作业配置中使用本地或HDFS文件的URL来将其设置成共享缓存文件。在作业启动之后和task启动之前,MapReduce框架会将可能需要的缓存文 件复制到执行任务节点的本地。
这种方法的优点是每个Job共享文件只会子啊启动之后复制一次,并且它适用与大量的共享数据,而缺点是它是只读的。
下面是一个简单的使用DistributedCache的例子。
1)将要缓存的文件复制到HDFS上
bin/hadoop fs -copyFromLocal lookup /myapp/lookup
2)启动作业的属性配置,并设置待缓存文件
Configuration conf =new Configuration(); DistributedCache.addCacheFile(newURL("/myapp/lookup #lookup"),conf);
3)在Map函数中使用DistributedCache
publicstatic class Map extendsMapper<Object, Text, Text,Text>{ privatePath[] localArchives; privatePah[] localFiles; publicvoid setup(Context context) throws IOException,InterruptedException{ //获取缓存文件 Configuration conf =new Configuration(); localArchives = DistributedCache.getLocalCacheArchives(conf); localFiles = DistributedCache.getLocalCacheFiles(conf); } publicvoid map(K key, V value, Context context)throwsIOException{ //使用缓存文件中获取的数据 ... Context.collect(k,v); } }
转载:https://www.cnblogs.com/qquan/articles/4923058.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了