简单的HDFS操作

简单的HDFS操作

HDFS常用Shell命令

操作 HDFS的 Shell命令有三种:

  1. hadoop fs (适用于任何不同的文件系统,比如本地文件系统和 HDFS文件系统)
  2. hadoop dfs (只适用于 HDFS文件系统)
  3. hdfs dfs (只适用于 HDFS文件系统)

官方并不推荐使用第二种命令 hadoop dfs,有些 Hadoop版本中已将这种命令弃用。

Shell命令语法如下

hadoop fs [genericOptions] [commandOptions]

HDFS常用命令说明
hadoop fs -ls 显示 指定文件的详细信息
hadoop fs -cat 指定文件的内容输出到标准输出
hadoop fs touchz 创建一个 指定的空文件
hadoop fs -mkdir [-p] 创建指定的一个或多个文件夹,-p选项用于递归创建
hadoop fs -cp 将文件从源路径复制到目标路径
hadoop fs -mv 将文件从源路径移动到目标路径
hadoop fs -rm 删除 指定的文件,只删除非空目录和文件
hadoop fs -rm -r 删除 指定的文件夹及其下的所有文件,-r表示递归删除子目录
hadoop fs -chown 改变 指定文件的所有者为,该命令仅适用于超级用户
hadoop fs -chmod 指定的文件权限更改为,该命令仅适用于超级用户和文件所有者
hadoop fs -get 复制指定的文件到本地文件系统指定的文件或文件夹
hadoop fs -put 从本地文件系统中复制指定的单个或多个源文件到指定的目标文件系统
hadoop fs -moveFromLocal 与put命令功能相同,但是文件上传结束后会删除源文件
hadoop fs -copyFromLocal 将本地源文件复制到路径指定的文件或文件夹中
hadoop fs -copyToLocal 将目标文件复制到本地文件或文件夹中

使用HDFS的Shell命令

输出HDFS某一个目录下所有文件详细信息

我的 Hadoop版本为 Hadoop3.1.3。首先,我们先开启 Hadoop集群

cd $HADOOP_HOME
./sbin/start-dfs.sh

如果没有配置环境变量 HADOOP_HOME,请把上面命令中的 HADOOP_HOME改成你本地 Hadoop的安装位置。
f1

第一次使用HDFS时,需要首先在HDFS中创建用户目录。我们建立用户目录/user/hadoop。

./bin/hdfs dfs –mkdir –p /user/hadoop

用户目录的名字自己可以随意拟定,因为我现在使用的用户名是 hadoop,所以我的用户目录顺便也叫 hadoop。

用户目录建立完成后,所有的操作都会在用户目录上进行。也就是说,现在用户目录就是当前 HDFS默认的操作路径。例如,我们在 HDFS直接上建立文件夹 test,它的绝对路径是 /user/hadoop/test。

//下面两个命令等价
./bin/hdfs dfs –mkdir test
./bin/hdfs dfs –mkdir /user/hadoop/test

我们在用户目录下建立input和output文件夹,并创建一个abc.txt文件。

./bin/hdfs dfs -mkdir input output
./bin/hdfs dfs touchz abc.txt

f2

我们现在可以查看用户目录下所有文件的读写权限、大小、创建时间、路径等信息。

./bin/hdfs dfs -ls .

f3

向HDFS中上传任意文本文件

我们在本地 home目录中创建一个 myFile.txt文件,使用 vim编辑文件。

cd ~
touch myFile.txt
vim myFile.txt

按 “i” 键进入编辑模式,随便往文件里输入一些字母,比如

hadoop
spark
flink

然后按 “esc” 键,输入“:wq”保存并退出。
f4

然后我们使用 put命令,把 myFile.txt文件上传到 HDFS用户目录的 input文件夹中。

cd $HADOOP_HOME
./bin/hdfs dfs -put ~/myLocalFile.txt  input

我们可以使用 ls命令查看一下文件是否成功上传到HDFS中

./bin/hdfs dfs –ls input

f5

可以看到,myFile.txt文件已经在 input文件夹中。

将HDFS中指定文件的内容输出到终端

我们使用 cat命令即可查看 HDFS中 myFile.txt文件的内容

./bin/hdfs dfs -cat input/myFile.txt

f6

从HDFS中下载指定文件

我们使用 get命令将刚才上传的 myFile.txt文件下载到本地 home/Videos目录中

./bin/hdfs dfs -get input/myFile.txt ~/Videos

同样地,使用 ls命令查看是否下载成功

cd ~/Videos
ls

f7

删除HDFS中指定的文件

我们使用 rm 命令删除 input文件夹,以及该文件夹下的所有文件

cd $HADOOP_HOME
./bin/hdfs dfs -rm -r input

然后用 ls命令查看用户目录,判断是否删除成功

./bin/hdfs dfs -ls .

f8

HDFS常用JavaAPI

Hadoop本身使用 Java语言编写的,Hadoop不同的文件系统之间可以通过调用 JavaAPI来进行交互。Shell命令本质上就是 JavaAPI的应用。

HDFS常用 JavaAPI说明
org.apache.hadoop.fs.FileSystem一个通用文件系统的抽象基类,可以被分布式文件系统继承。所有可能使用 Hadoop文件系统的代码都要使用这个类。
org.apache.hadoop.fs.FileStatus一个接口,用于向客户端展示系统中文件和目录的元数据,具体包括文件大小、块大小、副本信息、所有者、修改时间等。
org.apache.hadoop.fs.FSDataInputStream文件输入流,用于读取 Hadoop文件
org.apache.hadoop.fs.FSDataOutputStream文件输入流,用于写 Hadoop文件
org.apache.hadoop.conf.Configuration访问配置项
org.apache.hadoop.fs.Path用于表示 Hadoop文件系统中的一个文件或一个目录的路径

使用HDFS的JavaAPI

创建工程并导入JAR包

这里我们使用的是 Ubuntu16.04系统,IDE是 Eclipse。如果没有在 Ubuntu系统上安装 Eclipse的,请参考这篇博客进行安装 Ubuntu16.04系统安装Eclipse

启动 Eclipse,在菜单栏选择 “File”->“New”->“Java Project”,创建新的 Java项目。
f9

根据个人喜好输入工程名称,这里我们输入“HDFS_Practice”。勾选“Use default location”,让工程文件保存在我们设置的 Eclipse的工作区里。JRE部分选择“Use a project specific JRE”,使用我们自己安装的 JDK版本。然后点击“next”,进入下一步。
f10

我们需要为项目导入必要的 JAR包,这些 JAR包中包含了可以访问 HDFS的 Java API。JAR包的位置在“Hadoop安装目录/share/hadoop”目录下。比如我的是在“/usr/local/hadoop/share/hadoop”目录下,下面的操作中请选择到自己配置的 hadoop目录下导入 JAR包。

我们点击标题栏的“Libraries”,点击“Add Externtal JARs”
f11

在新的弹窗中,我们通过选择上面的文件目录,进入“/usr/local/hadoop/share/hadoop”目录,记住是进入自己的Hadoop安装目录
f12

我们需要向 Java工程中添加以下 JAR包:

  • “/usr/local/hadoop/share/hadoop/common”目录下的所有 JAR包,即 hadoop-common-3.1.3.jar、hadoop-common-3.1.3-tests.jar、haoop-nfs-3.1.3.jar和、haoop-kms-3.1.3.jar,不包括 jdiff、lib、sources、webapps四个文件夹。
  • “/usr/local/hadoop/share/hadoop/common/lib”目录下的所有 JAR包
  • “/usr/local/hadoop/share/hadoop/hdfs”目录下的所有 JAR包。同样地,不包括 jdiff、lib、sources、webapps四个文件夹。
  • “/usr/local/hadoop/share/hadoop/hdfs/lib”目录下的所有 JAR包

我们分四次操作,把需要的 JAR包全部导入进来(lib目录下的 JAR包太多,我们可以使用 Ctrl+A快捷键进行全选)。所需的 JAR包全部添加完毕以后,我们点击右下角的“Finish”,完成 Java工程的创建。
f13

如果是第一次使用 Eclipse来操作 HDFS,我们还需要去关闭 HDFS的权限检测。因为 HDFS的权限检测机制默认是打开的,未关闭的时候,不能使用 eclipse插件对 HDFS上的文件进行操作,比如上传,删除等。我们先关闭 HDFS服务,然后在 hdfs-site.xml文件中加入一个变量 dfs.permissions,值设置为 false,用来其关闭权限检测。

我们先进入 home folder(也就是文件管理器),点击右上角的更多按钮,选择“Enter Location”
f14

然后弹出的搜索框中输入“hadoop安装目录/etc/hadoop”,回车进入目录,然后找到 hdfs-site.xml,鼠标右键点击文件,选择“Open with”->“vim”进行编辑。
f15

输入以下代码并保存。

<property>
    <name>dfs.permissions</name>
    <value>false</value>
</property>

f16

因为我们是伪分布式模式运行 Hadoop,我们还需要将“hadoop安装目录/etc/hadoop”目录下的 core-site.xml、hdfs-site.xml这两个文件拷贝到 eclipse工作区中该工程的 bin文件夹下。

向HDFS上传任意文本文件

我们开始新建一个 Java程序,在 Eclipse界面左侧找到我们刚才创建的项目,点击鼠标右键,选择“New”->“Class”。
f17

因为我们想要向 HDFS上传任意文本文件,所以我们取名为“uploadFile”,其他设置保持默认,点击“Finish”。
f18

创建程序完成后,界面如下
f19

接下来,我们开始编写往 HDFS中上传文件的 Java程序。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class uploadFile {
    public static void main(String[] args) {
        try {
            /*配置参数*/
            Configuration conf = new Configuration();             //实例化配置对象
            URI uri = new URI("hdfs://localhost:9000");           //指定伪分布式模式
            FileSystem fs = FileSystem.get(uri, conf, "hadoop");  //获取文件系统对象,三个参数分别绑定uri,conf,当前用户账户

            /*指定源文件和上传目录*/
            String srcFile = "/home/hadoop/myFile.txt";     //本地目录
            String dstDir = "/user/hadoop/";                //hdfs用户目录
            Path src = new Path(srcFile);                   //绑定Path路径
            Path dst = new Path(dstDir);

            /*上传文件*/
            fs.copyFromLocalFile(src, dst);     //调用copyFromLocal命令
            fs.close();                         //关闭文件系统对象
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

源文件是我已经提前编写好放在 /home/hadoop/目录下的 myFile.txt,待上传的目录 /user/hadoop也是之前创建好的。

在开始编译运行程序之前,请一定确保 Hadoop已经启动运行,如果还没有启动,请打开一个 Linux终端,输入命令启动 Hadoop

cd $HADOOP_HOME
./sbin/start-dfs.sh

按快捷键“Ctrl+S”保存一下代码,接下来我们开始编译运行 Java程序。我们点击 Eclipse菜单栏上的运行按钮,选择“Run as”->“Java Application”。或者我们也可以使用快捷键“Ctrl+F11”直接运行。
f20

程序运行结束后,底部的“Console”控制台会弹出运行信息,我们可以根据运行信息来判断程序是否成功执行。

如果遇到“log4j:WARN···”之类的警告信息,将 “hadoop安装目录/etc/hadoop”目录下的 log4j.properties文件复制到项目的 bin文件夹下,重新运行即可。
f21

如果在控制台上看到这个提示信息,则证明文件上传成功。

INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

f22

我们看到,虽然程序运行没有问题,但是多了一个警告,说是不能加载 native-hadoop库。

Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

这是因为我们修改配置文件的时候少配置了 native路径,系统加载不到这些库文件。具体解决办法请参考这篇博客 Hadoop之Unable to load native-hadoop library问题解决

言归正传,我们现在通过 terminal终端,验证一下文件是否上传成功。

cd $HADOOP_HOME
./bin/hdfs dfs -ls .

f23

可以看到,HDFS的用户目录 /user/hadoop下已经有了 myFile.txt文件。

我们也可以通过 Web界面来查看 HDFS的文件,进行验证。打开 Ubuntu自带的 FireFox浏览器,在地址栏输入“localhost:9870”,回车,进入 HDFS的 WebUI。点击标题栏右侧的“Utilities”,选择“Browse the file system”
f24

在下方目录搜索栏中输入“/user/hadoop”,然后回车。可以看到,此时 HDFS的用户目录下的确存在 myFile.txt文件,通过 Java API向 HDFS 上传文件成功。
f25

从HDFS下载指定文件

同理,我们新建 Java程序 downloadFile.java,使用 Java API编写程序从 HDFS下载文件。我们就将刚才上传的 myFile.txt文件,从 HDFS中下载到本地桌面上。

import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class downloadFile {
	public static void main(String[] args) {
		try {
			//set configurations
			Configuration conf = new Configuration();
			URI uri = new URI("hdfs://localhost:9000");
			FileSystem fs = FileSystem.get(uri, conf, "hadoop");
			
			//set File and Dir
			String srcFile = "/user/hadoop/myFile.txt";
			String dstDir = "/home/hadoop/Desktop/";
			Path src = new Path(srcFile);
			Path dst = new Path(dstDir);
			
			//download
			fs.copyToLocalFile(src, dst);
			fs.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

f26

保存代码,然后我们开始编译运行 Java程序。同样地,看到提示信息,证明文件下载成功。

INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

f27

我们回到桌面上,可以看到,桌面上已经有了 myFile.txt文件,通过 Java API从 HDFS 下载文件成功。
f28

参考文章

HDFS编程实践(Hadoop3.1.3)

通过JAVA API 来操作HDFS

使用Java API操作hdfs

eclipse控制台打印log4j警告

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用libhdfs++库来操作HDFS,这是一个C++客户端库,用于与Hadoop分布式文件系统(HDFS)交互。下面是一些基本的操作示例: 1. 引入头文件和命名空间: ```cpp #include <hdfs/hdfs.h> using namespace hdfs; ``` 2. 创建一个文件系统对象并连接到HDFS: ```cpp hdfsFS fs = hdfsConnect("hdfs://<namenode_host>:<port>"); ``` 其中,`<namenode_host>`是HDFS的名称节点主机名或IP地址,`<port>`是HDFS服务的端口号。 3. 检查连接是否成功: ```cpp if (!fs) { // 连接失败的处理逻辑 } ``` 4. 执行文件操作,例如创建文件、读取文件、写入文件等。以下是一些示例操作: - 创建一个新文件并写入内容: ```cpp const char* filePath = "/path/to/file.txt"; hdfsFile file = hdfsOpenFile(fs, filePath, O_WRONLY | O_CREAT, 0, 0, 0); if (file) { const char* data = "Hello, HDFS!"; tSize numBytesWritten = hdfsWrite(fs, file, data, strlen(data)); hdfsFlush(fs, file); hdfsCloseFile(fs, file); } else { // 文件打开失败的处理逻辑 } ``` - 读取文件内容: ```cpp const char* filePath = "/path/to/file.txt"; hdfsFile file = hdfsOpenFile(fs, filePath, O_RDONLY, 0, 0, 0); if (file) { char buffer[1024]; tSize numBytesRead = hdfsRead(fs, file, buffer, sizeof(buffer)); // 处理读取到的数据 hdfsCloseFile(fs, file); } else { // 文件打开失败的处理逻辑 } ``` - 删除文件: ```cpp const char* filePath = "/path/to/file.txt"; int success = hdfsDelete(fs, filePath, 0); if (success != 0) { // 文件删除失败的处理逻辑 } ``` 5. 断开与HDFS的连接: ```cpp hdfsDisconnect(fs); ``` 这只是一些简单的示例操作,libhdfs++库还提供了更多功能和API,你可以根据你的具体需求进行更多操作。记得在使用完毕后释放资源和检查错误状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值