在DataJoin实现多数据源reduce端连接的过程中,连接在reduce阶段才会进行,因此一些无效的数据在reduce的时候才能去除掉,这样做占用了通信带宽,虽然该方法比较通用,但是效率不高。
当数据源中有数据量较小的或者经过处理后数据量较小的数据源的时候,我们考虑使用全局文件复制的方法来实现map端连接。这个过程需要Hadoop缓存系统的支持。Hadoop提供了DistributedCache类来操作缓存系统。
下面我们来说下map()端连接的思想:首先将数据量较小的数据源加载到缓存系统中,在MapReduce框架进行map之前,从缓存系统将文件全部加载到内存中,由于数据量小,因此可以实现。
对那个大的文件进行MapReduce处理,在map()方法中将有相同主键和外键记录进行连接即可。此过程不需要reducer。
当然,并不是所有的数据源都是小数据量的,但是有些情况可以转化为小数据量。比如仅仅需要查询辽宁地区的顾客订单信息,就可以先对customers文件进行过滤,得到一个中间文件,这个中间文件可能就是一个小数据量的数据源。另一个解决办法就是,假设有两个数据源S和R(相对较小),将大数据源R横向切分为多个小的数据源Ri,可以先使用全局文件复制的方法对每个Ri与S进行连接,最后将结果合并起来以、得到最终结果。
当然,数据源也不仅仅都是两个,当我们有多于2个的数据源时,我们可以两两进行连接,以得到最终结果。
代码见代码文档。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.filecache.DistributedCache;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Mapper;
import java.util.*;
import java.io.*;
public class MapJoin {
public static class MapClass extends Mapper<Object,Text,Text,Text>{
private HashMap<String , String> customers =new HashMap<String,String>();
public void setup(Context context){
BufferedReader br=null;
try{
Path paths []=DistributedCache.getLocalCacheFiles(context.getConfiguration());
if(paths !=null&&paths.length>0)
{
br = new BufferedReader(new FileReader(paths[0].toString()));
String line=null;
while((line=br.readLine())!=null){
customers.put(line.split(",",2)[0],line.split(",",2)[1]);
}
}
}catch(Exception e){e.printStackTrace();}
finally{
try{
br.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
public void map(Object key,Text value,Context context) throws IOException,InterruptedException{
String [] strs=value.toString().split(",",2);
context.write(new Text(strs[0]), new Text(customers.get(strs[0])+","+strs[1]));
}
}
public static void main(String [] args) throws Exception
{
Configuration conf = new Configuration();
Job job = new Job(conf);
FileInputFormat.addInputPath(job,new Path("hdfs://master:9000/user/xuyizhen/in/order.txt"));
FileOutputFormat.setOutputPath(job,new Path("hdfs://master:9000/user/xuyizhen/out"));
//addCacheFile的第二个参数必须是JobConf而不是Job类
DistributedCache.addCacheFile(new Path("hdfs://master:9000/user/xuyizhen/in/customer.txt").toUri(),job.getConfiguration());
job.setJarByClass(MapJoin.class);
job.setMapperClass(MapClass.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setNumReduceTasks(0);
System.exit(job.waitForCompletion(true)?0:1);
}
}
分享到:
相关推荐
2. **缓存加载**:当请求的数据不在缓存中时,从其他数据源(如数据库、网络请求)获取并添加到缓存中。 3. **缓存过期策略**:设置每个条目的生命周期,例如通过添加一个额外的元数据字段来记录插入时间,然后在...
SqlMapConfig文件是整个Ibatis框架的全局配置,包含了数据源、事务管理、环境设置等整体信息。例如,`<transactionManager>`元素定义了事务管理器类型,`<dataSource>`元素配置数据源,而`<sqlMapClient>`元素则指定...
总的来说,这个压缩包中的文件可能包含了一个关于如何在C++中使用`map`数据结构和内存映射文件的实例教程或项目,通过这些源代码,我们可以学习到如何在实际应用中有效地管理和操作这两种关键的资源。
本篇将详细探讨标题"**C++实现数据结构(源代码)**"所涵盖的知识点。 一、基本数据结构 1. 数组:C++中的数组是最基础的数据结构,它允许我们存储同类型元素的集合。数组在内存中是连续存储的,可以通过索引访问...
5. `<dataSource>`:数据源配置,定义了Ibatis如何连接数据库。 6. `<sqlMap>`:引入多个`sql-map`文件,使它们可以在应用中被引用。 7. `<plugins>`:插件配置,允许用户扩展Ibatis功能,例如拦截器。 了解并掌握...
- **多语言支持**:通过翻译文件实现多语言界面。 7. **获取帮助**: - 官方网站提供的文档和教程。 - 论坛和邮件列表。 - 第三方社区资源。 #### 三、MapServer教程 1. **时间框架**: - 教程预计耗时若干...
【标题】"map430afe25x源代码"涉及的是针对TI(Texas Instruments)MSP430AFE25X系列微控制器的C语言编程示例代码。MSP430AFE25X是TI公司推出的一款超低功耗、高性能的16位微控制器,特别适用于能源管理和测量应用。...
通过深入分析.map文件,开发者可以优化代码结构,减少不必要的内存占用,调整函数和数据的布局,甚至进行存储器的分配策略优化,比如在实验中将变量自动分配到外部SDRAM或优先使用内部SRAM。 在实际开发中,理解MDK...
10. **data**: 数据目录,存放GeoServer发布的地理空间数据源,可能包括Shapefiles、PostGIS数据库连接、Geotiff文件等。这个目录下的文件直接决定了GeoServer能够提供的地图和特征服务。 通过理解和配置这些文件,...
1. **代码封装**:`.jar`文件将相关类库打包,方便在多项目中复用,同时保护源代码不被直接访问。 2. **运行时优化**:JVM能够识别并加载`.jar`文件,提高程序启动速度和运行效率。 3. **安全**:`.jar`文件支持...
在提供的压缩包文件"Saliency"中,可能包含了实现这些步骤的源代码、数据集或结果示例。你可以通过研究这些文件来深入理解Saliency Map的生成过程,并将其应用到自己的项目中。 总结起来,Saliency Map是计算机视觉...
HDFS是一种分布式文件系统,它将大文件分割成多个块,并在多台服务器上进行存储,保证了数据的高可用性和容错性。MapReduce则是一种并行计算模型,用于处理和生成大规模数据集。在Map阶段,数据被分发到各个节点并...
- `sql-map-config-2.dtd`:iBatis 2.x的全局配置文件的DTD,用于设置数据源、事务管理器等全局配置。 - `sql-map.dtd`:iBatis早期版本的SQL映射文件的DTD。 - `ibator-config_1_0.dtd` 和 `abator-config_1_0.dtd`...
通过调用`OBJECT_ENTRY_AUTO`宏,将`ObjectMap`连接到ATL的全局对象映射中: ```cpp #include "StdAfx.h" #include "MyObject.h" DECLARE_MODULE(_Module) BEGIN_MODULE_MAP() MODULE_ENTRY_AUTO(CLSID_MyObject,...
配置文件中,你可以定义`<transactionManager>`来设置事务管理策略,`<dataSource>`来指定数据源,以及`<sqlMapClient>`或`<sqlMapConfig>`来包含多个SQL映射文件。此外,还可以设置全局的类型别名、对象工厂、数据...
在分布式事务中,这些文件可能包含跨多个数据源的操作。确保所有的SQL操作都被包裹在一个全局事务中,以保证数据的一致性。 **使用Spring的@Transactional注解** 在业务逻辑代码中,通过在方法上添加`@...
这通常涉及从源数据文件中读取,并使用`Graph.fromEdges`或`Graph.fromEdgeTuples`方法构建图。 2. **初始化并查集**: 初始化每个顶点为自己的代表,这可以通过在每个顶点上设置一个ID属性来完成。 3. **迭代更新*...