MapReduce---连接操作--map端连接

在项目开发中,要实现两个“表”的join操作,其中一个表数据量小,一个表很大,这种场景在实际中非常常见,比如“订单日志” join “产品信息”采用map端连接

 原理:适用于大表 + 小表(载入内存)。

map之前执行,加载文件到内存,形成map

可以大大提高join操作的并发度,加快处理速度

1、JoinMapper

package hadoop.join.map;

import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

/**
 * Mapper
 */
public class JoinMapper extends Mapper<LongWritable,Text ,Text,NullWritable>{
	private Map<String,String> customers  ;

	/**
	 * map之前执行,加载文件到内存,形成map
	 */
	protected void setup(Context context) throws IOException, InterruptedException {
		//加载customers.txt
		customers = new HashMap<String, String>();
		String path = context.getConfiguration().get("customers.path") ;
		FSDataInputStream in = FileSystem.get(context.getConfiguration()).open(new Path(path));
		BufferedReader br = new BufferedReader(new InputStreamReader(in)) ;
		String line = null ;
		while((line = br.readLine()) != null){
			String[] arr = line.split(",");
			customers.put(arr[0] , line) ;
		}
     }



2.App

package hadoop.join.map;

import com.it18zhang.hadoop.lean.key.DataLeanMapper1;
import com.it18zhang.hadoop.lean.key.DataLeanMapper2;
import com.it18zhang.hadoop.lean.key.DataLeanReducer1;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

/**
 * join:map端连接
 */
public class App {
	public static void main(String[] args) throws Exception {
		args = new String[]{"d:/java/mr/join/orders.txt", "d:/java/mr/out", "d:/java/mr/join/customers.txt" } ;
		Configuration conf = new Configuration();
		conf.set("customers.path",args[2]);

		FileSystem fs = FileSystem.get(conf);
		if(fs.exists(new Path(args[1]))){
			fs.delete(new Path(args[1]),true);
		}

		Job job = Job.getInstance(conf);

		job.setJobName("join-map");
		job.setJarByClass(App.class);

		job.setMapperClass(JoinMapper.class);

		//添加输入路径
		FileInputFormat.addInputPath(job,new Path(args[0]));
		//设置输出路径
		FileOutputFormat.setOutputPath(job,new Path(args[1]));

		//设置mapreduce输出
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(NullWritable.class);

		job.setNumReduceTasks(0);

		//第一个阶段(job)
		job.waitForCompletion(true) ;
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Hive on MapReduce的性能调优,可以采取以下几个方面的优化策略: 1. 数据倾斜处理:在数据倾斜的情况下,可以使用Hive提供的一些技术来解决,如使用倾斜连接优化(Skew Join Optimization)或者使用动态分区(Dynamic Partitioning)来解决数据倾斜问题。 2. 数据压缩:Hive支持对数据进行压缩存储,可以通过设置适当的压缩算法和参数来减少磁盘IO,提高作业执行速度。 3. 数据分区和分桶:合理使用数据分区(Partition)和分桶(Bucketing)机制,可以减少数据扫描量,提高查询效率。 4. 动态分区:对于动态增长的表,可以使用动态分区(Dynamic Partitioning)来避免全表扫描,提高查询性能。 5. 调整MapReduce参数:根据作业的特性和集群的资源情况,可以调整MapReduce相关参数,如mapreduce.tasktracker.map.tasks.maximum、mapreduce.tasktracker.reduce.tasks.maximum等来优化作业的执行效率。 6. 使用索引:Hive支持创建索引,在查询频繁的列上创建索引可以加速查询操作。 7. 数据格式选择:选择合适的数据格式,如ORC、Parquet等,这些格式在存储和查询方面有较好的性能表现。 8. 并行度调整:根据集群资源和作业特性,调整任务的并行度,如mapred.map.tasks、mapred.reduce.tasks等,以充分利用集群资源。 9. 数据倾斜检测:使用Hive提供的一些工具,如Hive Explain、Hive Profile等来检测和分析作业中的数据倾斜问题,并针对性地进行优化。 总之,通过合理使用数据倾斜处理、数据压缩、数据分区和分桶、调整MapReduce参数等优化策略,可以提高Hive on MapReduce的性能和执行效率。根据具体的业务需求和数据特点,选择合适的优化策略,并结合实际情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值