大数据之 Hadoop-5-HDFS

一、HDFS 简介 HDFS(Hadoop Distributed File System)是Hadoop 项目的核心子项目,在大数据开发中通过分布式计算对海量数据进行存储与管理。
HDFS 是一个典型的主/从架构的分布式系统。一个HDFS 集群由一个元数据节点(NameNode)和一些数据节点(DataNode)组成。
举个例子,我们可以把NameNode 想象成一个仓库管理员,管理仓库中的商品;DataNode 想象成是一个仓库,用于存储商品,而商品就是我们所说的数据。
HDFS 命令行操作 命令行接口如下:

$ bin/hadoop fs -命令 文件 路径

或者
$ bin/hdfs dfs -命令 文件路径

ls
使用ls命令可以查看HDFS系统中的目录和文件。
$ hadoop fs -ls /

操作演示:
[root@centos01 ~]# hadoop fs -ls / Found 2 items drwxr-xr-x- hadoop supergroup0 2021-07-10 08:58 /input drwx------- hadoop supergroup0 2021-07-10 08:38 /tmp

递归列出HDFS 文件系统根目录下的所有目录和文件:
[root@centos01 ~]# hadoop fs -ls -R / drwxr-xr-x- hadoop supergroup0 2021-07-10 08:58 /input -rw-r--r--2 hadoop supergroup83 2021-07-10 08:58 /input/wc.txt drwx------- hadoop supergroup0 2021-07-10 08:38 /tmp drwx------- hadoop supergroup0 2021-07-10 08:38 /tmp/hadoop-yarn drwx------- hadoop supergroup0 2021-07-10 08:38 /tmp/hadoop-yarn/staging drwx------- hadoop supergroup0 2021-07-10 08:38 /tmp/hadoop-yarn/staging/hadoop drwx------- hadoop supergroup0 2021-07-10 08:49 /tmp/hadoop-yarn/staging/hadoop/.staging

put
使用put 命令可以将本地文件上传到HDFS系统中。如将本地文件a.txt 上传到 HDFS 文件系统根目录 input 文件夹中,命令如下:
$ hadoop fs -put a.txt /input/

get
使用get命令可以将 HDFS 文件系统中的文件下载到本地,注意下载时不能与本地文件名相同,否则会提示文件已存在。
$ hadoop fs -get /input/a.txt a.txt

将文件夹下载到本地:
$ hadoop fs -get /input/ ./

常用命令
列出 hdfs 下的文件 $ hadoop dfs -ls 列出 hdfs / 路径下的所有文件,文件夹 $ hadoop dfs -ls -R / 创建目录 /input $ hadoop dfs -mkdir /input 列出 hsfs 名为 input 的文件夹中的文件 $ hadoop dfs -ls input 将 test.txt 上传到 hdfs 中 $ hadoop fs -put /home/binguner/Desktop/test.txt /input 将 hsdf 中的 test.txt 文件保存到本地桌面文件夹 $ hadoop dfs -get /input/test.txt /home/binguenr/Desktop 删除 hdfs 上的 test.txt 文件 $ hadoop dfs -rmr /input/test.txt 查看 hdfs 下 input 文件夹中的内容 $ hadoop fs -cat input/* 进入安全模式 $ hadoop dfsadmin –safemode enter 退出安全模式 $ hadoop dfsadmin -safemode leave 报告 hdfs 的基本统计情况 $ hadoop dfsadmin -report

二、Java API操作 1、创建
pom.xml 文件中引入Hadoop的Java API 依赖包:
org.apache.hadoop hadoop-client 2.8.2

新建 com/homay/hadoopstudy/FileSystemCat.java
package com.homay.hadoopstudy; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import sun.nio.ch.IOUtil; import java.io.InputStream; /** * @author: kaiyi * @Date 2021/7/12 0:25 */ public class FileSystemCat {public static void main(String[] args) throws Exception{Configuration conf = new Configuration(); conf.set("fs.defalut.name", "hdfs://192.168.222.10:9000"); FileSystem fs = FileSystem.get(conf); // 打开文件输入流 InputStream in = fs.open(new Path("hdfs:/input/wc.txt")); IOUtils.copyBytes(in, System.out, 4096, false); // 关闭输入流 IOUtils.closeStream(in); } }

查看Hadoop 文件:
[hadoop@centos01 sbin]$ hadoop dfs -ls -R / WARNING: Use of this script to execute dfs is deprecated. WARNING: Attempting to execute replacement "hdfs dfs" instead.drwxr-xr-x- hadoop supergroup0 2021-07-10 08:58 /input -rw-r--r--2 hadoop supergroup83 2021-07-10 08:58 /input/wc.txt drwx------- hadoop supergroup0 2021-07-10 08:38 /tmp drwx------- hadoop supergroup0 2021-07-10 08:38 /tmp/hadoop-yarn drwx------- hadoop supergroup0 2021-07-10 08:38 /tmp/hadoop-yarn/staging drwx------- hadoop supergroup0 2021-07-10 08:38 /tmp/hadoop-yarn/staging/hadoo drwx------- hadoop supergroup0 2021-07-10 08:49 /tmp/hadoop-yarn/staging/hadoo [hadoop@centos01 sbin]$ hadoop -v

运行
运行该文件,报这样的错误:
java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset
本地远程连接 Hadoop 集群异常,日志如下:
22:27:56.703 [main] DEBUG org.apache.hadoop.util.Shell - Failed to detect a valid hadoop home directory java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset. at org.apache.hadoop.util.Shell.checkHadoopHomeInner(Shell.java:448) at org.apache.hadoop.util.Shell.checkHadoopHome(Shell.java:419) at org.apache.hadoop.util.Shell.(Shell.java:496)

日志描述内容很清楚,没有设置 HADOOP_HOME 和 hadoop.home.dir 两项。这两项主要是干嘛的呢?是配置在本地环境变量中的 Hadoop 地址,那么需要下载Windows版本的Hadoop来设置么?如果是远程连接Linux上的Hadoop集群,则完全不需要再下载安装Windows版本的Hadoop!!!
本地远程连接Hadoop系统时需要在本地配置相关的Hadoop变量,主要包括hadoop.dll 与 winutils.exe 等。
winutils:由于hadoop主要基于linux编写,winutil.exe主要用于模拟linux下的目录环境。当Hadoop在windows下运行或调用远程Hadoop集群的时候,需要该辅助程序才能运行。winutils是Windows中的二进制文件,适用于不同版本的Hadoop系统并构建在Windows VM上,该VM用以在Windows系统中测试Hadoop相关的应用程序。
解决方法 了解到原因之后,可以根据安装Hadoop集群的版本,下载相应的winutils。
下载地址:https://github.com/stevelough...
注:若无相同的版本,可选择就近的版本下载使用。如集群中使用的版本是2.8.5,可以下载使用2.8.3的版本文件。
将环境变量%HADOOP_HOME%设置为指向包含WINUTILS.EXEBIN目录上方的目录。即:
  1. 新增系统变量
    大数据之 Hadoop-5-HDFS
    文章图片
  2. 复制2.8.3文件夹中的bin文件夹,存放地址如下:
    大数据之 Hadoop-5-HDFS
    文章图片
  3. 重启idea后重生,问题解决。
注:不需要下载安装windows版本的Hadoop,只需要引入winutils.exe即可。
重新启动后,上边的问题解决了,又出现了这样的问题:Wrong FS: hdfs:/input/wc.txt, expected: file:///
详细错误信息:
23:51:26.466 [main] DEBUG org.apache.hadoop.fs.FileSystem - FS for file is class org.apache.hadoop.fs.LocalFileSystem Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: hdfs:/input/wc.txt, expected: file:/// at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:730)

解决方案:
hadoop需要把集群上的 core-site.xmlhdfs-site.xml 放到当前工程下。
1)hdfs-site.xml
2)core-site.xml
3)mapred-site.xml
上面三个文件,都是你linux环境安装hadoop 的配置的xml 文件, 把hadoop集群上的core-site.xml和hdfs-site.xml放到工程的src目录下 /resource
大数据之 Hadoop-5-HDFS
文章图片

【大数据之 Hadoop-5-HDFS】然后再执行该文件,可以看到 java 调用 Hadoop api 成功了 ^_^
大数据之 Hadoop-5-HDFS
文章图片

    推荐阅读