HADOOP之HDFS

HDFS

HDFS的组成

  1. NameNode:管理HDFS的名称空间,配置副本策略,管理数据块的映射信息,处理客户端的读写请求。
  2. DataNode:存储实际的数据块,执行数据块的读写操作。
  3. Client:客户端。文件上传时Client将文件切分成数据块然后上传,与NameNode交互获取文件位置信息,与DataNode交互读写数据,Client提供一些命令来管理HDFS例如NameNode格式化,通过一些命令来访问HDFS。
  4. Secondary NameNode:辅助NameNode定期合并Fsimage和Edits,紧急情况下辅助恢复NameNode。(不是NameNode的热备份)

热备份:备份处于联机状态,当前应用系统通过高速通信设备将实时数据传递到备份系统,保持备份系统与当前应用系统数据的同步。(实时备份)
温备份:将备份系统已安装配置成与当前使用的系统相同或者相似的系统和网络运行环境,安装了应用系统业务定期备份数据。(定期备份)
冷备份:备份系统未安装或未配置成与当前使用的系统相似或相同的运行环境,应用系统数据没有及时装入备份系统。(软件安装配置时备份)

NameNode与SecondaryNameNode

NN与2NN工作机制

  • NameNode启动:
  1. 第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存;
  2. 客户端对元数据进行增删改的请求;
  3. NameNode记录操作日志,更新滚动日志;
  4. NameNode在内存中对元数据进行增删改。
  • SecondaryNameNode工作:
  1. SecondaryNameNode 询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果;
  2. SecondaryNameNode 请求执行CheckPoint;
  3. NameNode滚动正在写的Edits日志;
  4. 将滚动前的编辑日志和镜像文件拷贝到SecondaryNameNode;
  5. 生成新的镜像文件Fsimage.ckpoint;
  6. 拷贝Fsimage.ckpoint到 NameNode;
  7. NameNode将fsimage.ckpoint到NameNode;
  8. NameNode将fsimage.ckpoint重新命名成fsimage。

Fsimage和Edits解析

  1. Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件的序列化信息。
  2. Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中。
  3. 每次NameNode启动时都会将Fsimage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成NameNode启动时就将Fsimage和Edits文件进行了合并。

CheckPoint时间设置
通常情况下,SecondaryNameNode每隔一小时执行一次
一分钟检查一次操作次数,当操作次数达到一百万时,SecondaryNameNode执行一次。

DataNode

DataNode工作机制

  1. 一个数据块在DataNode上以文件的形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和以及时间戳。
  2. DataNode启动后先向NameNode注册,之后每隔6小时向NameNode上报所有的块信息。
  3. DataNode通过心跳向NameNode报告自己还在工作,心跳是3秒一次,心跳的返回结果带有NameNode给数据节点的命令。
  4. 如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。

掉线时限参数设置

  1. 超时时长:DataNode进程死亡或者网络故障造成DataNode 与NameNode无法通信,NameNode要经过一段时间才会把该节点判定为死亡,这段时间称为超时时长。
  2. 超时时长 = 2 *dfs.namenode.heartbeat.recheck-interval + 10 *dfs.heartbeat.interval
    默认:dfs.namenode.heartbeat.recheck-interval = 5分钟
    dfs.heartbeat.interval = 3秒

文件块

  1. HDFS 中的文件在物理上是分块存储的,默认大小是128M。
  2. HDFS块大小的设置主要取决于磁盘传输速率。块太小会增加寻址时间,块太大从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。

HDFS读写流程

节点距离计算:两个节点到达最近的共同祖先的距离总和。
即:同一节点上的进程距离为0,同一机架上的不同节点为2,同一数据中心不同机架上的节点为4,不同数据中心的节点为6.

机架感知(副本存储节点选择):第一副本在Client所处的节点上,如果Client在集群外,随机选一个;第二副本在另一个机架的随机一个节点;第三副本在第二副本所在机架的随机节点。

HDFS读数据

  1. 客户端通过DistributedFileSystem 向 NameNode请求下载文件,NameNode通过查询元数据找到文件块所在的DataNode地址;
  2. 挑选一台DataNode服务器,请求读取数据;
  3. DataNode开始传输数据给客户端;
  4. 客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

HDFS写数据

  1. 客户端通过DistributedFileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已经存在,父目录是否存在;
  2. NameNode返回是否可以上传;
  3. 客户端请求第一个Block上传到哪几个DataNode服务器上;
  4. NameNode返回3个DataNode节点,分别dn1、dn2、dn3;
  5. 客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成;
  6. dn1、dn2、dn3逐级应答客户端;
  7. 客户端开始往dn1上传第一个Block,以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答;
  8. 当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。

HDFS编程

Shell编程

  1. 基本语法:hadoop fs 具体命令 或者 hdfs dfs 具体命令
  2. 命令:
  • 上传:
# 从本地剪切粘贴到HDFS
hadoop fs -moveFromLocal filePath
# 从本地文件系统中拷贝文件到HDFS
hadoop fs -copyFromLocal filePath
# 从本地文件系统中拷贝文件到HDFS
hadoop fs -put filePath
#追加一个文件到已经存在的文件末尾
hadoop fs -appendToFile filePath
  • 下载:
# 从HDFS拷贝到本地
hadoop fs -copyToLocal filePath
# 从HDFS拷贝到本地
hadoop fs -get filePath
  • HDFS直接操作
# 显示目录信息
hadoop fs -ls path
#显示文件内容
hadoop fs -cat filename
# 修改文件权限
hadoop fs -chmod/-chown/-chgrp 777 filename
# 创建路径
hadoop fs -mkdir path
# 拷贝文件
hadoop fs -cp sourcePath targetPath
# 移动文件
hadoop fs -mv sourcePath targetPath
# 显示文件末尾数据
hadoop fs -tail filePath
# 删除文件
hadoop fs -rm filePath
# 递归删除文件
hadoop fs -rm -r filePath
# 统计文件夹大小信息
hadoop fs -du -s -h filePath

API编程(一般使用Java)

  1. 使用Java集成开发环境,(笔者使用的是IntelliJ IDEA)创建maven工程

  2. 添加依赖:在pom.xml中添加以下内容

<dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.1.3</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.30</version>
        </dependency>
</dependencies>
  1. 设置日志:在resources下创建文件 log4j.properties
log4j.rootLogger=INFO, stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n 
log4j.appender.logfile=org.apache.log4j.FileAppender 
log4j.appender.logfile.File=target/spring.log 
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout 
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
  1. 创建包,新建类
  • 判断文件是否存在
@Test
    public void testExsits() throws URISyntaxException, IOException, InterruptedException {
       URI uri = new URI("hdfs://hadoop102:8020"); // HDFS运行节点的名称和端口号
       Configuration configuration = new Configuration();
       String user = "yss"; //设置自己的用户名
       //获取客户端对象
       FileSystem fs = FileSystem.get(uri,configuration,user);
       //判断文件是否存在
        if (fs.exists(new Path("/putfile"))) {
            System.out.println("putfile存在");
        }else {
            System.out.println("putfile不存在");
        }
        fs.close();
    }
  • 上传文件
@Test
    public void testput() throws URISyntaxException, IOException, InterruptedException {
        URI uri = new URI("hdfs://hadoop102:8020");
        Configuration configuration = new Configuration();
        String user = "yss";
        //获取一个客户端对象
        FileSystem fs = FileSystem.get(uri,configuration,user);
        //上传文件
        fs.copyFromLocalFile(false,false,new Path("E:\\putfile\\mapred_input.txt"),new Path("\\"));
        //关闭客户端
        fs.close();
  • 下载文件
@Test
    public void testGet() throws URISyntaxException, IOException, InterruptedException {
        URI uri = new URI("hdfs://hadoop102:8020");
        Configuration configuration = new Configuration();
        String user = "yss";
        FileSystem fs = FileSystem.get(uri,configuration,user);
        fs.copyToLocalFile(false,new Path("/hadoop_hdfs"),new Path("E:\\putfile"),false);
        fs.close();
    }
  • 读取文件内容
@Test
    public void testResd() throws URISyntaxException, IOException, InterruptedException {
        URI uri = new URI("hdfs://hadoop102:8020");
        Configuration configuration = new Configuration();
        String user = "yss";
        FileSystem fs = FileSystem.get(uri,configuration,user);
        
        FSDataInputStream dataInputStream = fs.open(new Path("/putfile/putfile.txt"));
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(dataInputStream));
        String line = null;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }

        bufferedReader.close();
        dataInputStream.close();
        fs.close();
    }
  • 写文件
@Test
    public void testWrite() throws URISyntaxException, IOException, InterruptedException {

        URI uri = new URI("hdfs://hadoop102:8020");
        Configuration configuration = new Configuration();
        String user = "yss";
        FileSystem fs = FileSystem.get(uri,configuration,user);

        byte[] buff = "这里是文件内容".getBytes(StandardCharsets.UTF_8);
        FSDataOutputStream fsDataOutputStream = fs.create(new Path("/text.txt"));
        fsDataOutputStream.write(buff,0,buff.length);

        fsDataOutputStream.close();
        fs.close();
    }
  • 显示文件的详细内容
@Test
    public void testFiledetails() throws URISyntaxException, IOException, InterruptedException {
        URI uri = new URI("hdfs://hadoop102:8020");
        Configuration configuration = new Configuration();
        String user = "yss";
        FileSystem fs = FileSystem.get(uri,configuration,user);

        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/putfile"), true);
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            System.out.println("文件名字:"+fileStatus.getPath().getName());
            System.out.println("读写权限:"+fileStatus.getPermission());
            System.out.println("大小:"+fileStatus.getBlockSize());
            System.out.println("创建时间:"+fileStatus.getAccessTime());
            System.out.println("路径:"+fileStatus.getPath());
        }
        fs.close();
    }

可以在网页查看HDFS目录

在这里插入图片描述

hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.3.3.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.3.3.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Null.java tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Null.java: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_2.8.3.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_2.8.3.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.3.5.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.3.5.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_2.8.0.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_2.8.0.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.0.3.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.0.3.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/hadoop-hdfs_0.22.0.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/hadoop-hdfs_0.22.0.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_2.9.1.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_2.9.1.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.1.1.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.1.1.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/hadoop-hdfs_0.20.0.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/hadoop-hdfs_0.20.0.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.0.0-alpha4.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.0.0-alpha4.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.2.0.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.2.0.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_2.9.2.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_2.9.2.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.0.0-alpha2.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.0.0-alpha2.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.0.2.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.0.2.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_2.10.0.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_2.10.0.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.1.0.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.1.0.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.0.1.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.0.1.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.2.1.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.2.1.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.2.4.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.2.4.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/hadoop-hdfs_0.21.0.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/hadoop-hdfs_0.21.0.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.1.3.xml tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/jdiff/Apache_Hadoop_HDFS_3.1.3.xml: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/hadoop-hdfs-client-3.3.6-tests.jar tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/hadoop-hdfs-client-3.3.6-tests.jar: Cannot open: No such file or directory hadoop-3.3.6/share/hadoop/hdfs/hadoop-hdfs-httpfs-3.3.6.jar tar: hadoop-3.3.6: Cannot mkdir: Permission denied tar: hadoop-3.3.6/share/hadoop/hdfs/hadoop-hdfs-httpfs-3.3.6.jar: Cannot open: No such file or directory tar: Exiting with failure status due to previous errors jtx@ubuntu:~$
最新发布
09-28
<think>我们当前需要解决的是在解压hadoop-3.3.6时出现的两个问题: 1. Cannot mkdir: Permission denied (创建目录权限被拒绝) 2. Cannot open: No such file or directory (无法打开:没有这样的文件或目录) 根据引用中提供的信息,我们可以总结出以下可能的原因和解决方案: 对于第一个问题:Cannot mkdir: Permission denied - 原因:当前用户对目标目录没有写权限。 - 解决方案: a) 使用管理员权限(sudo)执行解压命令(如果解压到系统目录如/usr/local,通常需要sudo)。 b) 更改目标目录的所有权,使得当前用户有权限写入(如引用[1]中提到的`chown`命令)。 c) 或者将hadoop解压到当前用户有权限的目录,例如用户主目录下的某个目录。 对于第二个问题:Cannot open: No such file or directory - 原因:可能是解压命令中指定的文件路径不正确,或者文件确实不存在(可能是下载不完整或路径错误)。 - 解决方案: a) 检查文件路径是否正确,确保解压命令中指定的压缩包文件存在。 b) 检查当前目录下是否存在该压缩包,可以使用`ls`命令查看。 c) 如果文件不存在,重新下载hadoop-3.3.6压缩包。 此外,根据引用[3]和引用[4]的信息,我们还需要注意在后续配置Hadoop环境时,确保环境变量设置正确,并且使用正确的用户权限来执行Hadoop相关命令。 具体步骤建议如下: 1. 确保下载的hadoop-3.3.6压缩包完整存在,并且存放的目录当前用户有读取权限。 2. 选择一个合适的解压目录: - 如果希望解压到系统目录(如`/usr/local`),则需要使用sudo权限,命令如下: ```bash sudo tar -xzvf hadoop-3.3.6.tar.gz -C /usr/local ``` - 如果使用当前用户主目录下的目录,例如`~/apps`,则不需要sudo: ```bash tar -xzvf hadoop-3.3.6.tar.gz -C ~/apps ``` 3. 如果解压过程中出现权限问题,可以尝试先更改目标目录的所有权(如果目标目录已经存在且属于其他用户): ```bash sudo chown -R $USER:$USER /usr/local/hadoop # 如果之前已经创建了hadoop目录且权限不对 ``` 或者,在解压后更改整个解压目录的所有权(如果使用sudo解压,那么解压出来的文件属于root,需要更改所有权以便普通用户使用): ```bash sudo chown -R hadoop:hadoop /usr/local/hadoop-3.3.6 # 假设你有一个hadoop用户和组,或者使用你自己的用户名和组 ``` 注意:这里的用户和组应该替换成你自己的。 4. 对于文件不存在的错误,请检查当前目录下是否有`hadoop-3.3.6.tar.gz`文件,或者检查你输入的文件名是否正确(注意大小写和版本号)。 5. 解压完成后,按照引用[3]中的示例配置环境变量(注意路径要根据实际解压目录调整): 修改`~/.bashrc`或`~/.bash_profile`,添加类似以下内容(具体路径根据实际情况): ```bash export JAVA_HOME=/path/to/your/jdk export HADOOP_HOME=/usr/local/hadoop-3.3.6 # 或者你解压到的目录 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin ``` 然后执行`source ~/.bashrc`使环境变量生效。 6. 后续在运行Hadoop时,如果出现权限问题(如引用[2]和引用[4]),可能需要使用HDFS的命令来设置目录权限,例如: ```bash hdfs dfs -chmod 777 / # 不推荐,这里只是示例,实际生产环境需要严格控制权限 ``` 或者使用正确的用户来执行命令(如hdfs用户)。 注意:在Linux系统中,操作权限是非常重要的,尤其是在多用户环境下。请根据实际需求和安全策略来分配合适的权限。 综上所述,我们按照步骤来解决解压时的问题。 请用户按照上述步骤尝试解决问题。 </think>针对解压 Hadoop 3.3.6 时出现的权限不足和文件不存在问题,结合引用内容提供以下解决方案: ### 📂 一、解决权限问题(Cannot mkdir: Permission denied) 1. **更改解压目录所有权** 使用管理员权限将目标目录所有权赋予当前用户(替换 `your_user` 为实际用户名): ```bash sudo chown -R your_user:your_user /usr/local/hadoop ``` 如引用[1]的操作: ```bash chown -R hadoop:hadoop hadoop-0.20.2/ ``` 2. **使用 sudo 解压** 若需解压到系统目录(如 `/usr/local`),需提升权限: ```bash sudo tar -xzvf hadoop-3.3.6.tar.gz -C /usr/local ``` 3. **修改目录权限** 解压后赋予目录读写权限(参考引用[2]): ```bash sudo chmod 777 /usr/local/hadoop # 临时方案,生产环境需严格权限控制 ``` ### 🔍 二、解决文件不存在问题(Cannot open: No such file or directory) 1. **检查文件路径** 确认压缩包存在且路径正确: ```bash ls -l hadoop-3.3.6.tar.gz ``` 2. **完整下载压缩包** 重新下载并校验哈希值(官网提供 SHA-256): ```bash wget https://archive.apache.org/dist/hadoop/core/hadoop-3.3.6/hadoop-3.3.6.tar.gz sha256sum hadoop-3.3.6.tar.gz ``` 3. **修复环境变量配置** 如引用[3]所示,确保 `$HADOOP_HOME` 等变量正确定义: ```bash export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin source ~/.bashrc # 立即生效 ``` ### ⚙️ 三、后续配置建议 1. **HDFS 权限修复** 若启动后出现 `Permission denied`(参考引用[4]): ```bash hdfs dfs -chmod 777 / # 临时开放根目录权限 hadoop fs -mkdir /user # 创建用户目录 ``` 2. **日志目录处理** 手动创建缺失目录并赋权(引用[1][3]): ```bash mkdir -p /usr/local/hadoop/logs chown -R hadoop:hadoop /usr/local/hadoop/logs ``` 3. **用户切换** 始终使用专属 Hadoop 用户操作(避免 root 权限问题): ```bash su - hadoop # 切换到hadoop用户 ``` ### 💡 根本原因总结 | 问题类型 | 主要原因 | 解决方案 | |----------|----------|----------| | **权限拒绝** | 用户对目录无写权限 | `chown`/`chmod` 赋权或使用 `sudo` | | **文件不存在** | 压缩包路径错误/下载不完整 | 检查路径/重新下载校验 | | **后续报错** | 环境变量缺失或权限配置错误 | 完善环境变量/HDFS显式赋权 | > ✨ **关键提示**:解压后需完整配置 `hadoop-env.sh` 中的 `JAVA_HOME` 和 `HADOOP_LOG_DIR`(参考引用[3]),否则启动时仍可能报错。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值