hadoop 的hdfs:

1.通过代码验证集群的配置文件的优先级

@Test

public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException {

      // 1 获取文件系统

      Configuration configuration = new Configuration();

      configuration.set("dfs.replication", "2");

      FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "jinghang");

      // 2 上传文件

      fs.copyFromLocalFile(new Path("e:/banzhang.txt"), new Path("/banzhang.txt"));

     // 3 关闭资源

      fs.close();

    System.out.println("over");

}

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

 

<configuration>

   <property>

      <name>dfs.replication</name>

        <value>1</value>

   </property>

</configuration>

3.参数优先级

参数优先级排序:(1)客户端代码中设置的值 >(2)ClassPath下的用户自定义配置文件 >(3)然后是服务器的默认配置

2.通过代码验证seek指定位置下载

编写代码

(1)下载第一块

@Test

public void readFileSeek1() throws IOException, InterruptedException, URISyntaxException{

 // 1 获取文件系统

    Configuration configuration = new Configuration();

    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "jinghang");

    // 2 获取输入流

    FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));

    // 3 创建输出流

    FileOutputStream fos = new FileOutputStream(new File("e:/hadoop-2.7.2.tar.gz.part1"));

   // 4 流的拷贝

    byte[] buf = new byte[1024];

    for(int i =0 ; i < 1024 * 128; i++){

       fis.read(buf);

       fos.write(buf);

    }

    // 5关闭资源

    IOUtils.closeStream(fis);

    IOUtils.closeStream(fos);

fs.close();

}

(2)下载第二块

@Test

public void readFileSeek2() throws IOException, InterruptedException, URISyntaxException{

    // 1 获取文件系统

    Configuration configuration = new Configuration();

    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "jinghang"));

    // 2 打开输入流

    FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));   

    // 3 定位输入数据位置

    fis.seek(1024*1024*128);

    // 4 创建输出流

    FileOutputStream fos = new FileOutputStream(new File("e:/hadoop-2.7.2.tar.gz.part2"));

// 5 流的对拷

    IOUtils.copyBytes(fis, fos, configuration); 

// 6关闭资源

    IOUtils.closeStream(fis);

    IOUtils.closeStream(fos);

}

(3)合并文件

在Window命令窗口中进入到目录E:\,然后执行如下命令,对数据进行合并

type hadoop-2.7.2.tar.gz.part2 >> hadoop-2.7.2.tar.gz.part1

合并完成后,将hadoop-2.7.2.tar.gz.part1重新命名为hadoop-2.7.2.tar.gz。解压发现该tar包非常完整。
 

3.hdfs的文件的上传、下载流程

hdfs的文件的上传1.需求:把本地e盘上的banhua.txt文件上传到HDFS根目录

2.编写代码

@Test

public void putFileToHDFS() throws IOException, InterruptedException, URISyntaxException {

   // 1 获取文件系统

   Configuration configuration = new Configuration();

   FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "jinghang");

   / 2 创建输入流

   FileInputStream fis = new FileInputStream(new File("e:/banhua.txt"));

   // 3 获取输出流

   FSDataOutputStream fos = fs.create(new Path("/banhua.txt"));

   // 4 流对拷

   IOUtils.copyBytes(fis, fos, configuration);

 // 5 关闭资源

   IOUtils.closeStream(fos);

   IOUtils.closeStream(fis);

    fs.close();

}

hdfs的文件的下载

1.需求:从HDFS上下载banhua.txt文件到本地e盘上

2.编写代码

// 文件下载

@Test

public void getFileFromHDFS() throws IOException, InterruptedException, URISyntaxException{

   // 1 获取文件系统

   Configuration configuration = new Configuration();

   FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "jinghang");

   // 2 获取输入流

   FSDataInputStream fis = fs.open(new Path("/banhua.txt"));

   // 3 获取输出流

   FileOutputStream fos = new FileOutputStream(new File("e:/banhua.txt"))   

   // 4 流的对拷

   IOUtils.copyBytes(fis, fos, configuration

   // 5 关闭资源

   IOUtils.closeStream(fos);

   IOUtils.closeStream(fis);

   fs.close();

}

4.hdfs的默认副本策略

·Hadoop2.7.2副本节点选择

第一个副本在Client所处的节点上。如果客户端在集群外,随机选一个

第二个副本和第一个副本位于相同机架,随机节点

第三个副本位于不同机架,随机节点

5.nn和2nn的工作机制?2nn有什么作用?集群的故障处理、集群的安全模式

1. 第一阶段:NameNode启动

(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

(2)客户端对元数据进行增删改的请求。

(3)NameNode记录操作日志,更新滚动日志。

(4)NameNode在内存中对元数据进行增删改。

2. 第二阶段:Secondary NameNode工作

        (1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。

        (2)Secondary NameNode请求执行CheckPoint。

        (3)NameNode滚动正在写的Edits日志。

        (4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。

        (5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。

        (6)生成新的镜像文件fsimage.chkpoint。

        (7)拷贝fsimage.chkpoint到NameNode。

        (8)NameNode将fsimage.chkpoint重新命名成fsimage

6.dn的工作机制

1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。

2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。

3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。

4)集群运行中可以安全加入和退出一些机器


7.判断dn的离线

1、DataNode进程死亡 或者网络故障造成DataNode无法与NameNode通信

2、NameNode不会立 即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。

3、HDF S默认的超时时长为10分钟+30秒。

8.添加新节点

.      环境准备

        (1)在hadoop104主机上再克隆一台hadoop105主机

        (2)修改IP地址和主机名称

        (3)删除原来HDFS文件系统留存的文件(/opt/module/hadoop-2.7.2/datalog

        (4)source一下配置文件

[jinghang@hadoop105 hadoop-2.7.2]$ source /etc/profile

2.    服役新节点具体步骤

(1)直接启动DataNode,即可关联到集群sbin/hadoop-daemon.sh start datanodes     bin/yarn-daemon.sh start nodemanager

(2)在hadoop105上上传文件hadoop fs -put

(3)如果数据不均衡,可以用命令实现集群的再平衡./start-balancer.sh

9.什么是黑名单?什么是白名单?如何退役旧节点?

黑名单:在黑名单上面的主机都会被强制退出。

白名单:添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被退出。

(1)在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创dfs.hosts文件       touch dfs.hosts

添加主机名:hadoop102hadoop103hadoop104

(2)在NameNode的hdfs-site.xml配置文件中增加dfs.hosts属性

<property>

<name>dfs.hosts</name>

<value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value>

</property>

(3)配置文件分发:xsync hdfs-site.xml

(4)刷新NameNode:hdfs dfsadmin -refreshNodes

(5)更新ResourceManager节点yarn rmadmin -refreshNodes

(6)在web浏览器上查看hadoop01:50070

4.    如果数据不均衡,可以用命令实现集群的再平衡./start-balancer.sh

starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-jinghang-balancer-hadoop102.out

Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved

黑名单退役:

1.在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创dfs.hosts.exclude文件

2.在NameNode的hdfs-site.xml配置文件中增加dfs.hosts.exclude属性

3.刷新NameNode、刷新ResourceManager

4.  检查Web浏览器,退役节点的状态为decommission in progress(退役中),说明数据节点正在复制块到其他节点

5.等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役

6.    如果数据不均衡,可以用命令实现集群的再平衡

注意:不允许白名单和黑名单中同时出现同一个主机名称。

发布了16 篇原创文章 · 获赞 10 · 访问量 294

猜你喜欢

转载自blog.csdn.net/XIAOMO__/article/details/103672730