Hadoop学习(二)——HDFS实践

前言:这次学习实际操作跟hdfs交互,hadoop fs命令代表着hadoop的file system文件系统。要操作hdfs就需要跟这个前缀命令打交道。

一、往hdfs上传下载文件

实验目的:观察如何往hdfs上传文件,并通过网页界面查看超过128m的文件分块和存储情况。
实验命令:hadoop fs -put 文件路径
实际操作如下图:

图片.png
网页端看到的结果如下图:
图片.png

对应往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我们可以理解为是一个分冗展的大硬盘,即分块且多份存储、冗余存储、横向扩展。

image.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 首先,我们在使用前先看看HDFS是什麽?这将有助于我们是以后的运维使用和故障排除思路的获得。 HDFS采用mast...
    W_Bousquet阅读 4,426评论 0 2
  • HDFS入门 hadoop架构 Hadoop 1.0中的资源管理方案 Hadoop 1.0指的是版本为Apache...
    依天立业阅读 1,255评论 0 1
  • HDFS的设计目标 通过上一篇文章的介绍我们已经了解到HDFS到底是怎样的东西,以及它是怎样通过多副本机制来提供高...
    陌上疏影凉阅读 1,527评论 0 3
  • 三天的培训结束了,王鹏老师以自己的酸辣粉+鸡排故事结尾,瞬间在我们赋予他的幽默、智慧、专业、帅之外,多了一道暖阳,...
    智慧成长说阅读 467评论 0 3
  • 所谓“心流”,就是当你特别专注地做一-件 目标明确而又有挑战的事情,而你的能力 恰好能接住这个挑战,你可能会进入的...
    333aaa阅读 176评论 0 0

友情链接更多精彩内容