Hadoop支持的文件格式之SequenceFile

2023-11-22 02:38

本文主要是介绍Hadoop支持的文件格式之SequenceFile,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 0x00 文章内容
  • 0x01 SequenceFile格式概念
          • 1. SequenceFile是啥
  • 0x02 编码实现
          • 1. 写文件完整代码
          • 2. 读文件完整代码
          • 3. 写文件完整代码(HDFS)
          • 4. 读文件完整代码(HDFS)
  • 0x03 校验结果
          • 1. 启动集群
          • 2. 执行写SequenceFile文件格式代码
          • 3. 执行读SequenceFile文件格式代码
          • 4. 执行写SequenceFile文件格式代码(HDFS)
          • 5. 执行读SequenceFile文件格式代码(HDFS)
  • 0xFF 总结

0x00 文章内容

Hadoop支持的四种常用的文件格式:Text(csv)ParquetAvro以及SequenceFile,非常关键!

0x01 SequenceFile格式概念

1. SequenceFile是啥

二进制格式。

0x02 编码实现

1. 写文件完整代码
package com.shaonaiyi.hadoop.filetype.sequence;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.SequenceFile;
import org.apache.hadoop.io.Text;import java.io.IOException;
import java.net.URI;/*** @Author shaonaiyi@163.com* @Date 2019/12/20 11:27* @Description Hadoop支持的文件格式之写Sequence*/
public class SequenceFileWriter {private static final String[] DATA = {"shao, naiyi, bigdata, hadoop","naiyi, bigdata, spark","yi, two, a good man"};public static void main(String[] args) throws IOException {String uri = "hdfs://master:9999/user/hadoop-sny/mr/filetype/sequence.seq";Configuration configuration = new Configuration();FileSystem fs = FileSystem.get(URI.create(uri), configuration);Path path = new Path(uri);IntWritable key = new IntWritable();Text value = new Text();SequenceFile.Writer writer = null;try {writer = SequenceFile.createWriter(configuration,SequenceFile.Writer.file(path), SequenceFile.Writer.keyClass(key.getClass()),SequenceFile.Writer.valueClass(value.getClass()));for (int i = 0; i < 100; i++) {key.set(100 -i);value.set(DATA[i % DATA.length]);System.out.printf("[%s]\t%s\t%s\n", writer.getLength(), key, value);writer.append(key, value);}} finally {writer.close();}}}

代码解读:根据配置文件、文件路径、key类型、value类型此四个参数构建SequenceFile的Writer对象,然后循环append进key和value

2. 读文件完整代码
package com.shaonaiyi.hadoop.filetype.sequence;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.util.ReflectionUtils;import java.io.IOException;
import java.net.URI;
/*** @Author shaonaiyi@163.com* @Date 2019/12/20 11:28* @Description Hadoop支持的文件格式之读Sequence*/
public class SequenceFileReader {public static void main(String[] args) throws IOException {String uri = "hdfs://master:9999/user/hadoop-sny/mr/filetype/sequence.seq";Configuration configuration = new Configuration();FileSystem fs = FileSystem.get(URI.create(uri), configuration);Path path = new Path(uri);SequenceFile.Reader reader = null;try {reader = new SequenceFile.Reader(configuration, SequenceFile.Reader.file(path));Writable key = (Writable)ReflectionUtils.newInstance(reader.getKeyClass(), configuration);Writable value = (Writable)ReflectionUtils.newInstance(reader.getValueClass(), configuration);long position = reader.getPosition();while (reader.next(key, value)) {String syncSeen = reader.syncSeen() ? "*" : "";System.out.printf("[%s%s]\t%s\t%s\n", position, syncSeen, key, value);position = reader.getPosition();}} finally {reader.close();}}}
3. 写文件完整代码(HDFS)
package com.shaonaiyi.hadoop.filetype.sequence;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;
import org.apache.hadoop.mapreduce.task.JobContextImpl;
import org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl;import java.io.IOException;/*** @Author shaonaiyi@163.com* @Date 2019/12/20 12:53* @Description Hadoop支持的文件格式之写Sequence(HDFS)*/
public class MRSequenceFileWriter {public static void main(String[] args) throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException, InterruptedException {//1 构建一个job实例Configuration hadoopConf = new Configuration();Job job = Job.getInstance(hadoopConf);//2 设置job的相关属性job.setOutputKeyClass(LongWritable.class);job.setOutputValueClass(Text.class);job.setOutputFormatClass(SequenceFileOutputFormat.class);//3 设置输出路径FileOutputFormat.setOutputPath(job, new Path("hdfs://master:9999/user/hadoop-sny/mr/filetype/sequence"));//4 构建JobContextJobID jobID = new JobID("jobId", 123);JobContext jobContext = new JobContextImpl(job.getConfiguration(), jobID);//5 构建taskContextTaskAttemptID attemptId = new TaskAttemptID("attemptId", 123, TaskType.REDUCE, 0, 0);TaskAttemptContext hadoopAttemptContext = new TaskAttemptContextImpl(job.getConfiguration(), attemptId);//6 构建OutputFormat实例OutputFormat format = job.getOutputFormatClass().newInstance();//7 设置OutputCommitterOutputCommitter committer = format.getOutputCommitter(hadoopAttemptContext);committer.setupJob(jobContext);committer.setupTask(hadoopAttemptContext);//8 获取writer写数据,写完关闭writerRecordWriter<LongWritable, Text> writer = format.getRecordWriter(hadoopAttemptContext);String value = "shao";writer.write(new LongWritable(System.currentTimeMillis()), new Text(value));writer.close(hadoopAttemptContext);//9 committer提交job和taskcommitter.commitTask(hadoopAttemptContext);committer.commitJob(jobContext);}}
4. 读文件完整代码(HDFS)
package com.shaonaiyi.hadoop.filetype.sequence;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat;
import org.apache.hadoop.mapreduce.task.JobContextImpl;
import org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl;import java.io.IOException;
import java.util.List;
import java.util.function.Consumer;
/*** @Author shaonaiyi@163.com* @Date 2019/12/20 14:17* @Description Hadoop支持的文件格式之读Sequence(HDFS)*/
public class MRSequenceFileReader {public static void main(String[] args) throws IOException, IllegalAccessException, InstantiationException {//1 构建一个job实例Configuration hadoopConf = new Configuration();Job job = Job.getInstance(hadoopConf);//2 设置需要读取的文件全路径FileInputFormat.setInputPaths(job, "hdfs://master:9999/user/hadoop-sny/mr/filetype/sequence");//3 获取读取文件的格式SequenceFileInputFormat inputFormat = SequenceFileInputFormat.class.newInstance();//4 获取需要读取文件的数据块的分区信息//4.1 获取文件被分成多少数据块了JobID jobID = new JobID("jobId", 123);JobContext jobContext = new JobContextImpl(job.getConfiguration(), jobID);List<InputSplit> inputSplits = inputFormat.getSplits(jobContext);//读取每一个数据块的数据inputSplits.forEach(new Consumer<InputSplit>() {@Overridepublic void accept(InputSplit inputSplit) {TaskAttemptID attemptId = new TaskAttemptID("jobTrackerId", 123, TaskType.MAP, 0, 0);TaskAttemptContext hadoopAttemptContext = new TaskAttemptContextImpl(job.getConfiguration(), attemptId);RecordReader<LongWritable, Text> reader = null;try {reader = inputFormat.createRecordReader(inputSplit, hadoopAttemptContext);reader.initialize(inputSplit, hadoopAttemptContext);while (reader.nextKeyValue()) {System.out.println(reader.getCurrentKey());System.out.println(reader.getCurrentValue());}reader.close();} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}});}}

0x03 校验结果

1. 启动集群

a. 启动HDFS集群,
start-dfs.sh

2. 执行写SequenceFile文件格式代码

a. 直接在Win上执行,控制台会显示结果:
在这里插入图片描述
然后去集群也可以查看到结果:

hadoop fs -ls hdfs://master:9999/user/hadoop-sny/mr/filetype/
hadoop fs -cat hdfs://master:9999/user/hadoop-sny/mr/filetype/sequence.seq

在这里插入图片描述
在这里插入图片描述
b. 其实,还可以通过如下命令以Text格式查看二进制文件

hadoop fs -text hdfs://master:9999/user/hadoop-sny/mr/filetype/sequence.seq

在这里插入图片描述
注意,此处控制台打印的日志与写进文件的内容不一样,所以看到控制台其实是多打印了writer.getLength()

System.out.printf("[%s]\t%s\t%s\n", writer.getLength(), key, value);

PS:如果报权限错误:

Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="/user/hadoop-sny":hadoop-sny:supergroup:drwxr-xr-x

解决方案:需要去集群里修改权限

hadoop fs -mkdir -p hdfs://master:9999/user/hadoop-sny/mr/filetype
hadoop fs -chmod 757 hdfs://master:9999/user/hadoop-sny/mr/filetype
3. 执行读SequenceFile文件格式代码

a. 也可以得到相应的结果
在这里插入图片描述

4. 执行写SequenceFile文件格式代码(HDFS)
hadoop fs -ls hdfs://master:9999/user/hadoop-sny/mr/filetype/

在这里插入图片描述
在这里插入图片描述

5. 执行读SequenceFile文件格式代码(HDFS)

a. 可以看到代码里写进去的结果
在这里插入图片描述
对应的打印代码为:

    String value = "shao";writer.write(new LongWritable(System.currentTimeMillis()), new Text(value));

0xFF 总结

  1. Hadoop支持的文件格式系列:
    Hadoop支持的文件格式之Text
    Hadoop支持的文件格式之Avro
    Hadoop支持的文件格式之Parquet
    Hadoop支持的文件格式之SequenceFile
  2. 项目实战中,文章:网站用户行为分析项目之会话切割(二)中使用的存储格式是Parquet

作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |

福利:
邵奈一的技术博客导航
邵奈一 原创不易,如转载请标明出处。


这篇关于Hadoop支持的文件格式之SequenceFile的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/406868

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

Science Robotics 首尔国立大学研究团队推出BBEX外骨骼,实现多维力量支持!

重复性举起物体可能会对脊柱和背部肌肉造成损伤,由此引发的腰椎损伤是工业环境等工作场所中一个普遍且令人关注的问题。为了减轻这类伤害,有研究人员已经研发出在举起任务中为工人提供辅助的背部支撑装置。然而,现有的这类装置通常无法在非对称性的举重过程中提供多维度的力量支持。此外,针对整个人体脊柱的设备安全性验证也一直是一个缺失的环节。 据探索前沿科技边界,传递前沿科技成果的X-robot投稿,来自首尔国立

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

QtC++截图支持窗口获取

介绍 在截图工具中你会发现,接触到窗口后会自动圈出目标窗口,个别强大一点的还能进行元素识别可以自动圈出元素,那么今天简单分析一下QTc++如何获取窗口并圈出当前鼠标下的窗口。 介绍1.如何获取所有窗口2.比较函数3.实现窗口判断 结尾 1.如何获取所有窗口 1.我们需要调用windows接口EnumWindowsProc回调函数来获取所有顶级窗口,需要包含windows.