大数据Mapreduce编程——矩阵乘法

2023-11-19

编程要求

完成矩阵乘法的 Map 函数和 Reduce 函数
1、设计两个矩阵(3050,50100),在每个单元格中填入一个 0-99 的随机数,并写入
两个文件中,作为 Map 函数的输入
2、测试运行矩阵乘法的 MapReduce 框架,并将结果输出到新的结果文件中

思路

  在矩阵乘法的过程中,很容易发现可以并行运算前一矩阵的行与后一矩阵的列的乘法和加法运算,且这个过程相互独立,互不影响。因此对于矩阵乘法可以考虑利用 mapreduce 的框架进行运算,来提高工作效率。
  根据我们平时计算矩阵乘法的过程,每次都是先算乘法,再算加法,但这个过程并不适应 mapreduce 的框架。通过对得到矩阵乘法结果的全部过程分析,会发现两个矩阵中的每个元素计算的次数都是有限的、有规律的,如前一矩阵中的第一个元素只需计算后一矩阵的列数的次数。
  有了上述的发现,又由于 mapreduce 的计算特点,就可以利用 mapreduce 来计算矩阵乘法,提高效率。
  除了以上的思路,而对于矩阵的存储进行一定的设计。当矩阵的维数较小时,将矩阵存在一个文件中,是没有任何问题的。但当矩阵的维数为几十万时,且矩阵为稀疏矩阵时,可以选择(i,j,A[I,j])来存储,更为方便。

步骤

  1. 添加执行权限:在终端输入“chmod+x ./genMatrix.sh”命令添加执行权限;
  2. 生成矩阵文档:输入“./genMatrix.sh 30 50 100”命令生成一个 3050 和 50100 的两
    个矩阵文件,并将其放入到 hdfs 文件系统上。
  3. 初始化工作:在执行 Map 任务前,用 setup 方法进行相关变量或者资源的集中初始化
    工作,获取 columnM 和 rowM 的值。
  4. map 读取矩阵文件:map 先获取文件名,然后从矩阵文件中读取一行内容,格式为:
    i,j Mij。利用 split()方法将获取到的内容从“,”分割,得到一个 String 类型的数组 tuple,数
    组包含元素的信息。
       再获取元素详细内容时,先匹配该元素是来自哪个矩阵,这是因为 map 读取的内容是
    被分为切片的块,而输出的内容中要有区别两个矩阵的标识。匹配后,tuple[0]为元素所在
    的行号 i,而 tuple[1]包含列号和元素的值,因此再次用 split()从“\t”处分割,分别得到列
    号 j 和元素的值 Mij或 Njk。
       由于每个元素只需计算前一矩阵的行数或后一矩阵的列数,因此,循环 columnN 或
    rowM 次,将输出的键值对的 key 设为(I,k),value 设为(M/N,j,Mij/Njk)。
  5. MatrixReducer 获取元素,计算乘法和加法:在 reduce 中,先获取同一个 key=(I,k)下,
    Mij 和 Njk,并分别放入一维数组 M[]和 N[]中。然后对有相同下标 j(0<=j<column)的 M[j]和
    N[j]相乘累加。
  6. 编译执行:用相应的命令编译执行,最后用“hdfs dfs -cat output/*”命令将计算结果显
    示。

代码

1、全局变量

/** mapper和reducer需要的三个必要变量,由conf.get()方法得到 **/
  public static int rowM = 0;
  public static int columnM = 0;
  public static int columnN = 0;

2、Mapper方法

public static class MatrixMapper extends Mapper<LongWritable, Text, Text, Text> {

    /**
     * 执行map()函数前先由conf.get()得到main函数中提供的必要变量, 这也是MapReduce中共享变量的一种方式
     */
    public void setup(Context context) throws IOException {
      Configuration conf = context.getConfiguration();
      columnN = Integer.parseInt(conf.get("columnN"));
      rowM = Integer.parseInt(conf.get("rowM"));
    }

    public void map(LongWritable key, Text value, Context context)
        throws IOException, InterruptedException {
      /** 得到输入文件名,从而区分输入矩阵M和N **/
      FileSplit fileSplit = (FileSplit) context.getInputSplit();
      String fileName = fileSplit.getPath().getName();

      if (fileName.contains("M")) {
        //TODO:行号i,列号j,数字Mij,根据矩阵N的任意列号k,输出(i,k)->(M,j,Mij)
        //输出k次
	String[] t = value.toString().split("\t");
	for(int i=1; i<=columnN; i++){
	    mappedKey.set( t[0].substring(0, t[0]. indexOf(","))+","+k);
	    mappedValue.set("M"+ ","+ t[0].substring(t[0].indexOf(",")+1)+ "," + t[1]);
	    context.write(mappedKey,mappedValue);
	}
      }

      else if (fileName.contains("N")) {
        //TODO:行号j,列号k,数字Njk,根据矩阵M的任意行号i,输出(i,k)->(N,j,Njk)
        //
	String[] t = value.toString().split("\t");
	for(int i=1; i<=rowM; i++){
	    mappedKey.set( i+ "," +t[0].substring(0, t[0]. indexOf(",")+1));
	    mappedValue.set("N"+ ","+ t[0].substring(t[0].indexOf(","))+ "," + t[1]);
	    context.write(mappedKey,mappedValue);
	}
      }
    }
  }

3、Reducer

public static class MatrixReducer extends Reducer<Text, Text, Text, Text> {
    private int sum = 0;

    public void setup(Context context) throws IOException {
      Configuration conf = context.getConfiguration();
      columnM = Integer.parseInt(conf.get("columnM"));
    }

    public void reduce(Text key, Iterable<Text> values, Context context)
        throws IOException, InterruptedException {
      int[] M = new int[columnM + 1];
      int[] N = new int[columnM + 1];

      //TODO:获取同一个key=(i,k)下,Mij=M[j]和Njk=N[j]


      /** 根据j值,对M[j]和N[j]进行相乘累加得到乘积矩阵的数据 **/
      for (int j = 1; j < columnM + 1; j++) {
        sum += M[j] * N[j];
      }
      context.write(key, new Text(Integer.toString(sum)));
      sum = 0;
    }
  }

4、main

 public static void main(String[] args) throws Exception {

  if (args.length != 3) {
    System.err
        .println("Usage: MatrixMultiply <inputPathM> <inputPathN> <outputPath>");
    System.exit(2);
  } else {
    String[] infoTupleM = args[0].split("_");
    rowM = Integer.parseInt(infoTupleM[1]);
    columnM = Integer.parseInt(infoTupleM[2]);
    String[] infoTupleN = args[1].split("_");
    columnN = Integer.parseInt(infoTupleN[2]);
  }

  Configuration conf = new Configuration();
  /** 设置三个全局共享变量 **/
  conf.setInt("rowM", rowM);
  conf.setInt("columnM", columnM);
  conf.setInt("columnN", columnN);

  Job job = new Job(conf, "MatrixMultiply");
  job.setJarByClass(MatrixMultiply.class);
  job.setMapperClass(MatrixMapper.class);
  job.setReducerClass(MatrixReducer.class);
  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(Text.class);
  FileInputFormat.setInputPaths(job, new Path(args[0]), new Path(args[1]));
  FileOutputFormat.setOutputPath(job, new Path(args[2]));
  System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

运行截图

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大数据Mapreduce编程——矩阵乘法 的相关文章

  • 如何在java中压缩/解压tar.gz文件

    谁能告诉我在java中压缩和解压缩tar gzip文件的正确方法我一直在搜索 但我能找到的最多的是zip或gzip 单独 我写了一个包装器公共压缩 http commons apache org compress called jarchi
  • 获取jdbc中表依赖顺序

    我在 MySQL 数据库中有一组表 A B C D 依赖关系如下 B gt C gt A 和 D gt A 也就是说 A 有一个 PrimaryKey C 有一个外键指向 A 的主键 B 有一个外键指向 C 的主键 类似地 D 有一个外键指
  • Java - 从配置文件加密/解密用户名和密码

    我们正忙于为客户开发 Java Web 服务 有两种可能的选择 将加密的用户名 密码存储在Web服务客户端上 从配置中读取 文件在客户端 解密并发送 将加密的用户名 密码存储在 Web 服务器上 从配置中读取 Web 服务器上的文件 解密并
  • 如何降低圈复杂度?

    我正在开发一个将 RequestDTO 发送到 Web 服务的类 我需要在发送请求之前验证该请求 请求可以从 3 个不同的地方发送 并且每个 请求类型 有不同的验证规则 例如请求1必须有姓名和电话号码 请求2必须有地址等 我有一个 DTO
  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • 如果按下 Esc 则中断循环

    我用 JAVA 语言编写了一个程序 它使用 Scanner 类接受来自控制台的输入 现在我想将此功能添加到我的代码中 以便在用户按下 Esc 按钮时存在循环 while 到目前为止 我认为键盘类可以帮助我 但它就像扫描仪一样 我尝试使用事件
  • FFmpeg 不适用于 android 10,直接进入 onFailure(String message) 并显示空消息

    我在我的一个项目中使用 FFmpeg 进行视频压缩 在 Android 10 Google Pixel 3a 上 对于发送执行的任何命令 它会直接进入 onFailure String message 并显示空消息 所以我在我的应用程序 g
  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • JavaFx 中装饰且不可移动的舞台

    我想在 JavaFx 中创建一个装饰舞台 它也将不可移动 我正在从另一个控制器类创建这个阶段 我能够创造和展示舞台 但它是自由移动的 我怎样才能创建这个 非常感谢帮助和建议 我把打开新关卡的方法贴出来 private void addRec
  • 如何获取 Android 中临时文件的文件大小?

    如果我使用 openFileOutput 创建并写入临时文件 写入完成后如何获取文件大小 我希望这可以帮助你 File file new File selectedPath int file size Integer parseInt St
  • Java 类:匿名类、嵌套类、私有类

    有人能解释一下Java中匿名类 嵌套类和私有类之间的区别吗 我想知道与每个相关的运行时成本以及每个编译器的方法 这样我就可以掌握哪个最适合用于例如性能 编译器优化的潜力 内存使用以及其他 Java 编码人员的普遍可接受性 我所说的匿名类是指
  • 在多模块项目中访问绑定适配器

    我有一个多模块项目 其中应用程序模块包含我的绑定适配器 而我的功能模块取决于我的应用程序模块 因为它是动态功能模块 应用程序 包含绑定适配器 gt 动态功能模块 存在布局的地方 我在所有模块中启用了数据绑定和 kapt 我无法成功构建应用程
  • 为什么 RMI 注册表忽略 java.rmi.server.codebase 属性

    我正在运行 java RMI 的 Hello World 示例 1 我在空文件夹中运行注册表 motta motta laptop tmp rmiregistry 2 我启动 HTTP 服务器以在运行时检索类 下载文件夹包含客户端 服务器的
  • setKeyListener 将覆盖 setInputType 并更改键盘

    大家好 我在两个设备之间遇到问题 在实践中使用InputType和KeyListener我正在操纵一个EditText让它从数字键盘接收逗号和数字 有关更多背景信息 请检查我之前的question https stackoverflow c
  • java中wav文件转换为字节数组

    我的项目是 阿塞拜疆语音的语音识别 我必须编写一个程序来转换wav文件到字节数组 如何将音频文件转换为byte 基本上如第一个答案中的片段所描述 但不是BufferedInputStream use AudioSystem getAudio
  • Jenkins 管道和 java.nio.file.* 方法的问题

    我正在尝试使用 java nio file 中的方法在 Jenkins 管道中执行一些基本文件操作 无论代码存在于哪个节点块中 代码都在主节点上执行 在管道中 我已经验证了各个节点块都是正确的 它们唯一地标识了特定的节点 但是 pathEx
  • 设计抽象类时是否应该考虑序列化问题?

    一般来说这个问题来自Eclipse建议在抽象类上添加串行版本UID 由于该类是抽象类 因此该类的实例永远不会存在 因此它们永远不会被序列化 只有派生类才会被序列化 所以我的问题是放置一个安全 SuppressWarnings serial
  • BoneCP 和 Derby - 如何正确关闭

    I have BoneCP CONNECTION POOL CONNECTION POOL getConfig setJdbcUrl jdbc derby database shutdown true Connection connecti
  • 当我在 Java 中输入 IP 时无法连接到我的服务器

    好的 我正在尝试学习 Java 客户端 服务器的内容 并且正在浏览教程代码 如下所示 当我将 localhost 更改为我的 IP 时 它会停止工作 请帮忙 编辑 127 0 0 1 似乎也可以工作 但不是我的真实IP Copyright
  • 在多线程环境中,Collections.sort 方法有时会抛出 ConcurrentModificationException。列表没有进行结构性修改

    package CollectionsTS import java util ArrayList import java util Collections import java util HashSet import java util

随机推荐

  • Spring Boot 学习研究笔记(十八) 添加log4j2日志文件

    Spring Boot 添加log4j2日志文件 对于一个线上程序或者服务而言 重要的是要有日志输出 这样才能方便运维 而日志的输出需要有一定的规划 如日志命名 日志大小 日志分割的文件个数等 在SpringBoot的框架下 会使用log4
  • 栈头文件C语言

    Stack ADT h 栈模型头文件 数据类型定义 typedef char Name typedef struct stack node Name name struct stack node next Stack Node typede
  • GD32450i-EVAL学习笔记 6 - ADC

    目录 1 初始化ADC 1 1 使能RCU 1 2 设置频率 1 3 设置分辨率 1 4 设置数据对齐方式 1 5 使能扫描模式 1 6 设置触发模式 1 6 使能ADC 2 初始化通道规则 3 通道使能 4 软件触发使能 5 获取ADC的
  • C#List类容输出

    将集合中的类容 添加间隔符号后 输出为string List
  • vue之babel自动埋点

    公司项目是vue单页面技术 这天组长对我说 为了凸显我们的作用 做点外行或者新手看起来高深的东西 例如自动埋点 当时我的表情先是 然后摸鱼摸习惯了 就是这种状态 最后组长说领导的态度决定我们的绩效 没办法 为了money 无奈打开了老朋友
  • nacos集群部署遇到的问题总结

    问题一 内存不足 问题描述 nacos is starting with cluster Error occurred during initialization of VM Could not reserve enough space f
  • Eclipse android apk打包

    Eclipse android 开发更改apk名字 有以下几步 第一步 修改工程包名 在eclipse里 找到项目包和java包 原则上都一样 就可以按 F2 修改名字 随之 源 java也会得到相应的修改 然而每个 java文件都需要把如
  • Fortify 代码扫描安装使用教程

    前言 Fortify 能够提供静态和动态应用程序安全测试技术 以及运行时应用程序监控和保护功能 为实现高效安全监测 Fortify具有源代码安全分析 可精准定位漏洞产生的路径 以及具有1分钟1万行的扫描速度 Fortify SCA 支持丰富
  • 现在投资创客教育

    很多人会问创客要不要投资 就像吃西红柿鸡蛋面要不要用刀叉一样 你当然可以用 也可以用筷子 格物斯坦表示如果没有筷子 喜欢用手抓着吃也是可以的啊 投资人是路径的一种 不是唯一 更不是全部 投资创客教育是教育培训行业比较热门的话题 该行业未来是
  • Python基础语法学习之变量与赋值

    近几年Python飞速发展 开始学习Python的人群不在仅仅局限于编程开发者 许多其他行业的从业者也开始将Python作为自己的职业技能 本文仍然是针对零基础的初学者 继续学习Python的基础语法 变量与赋值 主要内容包括变量和赋值的概
  • el-checkbox-group限制勾选数量

  • 代理模式:静态代理和动态代理

    代理模式 代理对象增强对目标对象的功能 分类 静态代理 动态代理 jdk代理通过实现接口 cglib通过实现类实现 静态代理 JDK动态代理 CGLIB代理模式 通过回调拦截器方法实现代理对象的生成
  • 【计算机视觉】直接线性变换(DLT)求解P矩阵(2 使用SVD分解)(附MATLAB代码)

    引言 之前的帖子已经完成了一种计算直接线性变换的方法 是直接通过矩阵运算来进行的 不过随后得到的结果并不能满足精度要求 如果只是用来作为迭代优化的一个初值的话 对于精度的要求倒也不用那么高 但在查阅资料时又发现了另一种解法 是通过SVD分解
  • DataFrame对象创建

    文章目录 前言 一 创建DataFrame对象 二 使用步骤 前言 一 创建DataFrame对象 示例 将字典 年龄 23 22 21 岗位 客服 运营 公关 年购买量 10 15 8 转换成一个DataFrame对象 二 使用步骤 代码
  • 搭建主数据管理平台,解决多个系统数据不统一的问题

    如今的电子产业环境要求电子制造商必须能对产业中的各种变化做出迅速的反应 而这些变化产生了前所未有的大量数据 包括来自产品类别增加 供应中断和需求波动以及其它因素等多方面的数据 这些数据以多种格式存在于各种系统之中 虽然 企业为管理它们花费了
  • FastAPI准备之pydantic类型检查工具

    官方文档 https pydantic docs helpmanual io 这些组织都在用 Jupyter notebook FastAPI Amazon Web Services Uber Microsoft 优势 可以和IDE结合 可
  • hbase与spark笔试题(选择题)

    转自 https www cnblogs com cxzdy p 5388451 html http www bigdatastudy net show aspx id 175 cid 14 一 HBASE笔试题 HBase来源于哪篇博文
  • CVS命令深入研究 zz

    CVS命令深入研究 作者 leizhimin 日期 2006 11 2 环境 Windows server 2003 sp1简体中文版 cvsnt 2 5 03 2260 msi 目录 一 CVS命令整体结构 二 CVS帮助察看方法概述 三
  • 浅谈我所见识的数据治理项目

    开篇一张图 与正文不一定有关 图片来源于朋友圈 01 写在前面 熟悉笔者的朋友可能知道 笔者之前做的并非纯数据相关工作 产品或项目 笔者属于半路出家的数据人 之前也几乎没有直接接触过数据仓库 数据中台 数据平台等产品或项目 与数据库是一直打
  • 大数据Mapreduce编程——矩阵乘法

    编程要求 完成矩阵乘法的 Map 函数和 Reduce 函数 1 设计两个矩阵 3050 50100 在每个单元格中填入一个 0 99 的随机数 并写入 两个文件中 作为 Map 函数的输入 2 测试运行矩阵乘法的 MapReduce 框架