目录
3.1Hadoop中HDFS的常用命令
3.1.1基于Shell的操作
1.创建目录命令
2.上传文件到HDFS
3.列出HDFS上的文件
4.查看HDFS下某个文件的内容
5.将HDFS中的文件复制到本地系统中
6.删除HDFS下的文档
3.2基于Java API的操作
3.2.1前期准备
(1)windows安装hadoop
(2)IDEA创建项目
(3)添加jar包到我们的项目中
3.2.2基于Java API的操作
我们已经知道的HDFS是分布式存储,可以存放大批量的文件,如果要对文件进行操作可以通过下面的命令来完成,如读取文件,上传文件,删除文件和建立目录等。HDFS提供了两种访问方式,分别是基于Shell和Java API。
以下介绍我们在Shell中操作HDFS时经常用到的命令
HDFS创建目录的命令时mkdir,命令格式如下
hdfs dfs -mkdir 文件名
命令示例:
hdfs dfs -mkdir /demo #在hdfs的根目录下创建demo文件夹 hdfs dfs -mkdir -p /demo/test #在hdfs根目录下递归创建文件夹 /demo/test
上传文件时,文件首先复制到DataNode上,只有所有的DataNode都接受完整数据,文件上传才是成功。命令格式如下:
hdfs dfs -put filename 路径
命令示例:
hdfs dfs -put test.txt /demo #把test.txt文件放到demo文件夹下
采用-ls命令来列出HDFS上的文件,需要注意的时在HDFS中没有“当前工作目录”这个概念。命令格式如下:
hdfs dfs -ls 路径
命令示例:
hdfs dfs -ls /demo
通过“-cat 文件名”查看,命令格式如下
hdfs dfs -cat 文件名
命令示例:
hdfs dfs -cat /demo/test.txt
通过“-get 文件1 文件2”命令将HDFS中某个目录下的文件复制到本地系统的某文件中。命令格式如下:
hdfs dfs -get 文件名 本地路径
命令示例:
hdfs dfs -get /demo/test.txt / #将demo文件夹下的test.txt文件复制到本地根目录下
通过“-rmr 文件” 命令删除HDFS下的文件。命令格式如下:
hdfs dfs -rm -r 文件
命令示例:
hdfs dfs -rm -r /demo/test.txt #删除demo文件夹下的test.txt文件
首先要把Hadoop放在我们的windows上,也不用配置什么东西,就是把hadoop包解压在我们的电脑上即可。
在IDEA编辑其中创建一个项目HdfsDemo,目录结构如下,out目录在岗创建的时候是没有的。
然后再src目录下创建一个包,包下则是我们的java代码,同时我们需要把我们的再虚拟机上的hadoop的两个文件放到src目录下如下图。
两个文件的配置如图;其中两个文件里面的映射名都改成了IP地址,因为windows没办法识别你的映射名-hadoop5,所以改成IP地址
这个IP地址是我的Secondary NameNode地址
这个IP地址是我NameNode的主机IP地址。
点击IDEA的左上角File---》》Project Structure
我们第一次打开时什么都没有的,然后点击右边框框里面的 + 号 然后点击 JARS OR directories
这个时候就开始寻找目录添加jar包了。我们这个时候需要找到hadoop文件夹,然后它下面的share/hadoop文件夹里面的JAR包全部添加进去把,别管用到用不到。
举个例子:添加包的时候,我们进入 share/hadoop/mapreduce 这个文件夹中后,这个目录下有包我们导入,然后我们再进入mapreduce下的lib目录下 也有包,再导入。一般就是这两处有包。具体要用到的我们可以在网上搜寻,这里做API 访问我们的hdfs已经足够了
本节将介绍通过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 的基础操作便完成。