关于hadoop:大数据之-Hadoop5HDFS

5次阅读

共计 4826 个字符,预计需要花费 13 分钟才能阅读完成。

一、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 supergroup          0 2021-07-10 08:58 /input
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp

递归列出 HDFS 文件系统根目录下的所有目录和文件:

[root@centos01 ~]# hadoop fs -ls -R /
drwxr-xr-x   - hadoop supergroup          0 2021-07-10 08:58 /input
-rw-r--r--   2 hadoop supergroup         83 2021-07-10 08:58 /input/wc.txt
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp/hadoop-yarn
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp/hadoop-yarn/staging
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp/hadoop-yarn/staging/hadoop
drwx------   - hadoop supergroup          0 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 依赖包:

  <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.8.2</version>
        </dependency>

新建 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 supergroup          0 2021-07-10 08:58 /input
-rw-r--r--   2 hadoop supergroup         83 2021-07-10 08:58 /input/wc.txt
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp/hadoop-yarn
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp/hadoop-yarn/staging
drwx------   - hadoop supergroup          0 2021-07-10 08:38 /tmp/hadoop-yarn/staging/hadoo
drwx------   - hadoop supergroup          0 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.<clinit>(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. 新增零碎变量
  2. 复制 2.8.3 文件夹中的 bin 文件夹,寄存地址如下:
  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

而后再执行该文件,能够看到 java 调用 Hadoop api 胜利了 ^_^

正文完
 0