前言:这次学习实际操作跟hdfs交互,
hadoop fs命令代表着hadoop的file system文件系统。要操作hdfs就需要跟这个前缀命令打交道。
一、往hdfs上传下载文件
实验目的:观察如何往hdfs上传文件,并通过网页界面查看超过128m的文件分块和存储情况。
实验命令:hadoop fs -put 文件路径
实际操作如下图:


对应往hdfs上传文件就会有从hdfs下载文件到本地,命令如下
hadoop fs -get hdfs://host:port/user/hadoop/file localfile 成功返回0,失败返回-1。
二、hdfs的命令记录
hadoop fs -mkdir 文件目录 //创建目录
hadoop fs -rm 文件名 //删文件
hadoop fs -rm -r 文件夹 // 删文件夹,递归删除
hadoop fs -text 文件名 //改
hadoop fs -cat //查看文件内容
hadoop fs -ls 文件路径 //查,列举目录下的文件
hadoop fs -du -s -h /apps/hive/warehouse/test.db/test //查询文件大小,这里即对于表容量
hadoop fs -cp [-f选项会覆盖已经存在的目标] 原文件路径 目标路径 //复制文件
hadoop fs -mv 文件路径 目标路径 //移动文件
hadoop fs -count 文件路径 //统计文件路径下的目录、文件、字节数
另外:在vim编辑器中,删除一整行的命令是dd
三、修改hdfs的配置文件hdfs-site.xml
在<configuration>标签组里添加<property>配置
- 下面这个标签属性是配置文件默认的备份份数(默认是三份),比如设置为2这样文件在hdfs中就备份2份。
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
- 下面这个标签属性是设置hadoop每隔多长时间检查集群机器中的哪些机器宕机了,默认为300000毫秒(即5分钟),我们可以设置短一些(比如10000毫秒,即1分钟)。注意:集群机器宕机了一两台是不会影响集群对外提供服务的,因为集群本就是多台机器为同一个任务服务。
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>10000</value>
</property>
- 下面这个标签属性是用来配置hdfs取消用户权限检查的
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
还有许多属性没记录到,需要的时候百度或者查api就足够了。
- 注意,在上一篇搭建Hadoop集群环境的时候,我没有修改hadoop文件存储在哪里,所以默认是放在根目录的/tmp目录下,而tmp目录在Linux系统下关机后是会不定时清除的,所以这会导致一个非常严重的问题,就是你的集群会时而启动正常时而启动不正常。解决方法:更改hadoop文件的默认存储位置,通过设置core-site.xml配置文件,加入如下标签组属性,集群内的所有机器都要配置,不止是namenode,datanode也要配置这个属性,然后关闭集群,格式化下namenode,再重启集群就可以了。
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value>
</property>
最后放一个HDFS的理论篇,别人以漫画的形式写的。
https://mp.weixin.qq.com/s/8p6R8j2LLmFcaenOtVywVg
hadoop客户端和hdfs交互的原理是:
比如往hdfs上传功能,hadoop先访问namenode,namenode指定文件存放在哪个datanode,然后告诉hadoop客户端,hadoop再去访问对应的datanode。
比如从hdfs下载功能,hadoop先访问namenode,namenode查找文件存放在哪个datanode,然后告诉hadoop客户端,hadoop再去访问对应的datanode。
四、写Java程序访问HDFS
写java程序访问hdfs之前得先导入hadoop对应的包,然后再上传一个文件到hdfs文件系统内作为前提条件。这些jar包在hadoop安装包目录下,我直接放在我的网盘中,有需要自行下载然后导入jar包再写程序。
网盘链接:https://pan.baidu.com/s/1EbvHSzcGCkCf8Vgb6KgCyw
提取码:npk7
下面的java程序是一些基础的访问hdfs的方法,要了解更多还是得去看API文档。
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
public class HelloHDFS {
public static void main(String[] args) throws Exception{
boolean success;
//不加这一行设置,默认url只识别http协议
//所以必须通过这一行设置一个专门用来处理hdfs协议的FsUrlStreamHandlerFactory工厂
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
URL url = new URL("hdfs://10.14.28.100:9000/test.txt");
InputStream in = url.openStream();
//把输入流的内容转到输出流,true是完成后自动关闭流,4096是缓冲区大小
IOUtils.copyBytes(in,System.out,4096,true);
//相当于在命令行中配置core-site.xml的属性
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://10.14.28.100:9000");
//根据配置获得一个文件系统
FileSystem fs = FileSystem.get(conf);
//新建一个文件目录
success = fs.mkdirs(new Path("/xiaojiang"));
System.out.println(success);
//判断文件是否存在
success = fs.exists(new Path("/test.txt"));
System.out.println(success);
//删除文件目录
success = fs.delete(new Path("/xiaojiang"));
System.out.println(success);
//验证是否还存在被删除的文件目录
success = fs.exists(new Path("/xiaojiang"));
System.out.println(success);
FSDataOutputStream out = fs.create(new Path("/test.data"),true);
//把window的文件传到hdfs中
FileInputStream fin = new FileInputStream("D:/Hive编程指南 PDF 中文高清版.pdf");
IOUtils.copyBytes(fin,out,4096,true);
//获得指定目录下的每个文件的信息
FileStatus[] statues = fs.listStatus(new Path("/"));
for(FileStatus statu:statues) {
System.out.println(statu.getPath());
System.out.println(statu.getPermission());
System.out.println(statu.getReplication());
}
}
}
五、小结
文章是根据马士兵老师的hadoop入门视频教程所学整理,视频讲得挺好的,期间遇到一些错误就百度自行解决。
HDFS我们可以理解为是一个分冗展的大硬盘,即分块且多份存储、冗余存储、横向扩展。

答:
1、Hadoop分为HDFS、MapReduce、YARN主要三个逻辑组件。
2、HDFS的典型架构是主从架构,即一台master机器启动namenode进程,管理着多台slave启动着datanode的机器。
3、当空间不够了,可以通过加机器扩充datanode,配置好datanode,然后设置core-site.xml配置文件告诉master机器扩充了datanode,并交由namenode管理,这就是横向扩展,很方便很具有健壮性。
4、HDFS典型应用有百度网盘这种。
5、不会复制一份数据到我的网盘,只是存放一个链接到其他datanode,访问时通过链接访问对方的网盘。