简单的HDFS操作
简单的HDFS操作
文章目录
HDFS常用Shell命令
操作 HDFS的 Shell命令有三种:
- hadoop fs (适用于任何不同的文件系统,比如本地文件系统和 HDFS文件系统)
- hadoop dfs (只适用于 HDFS文件系统)
- 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 |
删除 |
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的安装位置。
第一次使用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
我们现在可以查看用户目录下所有文件的读写权限、大小、创建时间、路径等信息。
./bin/hdfs dfs -ls .
向HDFS中上传任意文本文件
我们在本地 home目录中创建一个 myFile.txt文件,使用 vim编辑文件。
cd ~
touch myFile.txt
vim myFile.txt
按 “i” 键进入编辑模式,随便往文件里输入一些字母,比如
hadoop
spark
flink
然后按 “esc” 键,输入“:wq”保存并退出。
然后我们使用 put命令,把 myFile.txt文件上传到 HDFS用户目录的 input文件夹中。
cd $HADOOP_HOME
./bin/hdfs dfs -put ~/myLocalFile.txt input
我们可以使用 ls命令查看一下文件是否成功上传到HDFS中
./bin/hdfs dfs –ls input
可以看到,myFile.txt文件已经在 input文件夹中。
将HDFS中指定文件的内容输出到终端
我们使用 cat命令即可查看 HDFS中 myFile.txt文件的内容
./bin/hdfs dfs -cat input/myFile.txt
从HDFS中下载指定文件
我们使用 get命令将刚才上传的 myFile.txt文件下载到本地 home/Videos目录中
./bin/hdfs dfs -get input/myFile.txt ~/Videos
同样地,使用 ls命令查看是否下载成功
cd ~/Videos
ls
删除HDFS中指定的文件
我们使用 rm 命令删除 input文件夹,以及该文件夹下的所有文件
cd $HADOOP_HOME
./bin/hdfs dfs -rm -r input
然后用 ls命令查看用户目录,判断是否删除成功
./bin/hdfs dfs -ls .
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项目。
根据个人喜好输入工程名称,这里我们输入“HDFS_Practice”。勾选“Use default location”,让工程文件保存在我们设置的 Eclipse的工作区里。JRE部分选择“Use a project specific JRE”,使用我们自己安装的 JDK版本。然后点击“next”,进入下一步。
我们需要为项目导入必要的 JAR包,这些 JAR包中包含了可以访问 HDFS的 Java API。JAR包的位置在“Hadoop安装目录/share/hadoop”目录下。比如我的是在“/usr/local/hadoop/share/hadoop”目录下,下面的操作中请选择到自己配置的 hadoop目录下导入 JAR包。
我们点击标题栏的“Libraries”,点击“Add Externtal JARs”
在新的弹窗中,我们通过选择上面的文件目录,进入“/usr/local/hadoop/share/hadoop”目录,记住是进入自己的Hadoop安装目录。
我们需要向 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工程的创建。
如果是第一次使用 Eclipse来操作 HDFS,我们还需要去关闭 HDFS的权限检测。因为 HDFS的权限检测机制默认是打开的,未关闭的时候,不能使用 eclipse插件对 HDFS上的文件进行操作,比如上传,删除等。我们先关闭 HDFS服务,然后在 hdfs-site.xml文件中加入一个变量 dfs.permissions,值设置为 false,用来其关闭权限检测。
我们先进入 home folder(也就是文件管理器),点击右上角的更多按钮,选择“Enter Location”
然后弹出的搜索框中输入“hadoop安装目录/etc/hadoop”,回车进入目录,然后找到 hdfs-site.xml,鼠标右键点击文件,选择“Open with”->“vim”进行编辑。
输入以下代码并保存。
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
因为我们是伪分布式模式运行 Hadoop,我们还需要将“hadoop安装目录/etc/hadoop”目录下的 core-site.xml、hdfs-site.xml这两个文件拷贝到 eclipse工作区中该工程的 bin文件夹下。
向HDFS上传任意文本文件
我们开始新建一个 Java程序,在 Eclipse界面左侧找到我们刚才创建的项目,点击鼠标右键,选择“New”->“Class”。
因为我们想要向 HDFS上传任意文本文件,所以我们取名为“uploadFile”,其他设置保持默认,点击“Finish”。
创建程序完成后,界面如下
接下来,我们开始编写往 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”直接运行。
程序运行结束后,底部的“Console”控制台会弹出运行信息,我们可以根据运行信息来判断程序是否成功执行。
如果遇到“log4j:WARN···”之类的警告信息,将 “hadoop安装目录/etc/hadoop”目录下的 log4j.properties文件复制到项目的 bin文件夹下,重新运行即可。
如果在控制台上看到这个提示信息,则证明文件上传成功。
INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
我们看到,虽然程序运行没有问题,但是多了一个警告,说是不能加载 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 .
可以看到,HDFS的用户目录 /user/hadoop下已经有了 myFile.txt文件。
我们也可以通过 Web界面来查看 HDFS的文件,进行验证。打开 Ubuntu自带的 FireFox浏览器,在地址栏输入“localhost:9870”,回车,进入 HDFS的 WebUI。点击标题栏右侧的“Utilities”,选择“Browse the file system”
在下方目录搜索栏中输入“/user/hadoop”,然后回车。可以看到,此时 HDFS的用户目录下的确存在 myFile.txt文件,通过 Java API向 HDFS 上传文件成功。
从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();
}
}
}
保存代码,然后我们开始编译运行 Java程序。同样地,看到提示信息,证明文件下载成功。
INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
我们回到桌面上,可以看到,桌面上已经有了 myFile.txt文件,通过 Java API从 HDFS 下载文件成功。
参考文章
上一篇: 学习vue.js