hadoop学习笔记---mapreduce的InputFormat

本文详细介绍了MapReduce中InputFormat的作用及其使用方法。包括如何通过getSplit进行输入文件分片,以及通过CreatRecordReader创建读取记录的类。此外还讨论了不同类型的InputFormat如TextInputFormat、NLineInputFormat等,并解释了它们的应用场景。

最近看了mapreduce的InputFormat总结一下!!!

看一下InputFormat的用法

Public abstract class InputFormat <k,v>{

  public abstract List<InputSplit> getSplit(JobContext context)throws IOException,InterruptedException;

  public abstract RecordReader<k,v> CreatRecordReader(InputSplit split,TaskAttemptContext context)throws IOException,InterruptedException;

}

客户端调用getSplit把输入文件分片,计算分片值,提交给JobTracker;

TaskTracker调用CreatRecordReader为这个分片返回一个读取记录的类;

看一下mapper的run方法

public void run(Context context) throws IOException, InterruptedException {
  setup(context);
  while (context.nextKeyValue()) {
    map(context.getCurrentKey(), context.getCurrentValue(), context);
  }
  cleanup(context);

}

首先是setup 初始化的一些工作,然后是while循环把split的每一个k,v送到map函数中,context中的方法其实就是调用了RecordReader中相应的方法。如果想对于分片中的记录自己定义,只需要写一个RecordReader就行。

首mapreduce的输入格式很多,最基本的是File,还有数据库等!

看一下这个图

FileInputFormat

FileInputFormat是所有处理文件输入的父类

它有一个方法 addInputPath(Job job,Path path)用于设置输入路径。

这个方法还有其他的重载版本!

mapreduce  最常处理的是文本文件!处理文本用的是TextInputFormat

TextInputFormat是InputFormat默认的处理方式,即key是每一行相对于整个文件的偏移量封装在LongWritable中,value是该行的文本内容封装在Text中。

在TextInputFormat中的value一般没什么用,而在一些文件中,文件本身的内容就是一些key value ,例如 mapreduce的输出文件,这时候我们可以用KeyValueTextInputFormat来把文件分开 默认的把Tab作为分隔符,可以用mapreduce.input.keyvaluelinerecordreader.key.value.separator来设置!

NLineInputFormat

如果你不想只把一行作为一条记录,你可以用NLineInputFormat,通过mapduce.input.lineinputformat.linespermap来设置N 这样一条记录中就会用N行!

二进制文件

SequenceFileInputFormat 可以用来处理SequenceFile

数据库

可应用JDBC

推荐使用Sqoop

转载于:https://www.cnblogs.com/bianwenlong/p/3437923.html

tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-app/apidocs/org/apache/hadoop/mapreduce/jobhistory/class-use: Cannot mkdir: No such file or directory hadoop-3.3.6/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-app/apidocs/org/apache/hadoop/mapreduce/jobhistory/class-use/JobHistoryEventHandler.MetaInfo.html tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-app/apidocs/org/apache/hadoop/mapreduce/jobhistory/class-use/JobHistoryEventHandler.MetaInfo.html: Cannot open: No such file or directory hadoop-3.3.6/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-app/apidocs/org/apache/hadoop/mapreduce/jobhistory/class-use/JobHistoryEventHandler.html tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-app/apidocs/org/apache/hadoop/mapreduce/jobhistory/class-use/JobHistoryEventHandler.html: Cannot open: No such file or directory hadoop-3.3.6/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-app/apidocs/org/apache/hadoop/mapreduce/jobhistory/class-use/JobHistoryEvent.html tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-app/apidocs/org/apache/hadoop/mapreduce/jobhistory/class-use/JobHistoryEvent.html: Cannot open: No such file or directory
09-28
<think>嗯,用户遇到了在解压Hadoop时出现的权限和路径问题。让我仔细想想用户的需求场景——用户应该是在Linux环境下尝试安装Hadoop 3.3.6,但被系统权限和目录校验拦住了。从用户引用的材料来看,用户似乎有一定Linux基础但可能对权限管理不够熟悉。 注意到引用[1]明确提到了解压命令的参数,但没提权限问题;引用[2][3]都指向Windows下的权限错误,这和用户当前环境不符;而引用[4][5]展示了环境变量配置的重要性,这可能间接相关。用户真正需要的不是这些引用内容,而是针对tar命令的具体排错方案。 用户的核心痛点有两个:Permission denied和No such file or directory。前者需要权限提升或归属权调整,后者需要路径校验。考虑到用户正在操作/opt目录,这通常需要sudo权限。我想到四个关键解决层次: 首先要确认目标目录/opt/app是否存在——如果不存在自然要创建,且必须用sudo创建 其次检查当前用户是否有opt/app的写权限,可能需要用ls -ld查看 然后解压命令本身可能需要sudo前缀,特别是当用户不属于root组时 最后解压后的文件归属权问题,用chown解决 特别要注意-C参数后的路径必须绝对存在,这点在引用[1]的示例里体现为/opt/app目录。如果用户漏掉了这个目录创建步骤,就会触发第二个错误。另外,用户引用的[4]提到环境变量,虽然不直接相关,但提示我后续需要提醒用户配置HADOOP_HOME。 用户的操作环境很可能不是root账户而是普通用户,所以sudo会成为关键。在回复时需要强调危险操作前的备份提醒,比如建议先备份安装包。考虑到Hadoop安装的连续性,还应该补充环境变量配置的建议,这样用户完成解压后就能顺利进入下一步配置。 对了,用户引用的错误案例里有Windows路径的斜杠问题,虽然当前是Linux环境,但还是要提醒用户注意tar命令里路径分隔符必须用正斜杠。最后用分层步骤+代码块呈现解决方案最清晰,每个步骤配简要说明,比如创建目录时解释-p参数防父目录缺失的功能。 </think>针对使用 `tar` 解压 Hadoop-3.3.6 时出现的 **Permission denied** 和 **No such file or directory** 问题,以下是系统性的解决方案: --- ### **问题原因与解决方法** #### 1. **No such file or directory(目录不存在)** - **原因**:`-C` 参数指定的目标目录(如 `/opt/app`)未创建。 - **解决**: ```bash # 创建目标目录(需sudo权限) sudo mkdir -p /opt/app # 验证目录是否存在 ls -ld /opt/app ``` > **说明**: > `-p` 参数确保自动创建父目录[^1]。 #### 2. **Permission denied(权限不足)** - **原因**:当前用户对 `/opt/app` 或压缩文件无操作权限。 - **解决**: ```bash # 方案1:使用sudo执行解压(推荐) sudo tar -zxvf /opt/soft/hadoop-3.3.6.tar.gz -C /opt/app # 方案2:更改目标目录所有者 sudo chown -R $USER:$USER /opt/app # 将目录归属当前用户 tar -zxvf /opt/soft/hadoop-3.3.6.tar.gz -C /opt/app # 方案3:赋予用户写权限 sudo chmod -R u+w /opt/app # 给当前用户添加写权限 ``` #### 3. **文件路径错误** - **验证压缩包路径是否正确**: ```bash ls -l /opt/soft/hadoop-3.3.6.tar.gz # 检查文件是否存在 ``` > 若路径错误,修正为实际路径(如 `/home/user/downloads/...`)。 --- ### **完整操作流程** ```bash # 1. 创建目标目录(需sudo) sudo mkdir -p /opt/app # 2. 赋予当前用户操作权限 sudo chown -R $USER:$USER /opt/app # 3. 解压文件(权限足够时可省略sudo) tar -zxvf /opt/soft/hadoop-3.3.6.tar.gz -C /opt/app # 4. 验证解压结果 ls /opt/app/hadoop-3.3.6 ``` --- ### **关键注意事项** 1. **权限层级**: - `/opt` 属系统目录,默认需 root 权限操作。 - 若需避免频繁用 `sudo`,可将目录所有权移交普通用户: ```bash sudo chown -R $USER:$USER /opt/app ``` 2. **路径规范**: - 使用绝对路径(如 `/opt/app`),避免相对路径歧义。 3. **后续配置**: - 解压后需设置环境变量(引用[4]): ```bash export HADOOP_HOME=/opt/app/hadoop-3.3.6 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin ``` --- **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值