SequenceFile、元数据操作与MapReduce单词计数

news2024/11/9 6:23:20

文章目录

  • SequenceFile、元数据操作与MapReduce单词计数
  • 一、实验目标
  • 二、实验要求
  • 三、实验内容
  • 四、实验步骤
  • 附:系列文章

SequenceFile、元数据操作与MapReduce单词计数

一、实验目标

  1. 熟练掌握hadoop操作指令及HDFS命令行接口
  2. 掌握HDFS SequenceFile读写操作
  3. 掌握MapReduce单词计数操作
  4. 熟练掌握查询文件状态信息和目录下所有文件的元数据信息的方法

二、实验要求

  1. 给出主要实验步骤成功的效果截图。
  2. 要求分别在本地和集群测试,给出测试效果截图
  3. 对本次实验工作进行全面的总结。
  4. 完成实验内容后,实验报告文件名加上学号姓名。
  5. 涉及的文件名、类名自拟,要求体现本人学号或姓名信息,涉及的文件内容自拟。

三、实验内容

  1. SequenceFile写操作,实现效果如下图所示。
    1.1
    1.2

  2. SequenceFile读操作,实现效果如下图所示。
    2.12.2

  3. 输出一个目录下多个文件的文件状态和元数据信息。
    3.1
    3.2

  4. 使用mapreduce编程,自拟文件名和文件内容,完成对该文件的单词计数,实现效果参考下图。
    4

四、实验步骤

1.SequenceFile写操作

程序设计

package hadoop;

import java.io.*;
import java.net.URI;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.util.*;

@SuppressWarnings("unused")
public class SeqFileWrite {
    static Configuration conf = new Configuration();
    static String url = "hdfs://master:9000/seqfile.txt";
    static String[] data = {"a,b,c", "a,e,f", "a,j,k"};
    public static void main(String[] args) throws IOException{
    	FileSystem fs = FileSystem.get(URI.create(url), conf);
    	Path path = new Path(url);
    	IntWritable key = new IntWritable();
    	Text text = new Text();
    	@SuppressWarnings("deprecation")
		SequenceFile.Writer w = SequenceFile.createWriter(fs, conf, path, IntWritable.class, Text.class);
      for(int i=0; i<10; i++){
    	  key.set(10-i);
    	  text.set(data[i%data.length]);
    	  w.append(key, text);
      }
      IOUtils.closeStream(w);
    }
}

程序分析

这是一个使用Hadoop的SequenceFile编写程序,它可以将数据写入到一个SeqFile中。SeqFile是Hadoop中的一种二进制文件格式,它能够高效地储存大量的键值对数据,并支持高效地随机访问。

在程序中,首先定义了一个静态的Configuration对象和一个静态的URL字符串url,用于指定数据文件的位置。然后定义了一个包含若干数据字符串的data数组。

在main()方法中,通过调用FileSystem.get()方法获取一个文件系统对象fs,并通过指定URL字符串和Configuration对象来实现。然后定义一个Path对象指定数据文件的路径。

接下来定义一个IntWritable对象key和一个Text对象text,用于储存键和值。打开文件并创建一个SequenceFile.Writer对象w,用于向SeqFile中写入数据。

通过for循环遍历数据,将数据写入到SeqFile中,并通过IOUtils.closeStream()方法关闭写入流。

总的来说,这个程序是一个简单的SeqFile写入例子,它可以帮助初学者了解SeqFile的使用方法。

运行结果

1

2.SequenceFile读操作

程序设计

package hadoop;

import java.io.*;
import java.net.URI;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.util.*;

public class SeqFileRead {
    static Configuration conf = new Configuration();
    static String url = "hdfs://master:9000/seqfile.txt";
    public static void main(String[] args) throws IOException{
    	FileSystem fs = FileSystem.get(URI.create(url), conf);
    	Path path = new Path(url);
    	@SuppressWarnings("deprecation")
		SequenceFile.Reader r = new SequenceFile.Reader(fs, path, conf);
    	Writable keyclass = (Writable)ReflectionUtils.newInstance(r.getKeyClass(), conf);
    	Writable valueclass = (Writable)ReflectionUtils.newInstance(r.getValueClass(), conf);
    	while(r.next(keyclass, valueclass)){
    		System.out.println("key:" + keyclass);
    		System.out.println("valueL:" + valueclass);
    		System.out.println("position:" + r.getPosition());
    	}
    	IOUtils.closeStream(r);
    }
}

程序分析

这是一个使用Hadoop的SequenceFile读取程序,它可以从指定的SeqFile中读取数据并输出到控制台上。

在程序中,首先定义了一个静态的Configuration对象和一个静态的URL字符串url,用于指定数据文件的位置。

在main()方法中,通过调用FileSystem.get()方法获取一个文件系统对象fs,并通过指定URL字符串和Configuration对象来实现。然后定义一个Path对象指定数据文件的路径。

接下来打开文件并创建一个SequenceFile.Reader对象r,用于从SeqFile中读取数据。通过ReflectionUtils.newInstance()方法动态生成Writable类型的对象实例。然后在while循环中,通过r.next()方法读取下一个键值对,并输出到控制台上。

最后通过IOUtils.closeStream()方法关闭读取流。

总的来说,这个程序是一个简单的SeqFile读取例子,它可以帮助初学者了解SeqFile的读取方法和Writable对象的动态生成方法。

运行结果

2

3.读取文件元信息

程序设计

package hadoop;

import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;


public class FileStatus {
	public static void main(String[] args){
		Configuration conf = new Configuration();
		conf.set("fs.DefailtFS", "hdfs://master:9000/");
		FileSystem fs = null;
		Path path[] = new Path[args.length];
		for(int i=0; i<path.length; i++){
			path[i] = new Path(args[i]);
		}
		try{
			fs = FileSystem.get(URI.create(args[0]), conf);
			org.apache.hadoop.fs.FileStatus[] filestatus = fs.listStatus(path);
			Path listPaths[]=FileUtil.stat2Paths(filestatus);
			for(Path p:listPaths){
				System.out.println(p);
				System.out.println(p.getName());
				String ps = p.toString();
				FileSystem fs2 = FileSystem.get(URI.create(ps),conf);
				org.apache.hadoop.fs.FileStatus[] filestatus2 = fs2.listStatus(p);
				for(int i=0; i<filestatus.length;i++){
					System.out.println(filestatus[i]);
				}
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}

}

程序分析

这是一个使用Hadoop的FileStatus获取指定文件夹中的文件状态信息的程序。

在程序中,首先定义了一个Configuration对象conf,并设置default file system的URL为"hdfs://master:9000/"。然后通过FileSystem.get()方法获取一个文件系统对象fs。

在main()方法中,通过for循环依次处理传入的参数,将其转换为Path对象并存储在数组path[]中。

在try语句块中,通过fs.listStatus()方法获取指定文件夹的文件状态信息,存储在数组filestatus[]中。然后通过FileUtil.stat2Paths()方法将filestatus[]转换为Path类型的数组listPaths[]。

接下来遍历listPaths[]数组,分别输出路径和文件名,并再次调用FileSystem.get()方法获取一个新的文件系统对象fs2,用于获取指定路径下的文件状态信息。通过fs2.listStatus()方法获取指定路径下的文件状态信息,存储在数组filestatus2[]中,并将其循环输出到控制台上。

最后通过catch(IOException e)方法捕获异常并输出错误信息。

总的来说,这个程序是一个简单的使用Hadoop的FileStatus获取文件状态信息的例子,可以帮助初学者了解Hadoop中FileStatus的使用方法。

运行结果

3
4.单词计数

程序设计

Map类:

package hadoop;
import java.io.IOException;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.io.*;

public class Map extends Mapper<Object, Text, Text, IntWritable>{
	protected void map(Object key, Text value, Context context) throws IOException, InterruptedException{
		String [] lines = value.toString().split(" ");
		for(String word : lines){
			context.write(new Text(word), new IntWritable(1));
		}
	}
    
}

Reduce类:

package hadoop;
import java.io.IOException;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Reducer;

public class Reduce extends Reducer<Text, IntWritable, Text, IntWritable>{
	protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException,InterruptedException{
		int sum = 0;
		for (IntWritable count:values){
			sum = sum + count.get();
		}
		context.write(key, new IntWritable(sum));
	}

}

主函数:

package hadoop;

import org.apache.hadoop.mapreduce.lib.input.*;
import org.apache.hadoop.mapreduce.lib.output.*;
import org.apache.hadoop.mapreduce.*;

import java.io.IOException;

import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.fs.*;


public class WordMain {
    @SuppressWarnings("deprecation")
	public static void main(String[] args) throws IOException,ClassNotFoundException,InterruptedException{
    	if(args.length != 2 || args == null){
    		System.out.println("please input current Path");
    		System.exit(0);
    	}
    	Configuration conf = new Configuration();
    	Job job = new Job(conf, WordMain.class.getSimpleName());
    	job.setJarByClass(WordMain.class);
    	job.setInputFormatClass(TextInputFormat.class);
    	job.setOutputFormatClass(TextOutputFormat.class);
    	FileInputFormat.setInputPaths(job, new Path(args[0]));
    	FileOutputFormat.setOutputPath(job, new Path(args[1]));
    	job.setMapperClass(Map.class);
    	job.setReducerClass(Reduce.class);
    	job.setOutputKeyClass(Text.class);
    	job.setOutputValueClass(IntWritable.class);
    	job.waitForCompletion(true);
    }
}

运行结果

4

附:系列文章

实验文章目录直达链接
实验01Hadoop安装部署https://want595.blog.csdn.net/article/details/132767284
实验02HDFS常用shell命令https://want595.blog.csdn.net/article/details/132863345
实验03Hadoop读取文件https://want595.blog.csdn.net/article/details/132912077
实验04HDFS文件创建与写入https://want595.blog.csdn.net/article/details/133168180
实验05HDFS目录与文件的创建删除与查询操作https://want595.blog.csdn.net/article/details/133168734
实验06SequenceFile、元数据操作与MapReduce单词计数https://want595.blog.csdn.net/article/details/133926246
实验07MapReduce编程:数据过滤保存、UID 去重https://want595.blog.csdn.net/article/details/133947981
实验08MapReduce 编程:检索特定群体搜索记录和定义分片操作https://want595.blog.csdn.net/article/details/133948849
实验09MapReduce 编程:join操作和聚合操作https://want595.blog.csdn.net/article/details/133949148
实验10MapReduce编程:自定义分区和自定义计数器https://want595.blog.csdn.net/article/details/133949522

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1114294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生鲜蔬果社区团购小程序商城的作用是什么

摆在生鲜蔬果商家面前的难题也非常明显&#xff0c;商家缺少营销方式&#xff0c;难以满足基本营销需求&#xff0c;经营没有方向&#xff0c;订单难以管理&#xff0c;商品也难以管理&#xff0c;难以打通引流-转化-留存-复购-裂变-分享路径&#xff0c;线下门店整体而言经营压…

【Ubuntu】Ubuntu20.04安装EasyConnect后打不开的问题。

1 安装过程 (1) 软件下载 EasyConnect下载地址 (2) 安装 dpkg -i EasyConnect_x64_7_6_7_3.deb 如果需要卸载的话,可使用如下命令: dpkg -r EasyConnect 双击EasyConnect图标,发现出现打不开的问题。 2 解决方法 首先,先看看是什么原因打不开呢? gedit /usr/share…

基于轻量级yolov5n+CBAM开发构建全球小麦麦穗智能检测计数系统

本文是前文的延伸内容&#xff0c;前文主要是对单个麦穗上麦穗颗粒的检测计数&#xff0c;这里本文的主要目的是要对麦穗进行智能化自动化的检测计数&#xff0c;话不多说&#xff0c;简单先看下效果&#xff1a; 接下来看下数据集&#xff1a; YOLO格式标注文件如下所示&…

社区版Visual Studio通过安装开源插件Fine Code Coverage实现单元测试代码覆盖率统计

1、在Visual Studio上安装Fine Code Coverage插件 扩展->管理扩展->联机 搜索到Fine Code Coverage插件&#xff0c;选中进行下载安装 2、修改Fine Code Coverage配置 如果单元测试框架用的是MSTest&#xff0c;一般需要修改插件配置&#xff0c;否则测试结果不正确 …

【深度学习】数据集最常见的问题及其解决方案

简介 如果您还没有听过&#xff0c;请告诉您一个事实&#xff0c;作为一名数据科学家&#xff0c;您应该始终站在一个角落跟你说&#xff1a;“你的结果与你的数据一样好。” 尝试通过提高模型能力来弥补糟糕的数据是许多人会犯的错误。这相当于你因为原来的汽车使用了劣质汽…

【Maven教程】(八):使用 Nexus 创建私服 ~

Maven 使用 Nexus 创建私服 1️⃣ Nexus简介2️⃣ 安装 Nexus2.1 下载 Nexus2.2 Bundle 方式安装 Nexus2.3 WAR 方式安装 Nexus2.4 登录 Nexus 3️⃣ Nexus 的仓库与仓库组3.1 Nexus 内置的仓库3.2 Nexus 仓库分类的概念3.3 创建 Nexus 宿主仓库3.4 创建 Nexus 代理仓库3.5 创…

跳动的文化:TikTok如何塑造多元社交内容?

在数字时代&#xff0c;社交媒体已成为塑造大众文化和社会趋势的强大工具。其中&#xff0c;TikTok崭露头角&#xff0c;以其独特的短视频平台在全球范围内赢得了数以亿计的用户。 TikTok不仅仅是一个娱乐应用&#xff0c;它还是一个文化引擎&#xff0c;重新定义着社交内容和…

一百九十二、Flume——Flume数据流监控工具Ganglia单机版安装

一、目的 在安装好Flume之后&#xff0c;需要用一个工具可以对Flume数据传输进行实时监控&#xff0c;这就是Ganglia 二、Ganglia介绍 Ganglia 由 gmond、gmetad 和 gweb 三部分组成。 &#xff08;一&#xff09;第一部分——gmond gmond&#xff08;Ganglia Monitoring Da…

vue3中去除eslint严格模式

vue3中去除eslint严格模式 1、全局搜索&#xff1a;extends 2、一般在package.json或者vue.config.js中&#xff0c;直接删除掉vue/standard&#xff0c;重启项目。(在package.json文件中&#xff0c;编译不允许有注释&#xff0c;所以直接删掉)

论文阅读 - Coordinated Behavior on Social Media in 2019 UK General Election

论文链接&#xff1a; https://arxiv.org/abs/2008.08370 目录 摘要&#xff1a; Introduction Contributions Related Work Dataset Method Overview Surfacing Coordination in 2019 UK GE Analysis of Coordinated Behaviors 摘要&#xff1a; 协调的在线行为是信息…

配置 Pod 以使用 PersistentVolume 作为存储

配置 Pod 以使用 PersistentVolume 作为存储 本文将向你介绍如何配置 Pod 使用 PersistentVolumeClaim 作为存储。 以下是该过程的总结&#xff1a; 你作为集群管理员创建由物理存储支持的 PersistentVolume。你不会将该卷与任何 Pod 关联。你现在以开发人员或者集群用户的角色…

PAM从入门到精通(十六)

接前一篇文章&#xff1a;PAM从入门到精通&#xff08;十五&#xff09; 本文参考&#xff1a; 《The Linux-PAM Application Developers Guide》 PAM 的应用开发和内部实现源码分析 先再来重温一下PAM系统架构&#xff1a; 更加形象的形式&#xff1a; 六、整体流程示例 2.…

RK3568笔记三:基于ResNet18的Cifar-10分类识别训练部署

若该文为原创文章&#xff0c;转载请注明原文出处。 本篇文章参考的是野火-lubancat的rk3568教程&#xff0c;本篇记录了在正点原子的ATK-DLK3568部署。 一、介绍 ResNet18 是一种卷积神经网络&#xff0c;它有 18 层深度&#xff0c;其中包括带有权重的卷积层和全连接层。它…

Mysql架构解析,InnoDB架构概述。

MySQL架构解析 Mysql整体架构 MySQL整体架构如下图所示&#xff1a; MySQL逻辑系统架构分为4层: 应用层MySQL服务层存储引擎层系统文件层 下面将对各层的功能和组件进行介绍&#xff0c;并探讨一条语句的执行过程。 应用层 应用层是MySQL体系架构的最上层&#xff0c;它…

Docker——【部署项目的最优解】使用DockerCompose部署项目

目录 前言 1、安装docker-compose 2、为什么使用docker-compose&#xff1f; 3、如何使用DockerCompose 3.1、创建docker-compose文件 3.2、docker-compose相关命令&#xff1a; 前言 对Docker常规操作部署项目不了解的伙伴&#xff0c;可以先看看这篇文章&#xff1a;h…

多商户进驻小程序商城的作用是什么

多商户进驻商城简单来说就是在一个商城里&#xff0c;由经营者邀请同行、异业商家进驻到商城里&#xff08;子商户&#xff09;&#xff0c;可丰富商城经营业态&#xff0c;满足客户多方购物需求&#xff0c;打造购物商圈及经营者获得更多收益等。 通过【雨科】平台的多商户进驻…

Anaconda安装第三方库

一定要使用国内镜像源来进行下载&#xff0c;否则会非常慢&#xff01; 有兴趣的可以看看下面的文章^~^ 新版PyCharm安装第三方库更换国内下载镜像地址 OK!安装完成&#xff01;

Oracle数据中如何在 where in() 条件传参

一、问题场景描述 在sql 条件中&#xff0c;如何在 where in()中想传入参数&#xff0c;如果直接 where in(:seqList)&#xff0c;当传入单个值&#xff0c;seqList: ‘80’ 是没问题的&#xff0c;但是初入多个值时&#xff0c;seqList: ‘80,90’ &#xff0c;因缺少单引号&…

Windows重启开机在不登录系统情况下自启指定程序

问题前言&#xff1a; 项目开发完成后需要部署上线&#xff0c;首次肯定是手动部署跑项目&#xff0c;后期如果出现断电或其他原因导致服务器关机需要重启服务器的情况&#xff0c;这个时候再远程过去手动跑项目是很鸡肋的&#xff0c;通常会设置程序开机自启动&#xff0c;这…

eNSP-OSPF协议其他区域不与骨干区域相连解决方法3

virtual-link技术 AR1 [ar1]int g0/0/0 [ar1-GigabitEthernet0/0/0]ip add 192.168.1.1 24 [ar1-GigabitEthernet0/0/0]quit [ar1]ospf [ar1-ospf-1]area 0 [ar1-ospf-1-area-0.0.0.0]net 192.168.1.0 0.0.0.255 [ar1-ospf-1-area-0.0.0.0]quit AR2 [ar2]int g0/0/0 [ar2-Gig…