目录
3.1Hadoop中HDFS的常用命令
我们已经知道的HDFS是分布式存储,可以存放大批量的文件,如果要对文件进行操作可以通过下面的命令来完成,如读取文件,上传文件,删除文件和建立目录等。HDFS提供了两种访问方式,分别是基于Shell和Java API。
3.1.1基于Shell的操作
以下介绍我们在Shell中操作HDFS时经常用到的命令
1.创建目录命令
HDFS创建目录的命令时mkdir,命令格式如下
hdfs dfs -mkdir 文件名
命令示例:
hdfs dfs -mkdir /demo #在hdfs的根目录下创建demo文件夹
hdfs dfs -mkdir -p /demo/test #在hdfs根目录下递归创建文件夹 /demo/test
2.上传文件到HDFS
上传文件时,文件首先复制到DataNode上,只有所有的DataNode都接受完整数据,文件上传才是成功。命令格式如下:
hdfs dfs -put filename 路径
命令示例:
hdfs dfs -put test.txt /demo #把test.txt文件放到demo文件夹下
3.列出HDFS上的文件
采用-ls命令来列出HDFS上的文件,需要注意的时在HDFS中没有“当前工作目录”这个概念。命令格式如下:
hdfs dfs -ls 路径
命令示例:
hdfs dfs -ls /demo
4.查看HDFS下某个文件的内容
通过“-cat 文件名”查看,命令格式如下
hdfs dfs -cat 文件名
命令示例:
hdfs dfs -cat /demo/test.txt
5.将HDFS中的文件复制到本地系统中
通过“-get 文件1 文件2”命令将HDFS中某个目录下的文件复制到本地系统的某文件中。命令格式如下:
hdfs dfs -get 文件名 本地路径
命令示例:
hdfs dfs -get /demo/test.txt / #将demo文件夹下的test.txt文件复制到本地根目录下
6.删除HDFS下的文档
通过“-rmr 文件” 命令删除HDFS下的文件。命令格式如下:
hdfs dfs -rm -r 文件
命令示例:
hdfs dfs -rm -r /demo/test.txt #删除demo文件夹下的test.txt文件
3.2基于Java API的操作
3.2.1前期准备
(1)windows安装hadoop
首先要把Hadoop放在我们的windows上,也不用配置什么东西,就是把hadoop包解压在我们的电脑上即可。
(2)IDEA创建项目
在IDEA编辑其中创建一个项目HdfsDemo,目录结构如下,out目录在岗创建的时候是没有的。
然后再src目录下创建一个包,包下则是我们的java代码,同时我们需要把我们的再虚拟机上的hadoop的两个文件放到src目录下如下图。
两个文件的配置如图;其中两个文件里面的映射名都改成了IP地址,因为windows没办法识别你的映射名-hadoop5,所以改成IP地址
这个IP地址是我的Secondary NameNode地址
这个IP地址是我NameNode的主机IP地址。
(3)添加jar包到我们的项目中
点击IDEA的左上角File---》》Project Structure
我们第一次打开时什么都没有的,然后点击右边框框里面的 + 号 然后点击 JARS OR directories
这个时候就开始寻找目录添加jar包了。我们这个时候需要找到hadoop文件夹,然后它下面的share/hadoop文件夹里面的JAR包全部添加进去把,别管用到用不到。
举个例子:添加包的时候,我们进入 share/hadoop/mapreduce 这个文件夹中后,这个目录下有包我们导入,然后我们再进入mapreduce下的lib目录下 也有包,再导入。一般就是这两处有包。具体要用到的我们可以在网上搜寻,这里做API 访问我们的hdfs已经足够了
3.2.2基于Java API的操作
本节将介绍通过Java API来访问HDFS,首先说下HDFS中文件操作主要涉及的几个类
Configuration类:该类的对象封装了客户端或者服务器的配置
FileSystem类:该类的对象时一个文件系统对象,可以用该对象的一些方法对文件进行操作。FileSystem fs = FileSystem.get(conf):通过FileSystem的静态方法get获得该对象。
FSDataInputStream和FSDataOutputStream:这两个类时HDFS中的输入/输出流,分别通过FileSystem的open方法和create方法获得。
代码如下:
package HdfsDemo;
import java.io.File;
import java.io.IOException;
import javafx.scene.chart.ScatterChart;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.util.ByteArrayManager;
public class HdfsDemo {
public static void main(String[] args) {
//调用下面的函数
createFolder(); //创建文件夹函数
//uploadFile(); //上传文件夹函数
//downloadFile(); //下载文件夹函数
//listFile(new Path("/")); //展示目录函数
}
private static void createFolder() {
Configuration conf = new Configuration();
try {
//通过配置信息得到文件系统的对象
FileSystem fs = FileSystem.get(conf);
//在指定路径下创建文件夹
Path path = new Path("/HdfsDemo");
fs.mkdirs(path);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void listFile(Path path){
//定义一个配置对象
Configuration conf = new Configuration();
try {
FileSystem fs = FileSystem.get(conf);
//传入路径,表示显示某个路径下的文件夹列表
//将给定路径下所有的文件元数据放到一个FileStatus的数组中
//FileStatus对象封装了文件和目录的元数据,包括文件长度、块大小、权限等信息
FileStatus[] fileStatusArray = fs.listStatus(path) ;
for (int i = 0 ; i < fileStatusArray.length ; i++) {
FileStatus fileStatus = fileStatusArray[i];
//首先检测当是否是文件夹如果是进行递归
if (fileStatus.isDirectory()) {
System.out.println("当前路径是:"+ fileStatus.getPath());
listFile(fileStatus.getPath());
}else {
System.out.println("当前路径是:"+fileStatus.getPath());
}
}
} catch(IOException e) {
e.printStackTrace();
}
}
public static void uploadFile() throws IOException {
Configuration conf = new Configuration() ;
try {
FileSystem fs = FileSystem.get(conf);
//定义文件的路径和上传的路径
Path src = new Path("本地文件路径");
Path dest = new Path("服务器路径");
//从本都上传文件到服务器
fs.copyFromLocalFile(src,dest);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void downloadFile(){
Configuration conf = new Configuration() ;
try{
FileSystem fs = FileSystem.get(conf);
//定义下载文件的路径和本地文件的路径
Path dest = new Path("/HdfsDemo/a.txt");
Path src = new Path("D://a.txt");
//从服务器下载到本地
fs.copyToLocalFile(dest,src);
} catch (IOException e) {
e.printStackTrace();
}
}
}
我们可以看到,我们有个主函数,分别调用了createFolder()、uploadFile()、downloadFile()、listFile()四个函数,调用那个函数,就会有什么结果。其中代码中的路径大家自己进行更改。
至此,我们对于hadoop集群的一个shell的基本命令和与Java API 的基础操作便完成。