`
臻是二哥
  • 浏览: 188205 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
Group-logo
Java技术分享
浏览量:0
社区版块
存档分类
最新评论

用DataJoin实现多数据源的Reduce端链接

 
阅读更多

DataJoin是Hadoop处理多数据源问题的一个jar包,放在HADOOP_HOME/contrib/文件夹下,使用该框架时,除了需要将jar包导入到工程中,还需要将该jar包导入到每个hadoop集群节点的HADOOP_HOME/lib/包下。
下面我们来看下DataJoin框架式如何处理多数据源的连接的。
为了完成不同数据源的链接,首先,需要为不同数据源下的每个记录定义一个数据源标签(Tag),接着,为了表示每个数据源下的不同记录并且完成连接处理,需要为每个数据记录设置一个主键(GroupKey),然后,DataJoin类库分别在Map阶段和Reduce阶段提供一个处理框架,仅仅留下一些任务有程序员完成。下面是处理过程:




从上述过程可以看到,多数据源的数据会首先被处理成多个数据记录,这些记录是带有标签Tag和主键Group Key的记录,因此使用DataJoin时,我们需要实现generateInputTag(String inputFile)方法和generateTaggedMapOutput(Object value)和generateGroupKey(TaggedMapOutput aRecord)方法,在这个过程中,出现了一个新的类(即带有标签的记录类),因此我们也要实现自定义的记录类。在combine过程中,我们会对笛卡尔积的结果进行整合(这也是为何我们把DataJoin叫做Reduce端连接),因此我们需要实现一个combine(Object[] tags,Object[] values)方法,注意这个combine和MapReduce框架中的combine是两个完全不同的东西,忌混淆。
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.contrib.utils.join.DataJoinMapperBase;
import org.apache.hadoop.contrib.utils.join.DataJoinReducerBase;
import org.apache.hadoop.contrib.utils.join.TaggedMapOutput;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;


public class DataJoin {
	public static class DataJoinMapper extends DataJoinMapperBase {
		public Text generateInputTag(String inputFiles) {
			return new Text(inputFiles);  
		}
		public Text generateGroupKey(TaggedMapOutput aRecord) {
			return new Text(((Text)aRecord.getData()).toString().split(",")[0]);
		}
		public TaggedMapOutput generateTaggedMapOutput(Object value) {
			TaggedWritable ret = new TaggedWritable((Text)value);  
			ret.setTag(this.inputTag);
			return ret;
		}
	}
	public static class TaggedWritable extends TaggedMapOutput {
		private Writable data;
		public TaggedWritable() {
			this.tag = new Text("");
			this.data = new Text("");
		}
		
		public TaggedWritable(Writable data) {
			this.tag = new Text("");
			this.data = data;
		}
		
		public void write(DataOutput out) throws IOException {
			this.tag.write(out);
			this.data.write(out);
		}

		public void readFields(DataInput in) throws IOException {
			this.data.readFields(in);
			this.tag.readFields(in);
		}

		public Writable getData() {
			return data;
		}
		public void setData(Writable data){
			this.data=data;
		}
	}
	
	public static class DataJoinReducer extends DataJoinReducerBase {

		@Override
		public TaggedMapOutput combine(Object[] tags, Object[] values) {
			if (tags.length < 2) {
				return null;
			}
			StringBuffer joinedStr = new StringBuffer("");
			for (int i = 0; i < values.length; i++) {
				TaggedWritable tw=(TaggedWritable)values[i];
				String str=((Text)tw.getData()).toString();	
				if(i==0)
					joinedStr.append(str);
				else
					joinedStr.append(str.split(",",2)[1]);
				if(i<values.length-1)
					joinedStr.append(",");
			}
			TaggedWritable ret = new TaggedWritable(new Text(joinedStr.toString()));
			ret.setTag((Text)tags[0]);
			return ret;
		}
	}
	
	public static void main(String[] args) throws Exception {
		
		    Configuration conf = new Configuration();
			JobConf job = new JobConf(conf);
			job.setJarByClass(DataJoin.class);
		
			Path in = new Path(args[0]);
			FileInputFormat.addInputPath(job, in);
			
			Path out = new Path(args[1]);
			FileOutputFormat.setOutputPath(job, out);
			
			job.setMapperClass(DataJoinMapper.class);
			job.setReducerClass(DataJoinReducer.class);
			
			job.setInputFormat(TextInputFormat.class);
			job.setOutputFormat(TextOutputFormat.class);
			
			job.setOutputKeyClass(Text.class);
			job.setOutputValueClass(TaggedWritable.class);
			//设置输出文本中key与value之间的符号,默认为制表符Tab
			job.set("mapred.textoutputformat.separator","=");
			
			JobClient.runJob(job);
		}	
}
 

  • 大小: 193.2 KB
  • 大小: 148.8 KB
0
0
分享到:
评论

相关推荐

    data-bag-merge-源码.rar

    通过`reduceByKey`、`groupByKey`或`join`等操作,可以实现数据的合并。这些操作会触发数据的分区聚合,将相同键值的数据合并到一起,形成新的RDD。 3. **源码解析**:通常,源码中会包含数据合并的算法实现。例如...

    利用Grafana的transformation功能实现统计报表.docx

    然而,时序数据库在处理多表连接(join)操作时相对复杂,这在构建统计报表时可能造成困难。为了解决这个问题,Grafana引入了transformation功能,允许用户对查询结果进行处理,生成所需的统计报表。 ...

    flink(java)笔记

    Flink架构包括DataSources(数据源)、Transformations(转换)和Sinks(数据接收器),构建了数据处理管道。 ### 2. Flink环境搭建与基本配置 首先,我们需要设置Flink环境,这通常涉及下载Flink发行版,配置环境...

    RDD编程初级实践数据集.rar

    2. "A.txt"和"B.txt":可能是用于练习联合(join)、差集(subtract)或交集(intersection)等操作的数据源。 3. "Algorithm.txt":可能包含了使用RDD实现的一些常见算法,如排序、分组、聚合等的示例。 4. ...

    Hive SQL性能优化

    1. **确定数据源**:首先确定查询的数据来源,包括表的连接类型(如LEFT JOIN、RIGHT JOIN、INNER JOIN等)。 2. **过滤数据**:根据WHERE子句中的条件对数据进行初步过滤。 3. **分组和聚合**:GROUP BY对数据进行...

    《Flink大数据分析实战》随书示例代码

    - **DataSources与DataSinks**:数据源(DataSources)是输入数据的起点,数据接收器(DataSinks)是输出结果的终点。 3. **数据转换操作**: - **Transformation**:如Map、Filter、KeyBy、Reduce、Join等,用于数据...

    fink学习资料包含课件和源码

    6. **连接与合并操作**:学习如何在数据流之间进行连接操作,如join、coGroup,以及如何处理多个数据源的合并。 7. **批处理模式**:除了流处理,Flink也支持批处理,对比与Spark、Hadoop的区别,理解Flink批处理的...

    实验3 操作手册-基于Hive的开源软件社区数据分析1

    - 使用LOAD DATA命令从HDFS或其他数据源加载数据到Hive表。 - 使用SELECT、JOIN、GROUP BY等SQL语句进行数据查询和分析。 - 可能还会涉及到分区、桶等高级特性,以优化查询性能。 通过这个实验,学习者将深入...

    2021年各大企业大数据技术面试题.pdf

    通常包括源系统、ODS(Operational Data Store)、DWH(Data Warehouse)、数据集市、主题层等,每一层都有特定的处理和优化目标。 14. **SQL优化**: 包括索引优化、JOIN优化、子查询优化、减少冗余计算等。 15...

    JSON查询语言 Jaql

    7. **连接操作**:Jaql的`join`操作允许合并两个JSON数据源,类似于SQL的JOIN,但更适用于JSON结构。 8. **分组与排序**:Jaql的`group by`和`order by`语句用于数据分组和排序,有助于数据分析。 9. **流式处理**...

    Learning Apache Flink

    1. **Flink Connectors**:连接各种数据源和接收器,如 Kafka、HDFS 和 Elasticsearch。 2. **Flink SQL Gateway**:提供一个 Web UI,允许用户通过 SQL 直接与 Flink 集群交互。 3. **Flink 与 Spark 比较**:...

    Flink编程实践指南(中文版)

    - 包括 Map、Filter、Reduce、Join 等常见的转换操作。 2. **物理分区方法**: - 分区策略决定了数据如何被分配到不同的任务上。 3. **任务链**: - 任务链可以提高任务执行效率,减少数据序列化和反序列化的开销。...

    大数据入门指南v1.0

    - **Spark SQL操作**:数据源、聚合函数和JOIN操作。 - **Spark Streaming**:实时流处理,与Flume和Kafka的集成。 4. **Storm**: - **流处理简介**:介绍Storm作为实时处理平台的角色。 - **Storm环境搭建**...

    Hive用户指南(Hive_user_guide)_中文版

    - **7.1 JOIN**:使用MapReduce实现的连接操作 - **7.2 GROUPBY**:分组聚合操作 - **7.3 DISTINCT**:去重操作 #### 八、使用HIVE注意点 - **8.1 字符集**:确保源数据和Hive中的字符集一致。 - **8.2 压缩**:...

    筛选功能

    例如,`WHERE`子句用于指定筛选条件,`JOIN`操作用于连接多个表,而`GROUP BY`和`HAVING`则用于分组和过滤。同时,索引的合理使用能显著提升查询速度。 3. **用户交互设计**: 筛选功能的用户体验也很重要。这包括...

    sjq:具有Scala语法的命令行JSON处理器

    例如,如果你有一个包含多个人员信息的JSON数组,你可以用 `sjq` 很容易地找出所有年龄大于30的人: ```bash $ cat data.json | sjq '.[] | filter(_.age &gt; 30)' ``` 或者,如果你想要提取每个人的名字和年龄,...

    Python英语单词整理.pdf

    "bind"、"listen"、"accept"、"send"、"receive"处理网络连接和数据传输,"delete"删除对象,"yield"生成器函数用于创建迭代器,"assert"进行断言检查,"evaluate"求值,"filter"、"map"和"reduce"处理序列,...

Global site tag (gtag.js) - Google Analytics