大数据表转移hdfs后查询处理

原创 2017年07月17日 19:52:00

reduce端join算法实现
1、需求:
订单数据表t_order:
id date pid amount
1001 20150710 P0001 2
1002 20150710 P0001 3
1002 20150710 P0002 3

商品信息表t_product
id name category_id price
P0001 小米5 C01 2
P0002 锤子T1 C01 3

假如数据量巨大,两表的数据是以文件的形式存储在HDFS中,需要用mapreduce程序来实现一下SQL查询运算:
select a.id,a.date,b.name,b.category_id,b.price from t_order a join t_product b on a.pid = b.id

2、实现机制:
通过将关联的条件作为map输出的key,将两表满足join条件的数据并携带数据所来源的文件信息,发往同一个reduce task,在reduce中进行数据的串联

public class OrderJoin {

static class OrderJoinMapper extends Mapper<LongWritable, Text, Text, OrderJoinBean> {

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

        // 拿到一行数据,并且要分辨出这行数据所属的文件
        String line = value.toString();

        String[] fields = line.split("\t");

        // 拿到itemid
        String itemid = fields[0];

        // 获取到这一行所在的文件名(通过inpusplit)
        String name = "你拿到的文件名";

        // 根据文件名,切分出各字段(如果是a,切分出两个字段,如果是b,切分出3个字段)

        OrderJoinBean bean = new OrderJoinBean();
        bean.set(null, null, null, null, null);
        context.write(new Text(itemid), bean);

    }

}

static class OrderJoinReducer extends Reducer<Text, OrderJoinBean, OrderJoinBean, NullWritable> {

    @Override
    protected void reduce(Text key, Iterable<OrderJoinBean> beans, Context context) throws IOException, InterruptedException {

         //拿到的key是某一个itemid,比如1000
        //拿到的beans是来自于两类文件的bean
        //  {1000,amount} {1000,amount} {1000,amount}   ---   {1000,price,name}

        //将来自于b文件的bean里面的字段,跟来自于a的所有bean进行字段拼接并输出
    }
}

}

缺点:这种方式中,join的操作是在reduce阶段完成,reduce端的处理压力太大,map节点的运算负载则很低,资源利用率不高,且在reduce阶段极易产生数据倾斜

解决方案: map端join实现方式

4.4.2 map端join算法实现
1、原理阐述
适用于关联表中有小表的情形;
可以将小表分发到所有的map节点,这样,map节点就可以在本地对自己所读到的大表数据进行join并输出最终结果,可以大大提高join操作的并发度,加快处理速度
2、实现示例
–先在mapper类中预先定义好小表,进行join
–引入实际场景中的解决方案:一次加载数据库或者用distributedcache
public class TestDistributedCache {
static class TestDistributedCacheMapper extends Mapper

Hadoop数据目录迁移

Hadoop数据目录迁移@(Hadoop)随着数据的不断导入和增大,原本集群部署的目录磁盘空间不足了,所以要把hadoop存储数据的位置迁移到另外一个巨大的磁盘上,另外的一个用意是将数据和程序分离开,...
  • qq1010885678
  • qq1010885678
  • 2016-01-13 21:43:14
  • 3523

hdfs集群间数据迁移

1、同版本的集群或集群内数据迁移(直接运行以下命令几乎不会有错误出现) hadoop distcp hdfs://namenodeip:9000/user/root hdfs://namenodei...
  • weipanp
  • weipanp
  • 2015-01-14 17:49:08
  • 5248

HDFS之filestatus(查看hdfs里的数据信息)

FileTest.java 本程序列出了hdfs里的test.txt的信息 import java.io.IOException; import java.net.URI; import org...
  • qq_35488275
  • qq_35488275
  • 2017-03-14 18:22:42
  • 597

查看HDFS文件系统数据的三种方法

1、使用插件——Hadoop-Eclipse-Plugin 2、HDFS Web界面 3、shell命令
  • Flyfish111222
  • Flyfish111222
  • 2016-07-22 15:38:43
  • 23009

HDFS查看文件的前几行-后几行-行数

随机返回指定行数的样本数据 hadoop fs -cat /test/gonganbu/scene_analysis_suggestion/* | shuf -n 5 返回前几行的样本数据 ha...
  • github_38358734
  • github_38358734
  • 2018-02-06 17:06:50
  • 720

Hadoop之HDFS文件操作

摘要:Hadoop之HDFS文件操作常有两种方式,命令行方式和JavaAPI方式。本文介绍如何利用这两种方式对HDFS文件进行操作。...
  • wangloveall
  • wangloveall
  • 2014-06-05 05:52:47
  • 64349

HaDoop文件系统HDFS的浏览器查看

简介:HaDoop安装之后,我们需要查看其虚拟的文件系统目录及内容,这时就需要用到浏览器,可以使用虚拟机的内置浏览器,即火狐浏览器,也可以使用本地机器的浏览器。...
  • Haiyang_Duan
  • Haiyang_Duan
  • 2016-11-22 16:43:43
  • 9437

HDFS数据迁移解决方案之DistCp工具的巧妙使用

前言在当今每日信息量巨大的社会中,源源不断的数据需要被安全的存储.等到数据的规模越来越大的时候,也许瓶颈就来了,没有存储空间了.这时候怎么办,你也许会说,加机器解决,显然这是一个很简单直接但是又显得有...
  • Androidlushangderen
  • Androidlushangderen
  • 2016-04-05 12:14:02
  • 12268

使用HDFS和HBASE导出导入功能进行数据迁移

HDFS跨集群复制数据  hadoop distcp hdfs://ubuntu:9000/user/root hdfs://hadoop-master:9000/user/root 注意:机器名...
  • gong_xucheng
  • gong_xucheng
  • 2014-01-03 14:05:01
  • 10367

HDFS数据迁移解决方案之DistCp工具的巧妙使用分析

HDFS数据迁移解决方案之DistCp工具的巧妙使用分析 2016-04-06      0 个评论    来源:走在前往架构师的路上   收藏    我要投稿 前言 ...
  • javastart
  • javastart
  • 2016-08-03 14:48:11
  • 802
收藏助手
不良信息举报
您举报文章:大数据表转移hdfs后查询处理
举报原因:
原因补充:

(最多只允许输入30个字)