Hadoop学习之HDFS

                                Hadoop学习之HDFS

1 HDFS相关概念

1.1 设计思路

分散存储,冗余备份。

分散存储:大文件被切割成小文件,使用分而治之的思想让多个服务器对同一个文件进行联合管理;

冗余备份:每个小文件做冗余备份,并且分散存到不同的服务器,做到高可靠不丢失。

1.2 架构

主从架构

(1)namenode(nn主节点): 存储元数据(目录结构,文件详情,文件块列表,块所在的节点列表)请求和响应,接收datanode汇报(节点状态,块状况),向datanode发送命令(负载均衡)等;

(2)datanode(dn从节点): 存储具体的block块,校验文件,汇报状况,接收命令等;

(3)secondarynamenode(2nn): 辅助作用。

1.3 特点

(1)HDFS 中的文件在物理上是分块存储(block),块的大小可以通过配置参数(dfs.blocksize) 来规定,默认大小在 hadoop3.x 版本中是 256M,hadoop2.x 版本中是 128M,老版本中是 64M

(2)HDFS 文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件

(3)目录结构及文件分块位置信息(元数据)的管理由 namenode 节点承担,负责维护整个 hdfs 文件系统的目录树,以及每一个路径(文 件)所对应的 block 块信息(block 的 id,及所在的 datanode 服务器)

(4)文件的各个 block 的存储管理由 datanode 节点承担,每一个 block 都可以在多个 datanode 上存储多个副本(参数设置 dfs.replication,默认是 3)

(5)HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的修改

1.4 优缺点

优点:可构建在廉价机器上,高容错性(多个副本,丢失自动恢复),适合批处理(移动计算而非数据,数据位置暴露给计算框架),适合大数据处理,流式文件访问(一次性写入,多次读取,保证数据一致性)

缺点:不适合低延时操作(延时大),不适合频繁修改(网络开销大) ,不适合处理小文件(小文件寻道时间超过读取时间,元数据是在namenode的内存,一个数据块的元数据大小大约是150byte,存储 1 亿个 block,大约需要 20GB 内存,如果一个文件大小为 10K,则 1 亿个文件大小仅为 1TB(但要消耗掉 NameNode 20GB 内存)

1.5 作用

主要用来解决海量数据的存 储问题

2 核心设计思想

2.1 心跳机制

Hadoop 是 Master/Slave 结构,Master 有 NameNode 和 ResourceManager,Slave 有 Datanode 和 NodeManager。master 启动的时候会启动一个 ipc server 服务等待Slave连接;slave 启动时,会主动链接 master 的 ipc server 服务 。master和slave之间通过ipc服务通信,通信有固定时间周期(默认3秒),称之为心跳。

NameNode 通过心跳得知 Datanode 的状态 ResourceManager 通过心跳得知 NodeManager 的状态。master 长时间都没有收到 slave 的心跳,就认为该 slave 挂掉了。默认的超时时间为:

timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 *  dfs.heartbeat.interval

hdfs-site.xml 配置

配置文件中的 heartbeat.recheck.interval 的单位为毫秒(默认5 min),dfs.heartbeat.interval 的单位为秒(默认3 sec)

 

检查时间:在master在接收不到slave的心跳时,此时会向slave主动发送检查

        <property>

                <name>heartbeat.recheck.interval</name>

                <value>5000</value>

        </property>

 

心跳报告周期

        <property>

                <name>dfs.heartbeat.interval</name>

                <value>3 </value>

        </property>

2.2 安全模式

safemode是namenode的一种状态(有三种状态,分别为:active,standby,safemode),集群中的文件不能被操作(自我保护)。

进入safemode的状况:namenode发现集群中块的丢失率达到0.1%时(丢失率通过dfs.namenode.safemode.threshold-pc 配置,默认等于0.999f ),namenode就会进入安全模式,客户端不能对任何数据进行操作,只能查看元数据信息。

退出safemode:①找到问题所在,进行修复,如修复宕机的打他弄得;②手动强行退出,没有解决问题,可能再次出现数据丢失

为什么冷启动集群的时候会自动进入安全模式,又自动退出安全模式?因为block块所在的datanode信息(文件路径、副本数、blockid,及每一个 block 所在 datanode 的信息)存在内存中, fsimage 中,不包含 block 所在的 datanode 信息。在冷启动namenode的时候,内存中的元数据是从 fsimage中加载的,所以就没有datanode信息,namenode就认为所有的block丢失,进入安全模式。datanode启动后会定期向namenode汇报自己block块信息,namenode 就会将内存元数据中的 block 所 在 datanode 信息补全更新,就有了datanode信息,从而自动退出安全模式

相关命令:

hdfs dfsadmin -safemode get 获取当前safemode的状态
hdfs dfsadmin -safemode enter进入safemode状态
hdfs dfsadmin -safemode leave强制退出safemode
hdfs dfsadmin -safemode wait/等待,一直到安全模式结束

2.3 副本存放策略

作用:分散冗余存储,保证可靠性和高效性。

副本存放原则:将每个文件的数据进行分块存储,每一个数据块又保存有多个副本,这些数据块副本分 布在不同的机器节点上,需要考虑高可靠、负载均衡、带宽。

副本存放方法:①尽可能存放在本地节点 :第一个 block 副本放在和 client 所在的 node 里,如果client不在集群中则随机抽取一个node;②存放在不同的机架的节点 :第二个副本放在与第一个节点不同机架的node中,随机选择;③存放在和第二个副本同机架的不同节点 :第三个副本和第二个副本存放在同一个机架的不同node中。

修改副本数:

           ①修改hdfs-site.xml

        <property>

                <name>>dfs.replication</name>

                <value>1</value>

        </property>

           ②命令设置:hdfs dfs -setrep 2 文件

2.4 负载均衡

机器与机器之间磁盘利用率不平衡是 HDFS 集群非常容易出现的情况,尤其是在 DataNode 节点出现故障或在现有的集群上增添新的DataNode 的时候。

如何实现负载均衡:

①start-balancer.sh或start-balancer.sh -threshold 5(开启自动进行均衡)

②自动进行均衡非常慢,一天能移动的数据量在 10G-10T 的级别,很难满足超大集群的需求。因为HDFS 集群默认不允许 balance 操作占用很大的网络带宽,这个带宽是可以调整的 hdfs dfsadmin -setBalanacerBandwidth 10485760 该数值的单位是字节,这个配置是 10M/s,默认是 1M/s。这个配置也可以在hdfs-site.xml中配置

        <property>

                <name>>>dfs.balance.bandwidthPerSec</name>

                <value>>10485760</value>

        </property>

③stat-balancer.sh -t 10%: 负载最高的节点和最低节点之间的数据差距比例不超过10%

 

3 HDFS 的 shell(命令行客户端)操作

支持的命令及参数如下

[-appendToFile <localsrc> ... <dst>]
        [-cat [-ignoreCrc] <src> ...]
        [-checksum <src> ...]
        [-chgrp [-R] GROUP PATH...]
        [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
        [-chown [-R] [OWNER][:[GROUP]] PATH...]
        [-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
        [-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
        [-count [-q] [-h] <path> ...]
        [-cp [-f] [-p | -p[topax]] <src> ... <dst>]
        [-createSnapshot <snapshotDir> [<snapshotName>]]
        [-deleteSnapshot <snapshotDir> <snapshotName>]
        [-df [-h] [<path> ...]]
        [-du [-s] [-h] <path> ...]
        [-expunge]
        [-find <path> ... <expression> ...]
        [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
        [-getfacl [-R] <path>]
        [-getfattr [-R] {-n name | -d} [-e en] <path>]
        [-getmerge [-nl] <src> <localdst>]
        [-help [cmd ...]]
        [-ls [-d] [-h] [-R] [<path> ...]]
        [-mkdir [-p] <path> ...]
        [-moveFromLocal <localsrc> ... <dst>]
        [-moveToLocal <src> <localdst>]
        [-mv <src> ... <dst>]
        [-put [-f] [-p] [-l] <localsrc> ... <dst>]
        [-renameSnapshot <snapshotDir> <oldName> <newName>]
        [-rm [-f] [-r|-R] [-skipTrash] <src> ...]
        [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
        [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
        [-setfattr {-n name [-v value] | -x name} <path>]
        [-setrep [-R] [-w] <rep> <path> ...]
        [-stat [format] <path> ...]
        [-tail [-f] <file>]
        [-test -[defsz] <path>]
        [-text [-ignoreCrc] <src> ...]
        [-touchz <path> ...]
        [-truncate [-w] <length> <path> ...]
        [-usage [cmd ...]]

常用命令如下:

命令:

           hadoop fs :运行fs

           hdfs dfs:运行fs的命令

hdfs dfsadmin  -report: 报告整个集群的状态

hdfs getconf -confKey key:获取hdfs集群的配置信息

-help输出这个命令参数手册
-ls显示目录信息
-mkdir在 hdfs 上创建目录
-put等同于 copyFromLocal,进行文件上传
-get等同于 copyToLocal,就是从 hdfs 下载文件到本地
-copyFromLocal从本地文件系统中拷贝文件到 hdfs 文件系统去
-copyToLocal从 hdfs 拷贝到本地
-cp复制(hdfs文件系统)
-mv移动(hdfs文件系统)
-moveFromLocal从本地剪切到 hdfs
-moveToLocal从 hdfs 剪切到本地
-getMerge合并下载
-appendToFile追加内容
-cat查看文件内容
-rm删除
-rmdir删除空目录
-text以字符形式展示文件内容
-setrep设置副本的数量

4 Java API操作HDFS

4.1 环境搭建

(1)下载并复制插件hadoop-eclipse-plugin.jar --> eclipse/plugins

(2)解压windows 平台编译的hadoop放在非中文路径下

(3)eclipse-->preferences-->hadoop map/reduce  选择上一步解压的hadoop路径配置

(4)windows-->show view -->mapreduce,双击选中

出现如下对话框

(5)点击上一步对象框右上角的小象图标,修改相应的信息

(6)完成后,在项目资源管理器下可以看到如下图标

4.2 Java API操作

首先要导入相关的jar包。

(1)Configuration

代表client与文件系统连接的配置对象

默认配置:

           ①configration对象中默认的配置

           ②common.jar/hdfs.jar/map.jar/yarn.jar等jar包下的core-default.xml,hdfs-deafult.xml,mapred-default.xml,

yarn-default.xml

           ③自定义一些xml文件,放置在classpath下,core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml

自定义配置:

           ①如果是xml文件,conf.addResource("core-aaa.xml");

          ② 使用conf方法,conf.set("fs.defaultFS", "hdfs://hdp01:9000");

(2)FileSystem

Configuration conf = new Configuration()

FileSystem fs = FileSystem.get(conf)

要获得一个客户端实例对象,get 方法是从从 conf 中的一个参数 fs.defaultFS 的配置值判断具体实例化哪种客户端类。如果没有指定fs.defaultFS,并且工程 classpath 下也没有给定相应的配置,conf 中的默认值就来自于 hadoop 的 jar 包中的 core-default.xml,默认值为: file:///,在代码中设置了conf.set("fs.defaultFS", "hdfs://bigdata01:9000")这个代码获得的才是hdfs的客户端对象

建立与hdfs的连接还可以如下操作

(3)相关api操作

package com.refuel;import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.util.Arrays;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;public class HDFSDemo {FileSystem fs = null;@Beforepublic void before() throws Exception {URI uri = new URI("hdfs://bigdata01:9000");Configuration conf = new Configuration();fs = FileSystem.get(uri, conf, "refuel");}// 创建文件夹@Testpublic void mkdir() throws IOException {Path dir = new Path("/mkdir");boolean bool = fs.mkdirs(dir);System.out.println(bool);}// 上传@Testpublic void copyFromLocal() throws IOException {// 本地文件Path src = new Path("e:/copyFromLocal.txt");// hdfs文件系统Path dst = new Path("/copyFromLocal.txt");fs.copyFromLocalFile(src, dst);System.out.println("上传成功!");}// 下载@Testpublic void copytoLocal() throws IOException {// hdfs文件系统Path src = new Path("/copytoLocal.txt");// 本地文件系统Path dst = new Path("e:/copytoLocal.txt");fs.copyToLocalFile(false, src, dst, true);}// 流式数据访问@Testpublic void get() throws IllegalArgumentException, IOException {// 获取hdfs文件系统的输入流FSDataInputStream in = fs.open(new Path("/get.txt"));// 获取本地文件系统输出流FileOutputStream out = new FileOutputStream("e://get.txt");// 使用工具类读写IOUtils.copyBytes(in, out, 4096);System.out.println("下载成功!");in.close();out.close();}// 下载jdk-8u73-linux-x64.tar.gz第二块文件@Testpublic void getBlock() throws Exception {// 1.获取文件的属性Path f = new Path("/jdk-8u73-linux-x64.tar.gz");FileStatus fileStatus = fs.getFileStatus(f);// 块信息BlockLocation[] blkLocations = fs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());// 2.判断是否存在第二块if (blkLocations.length < 2) {throw new RuntimeException("该文件不存在第二块");}// 3.1获取第二块的offset的三种方法如下// 1.获取文件的blocksize: fileStatus.getBlockSize()// 2.获取第一块长度: blkLocations[0].getLength()// 3.直接获取第二块的offset,blkLocation[1].getoffset()long offset = blkLocations[1].getOffset();// 3.2 获取第二块的长度long length = blkLocations[1].getLength();// 4.构建输入输出流,指定offset读取lengthFSDataInputStream in = fs.open(f);FileOutputStream out = new FileOutputStream("e:/jdk");// 指定offsetin.seek(offset);// 指定长度,注意length是long类型的IOUtils.copyBytes(in, out, length, true);System.out.println("下载块成功!");}// 遍历文件@Testpublic void listFile() throws Exception {// 实现递归操作,返回迭代器RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(new Path("/"), true);while (iterator.hasNext()) {// FileStatus的子类,包含文件的详细信息,包含属性blockLocations(文件的块信息)LocatedFileStatus status = iterator.next();System.out.println("path=" + status.getPath());System.out.println("owner=" + status.getOwner());System.out.println("len=" + status.getLen());System.out.println("rep=" + status.getReplication());// 获取该文件的块详情BlockLocation[] blockLocations = status.getBlockLocations();System.out.println("块的个数:" + blockLocations.length);for (int i = 0; i < blockLocations.length; i++) {System.out.println("names=" + Arrays.toString(blockLocations[i].getNames()));System.out.println("hosts=" + Arrays.toString(blockLocations[i].getHosts()));System.out.println("offset=" + blockLocations[i].getOffset());System.out.println("length=" + blockLocations[i].getLength());}System.out.println("----------------------------");}}@Afterpublic void after() throws IOException {fs.close();}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 799. 香槟塔(DP动态规划)

文章目录1. 题目2. 解题1. 题目 我们把玻璃杯摆成金字塔的形状&#xff0c;其中第一层有1个玻璃杯&#xff0c;第二层有2个&#xff0c;依次类推到第100层&#xff0c;每个玻璃杯(250ml)将盛有香槟。 从顶层的第一个玻璃杯开始倾倒一些香槟&#xff0c;当顶层的杯子满了&…

天池在线编程 2020国庆八天乐 - 7 进制

文章目录1. 题目2. 解题1. 题目 https://tianchi.aliyun.com/oj/118289365933779217/122647324212270017 Given an integer, return its base 7 string representation. 输入范围为[-1e7, 1e7] 。 示例 样例 1: 输入: num 100 输出: 202样例 2: 输入: num -7 输出: -102.…

Hadoop学习之MapReduce

Hadoop学习之MapReduce 目录 Hadoop学习之MapReduce 1 MapReduce简介 1.1 什么是MapReduce 1.2 MapReduce的作用 1.3 MapReduce的运行方式 2 MapReduce的运行机制 2.1 相关进程 2.2 MapReduce的编程套路 2.3 MapTask的并行度 2.4 切片及其源码解读 2.5 ReduceTask的…

Hadoop学习之yarn

Hadoop学习之YARN 1 YARN简介 1.1 概述 YARN &#xff08;Yet Another Resource Negotiator&#xff09;是一个资源调度平台&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而 MapReduce 等运算程序则相当于运行于操作…

天池在线编程 2020国庆八天乐 - 8. 分糖果

文章目录1. 题目2. 解题1. 题目 https://tianchi.aliyun.com/oj/118289365933779217/122647324212270016 描述&#xff1a; 给定长度为偶数的整数数组&#xff0c;该数组中不同的数字代表不同种类的糖果&#xff0c; 每个数字表示一种糖果。 您需要将这些糖果平均分配给弟弟和…

Hive基础知识

Hive基础知识 1 Hive相关概念 1.1 Hive是什么 Hive是基于 Hadoop 的一个数据仓库工具&#xff0c;可以将结构化的数据映射为一张数据库表&#xff0c;并提供 HQL(Hive SQL)查询功能&#xff0c;最终底层将HQL语句转换为MapReduce任务的&#xff0c;底层数据是存储在 HDFS 上…

天池在线编程 2020国庆八天乐 - 6. 山谷序列(DP)

文章目录1. 题目2. 解题1. 题目 https://tianchi.aliyun.com/oj/118289365933779217/122647324212270018 描述&#xff1a; 给你一个长度为 n 的序列&#xff0c;在他的子序列中让你找一个山谷序列&#xff0c;山谷序列定义为&#xff1a; 序列的长度为偶数。假设子序列的长…

天池在线编程 2020国庆八天乐 - 4. 生成更大的陆地(BFS)

文章目录1. 题目2. 解题1. 题目 https://tianchi.aliyun.com/oj/118289365933779217/122647324262601668 LeetCode 上也有该题 827. 最大人工岛 描述 在一个0和1的2D网格中&#xff0c;我们最多将一个0改为1。 之后&#xff0c;最大岛屿的大小是多少&#xff1f; &#xff0…

python操作MySQL 模拟简单银行转账操作

一、基础知识 1、MySQL-python的安装 下载&#xff0c;然后 pip install 安装包 2、python编写通用数据库程序的API规范 &#xff08;1&#xff09;、数据库连接对象 connection&#xff0c;建立python客户端与数据库的网络连接&#xff0c;创建方法为 MySQLdb.Connect(参数) 参…

LeetCode 1007. 行相等的最少多米诺旋转

文章目录1. 题目2. 解题1. 题目 在一排多米诺骨牌中&#xff0c;A[i] 和 B[i] 分别代表第 i 个多米诺骨牌的上半部分和下半部分。&#xff08;一个多米诺是两个从 1 到 6 的数字同列平铺形成的 —— 该平铺的每一半上都有一个数字。&#xff09; 我们可以旋转第 i 张多米诺&a…

Hive内置函数大全

Hive内置函数大全 目录 Hive内置函数大全 1.复合类型构造函数 2 复合类型操作符 3 数值计算函数 4 日期函数 5 条件函数 6 字符串函数 7 汇总统计函数&#xff08;UDAF&#xff09; 8 表格生成函数(UDTF) 9 类型转换函数 10 数学函数 11 数学运算 12 逻辑运算 13…

python-mysql超简单银行转账

1首先先建数据库bank&#xff0c;数据结构表的名称为accoment&#xff1a; 2.python与mysql交互代码如下&#xff1a; # coding utf-8 # 1.导入模块 from pymysql import * import sys import pymysql# 2.接受命令行参数 if __name__ __main__:source_acctid 11target_acctid…

Linux Kernel ‘mp_get_count()’函数本地信息泄露漏洞

漏洞名称&#xff1a;Linux Kernel ‘mp_get_count()’函数本地信息泄露漏洞CNNVD编号&#xff1a;CNNVD-201311-054发布时间&#xff1a;2013-11-06更新时间&#xff1a;2013-11-06危害等级&#xff1a; 漏洞类型&#xff1a;信息泄露威胁类型&#xff1a;本地CVE编号&#x…

LeetCode 948. 令牌放置(贪心)

文章目录1. 题目2. 解题1. 题目 你的初始能量为 P&#xff0c;初始分数为 0&#xff0c;只有一包令牌。 令牌的值为 token[i]&#xff0c;每个令牌最多只能使用一次&#xff0c;可能的两种使用方法如下&#xff1a; 如果你至少有 token[i] 点能量&#xff0c;可以将令牌置为…

Python 中操作 MySQL 步骤

1.引入模块 在py文件中引入pymysql模块 from pymysql import *2.Connection 对象 用于建立与数据库的连接 创建对象&#xff1a;调用connect()方法 connconnect(参数列表)参数host&#xff1a;连接的mysql主机&#xff0c;如果本机是localhost参数port&#xff1a;连接的m…

nacos配置中心配置已经常见错误总结

&#x1f4bb;目录 前言1、基础架构2、依赖3、配置文件3.1、bolg-product配置文件3.1.1、application.yml配置文件3.1.2、bootstrap.yml配置文件3.1.3、nacos远程配置 3.2、bolg-system3.1.1、application.yml配置文件3.1.2、bootstrap.yml配置文件3.2.3、nacos远程配置 4、测试…

Hive解题思路

Hive解题思路 1 相关知识讲解 1.1 HQL语句的语法 sql语句的语法&#xff1a; select ..... from .... join ..... where .....group by ... having...order by|sort by|cluster by|distribute by .... &#xff08;1&#xff09;group by&#xff1a;按照某些字段的值进行…

tcl/tk demo

环境及版本说明: OSX10.9 tclsh -> tclsh8.5 wish -> wish8.5 查看本机运行环境: 1 which wish; 2 /usr/bin/wish 1 which tclsh; 2 /usr/bin/tclsh Demo功能说明: 用户登录窗口,输入用户名,密码.与文件中存储内容校验,如果相等,则提示"登录成功",否则提示&qu…

Hive高级操作

Hive高级操作 1 Hive的数据类型 1.1 原子数据类型 &#xff08;1&#xff09;Hive 是用 Java 开发的&#xff0c;Hive 里的基本数据类型和 java 的基本数据类型也是一一对应的&#xff0c; 除了 String 类型。 &#xff08;2&#xff09;有符号的整数类型&#xff1a;TINYIN…

05.序列模型 W2.自然语言处理与词嵌入(作业:词向量+Emoji表情生成)

文章目录作业1&#xff1a;1. 余弦相似度2. 单词类比3. 词向量纠偏3.1 消除对非性别词语的偏见3.2 性别词的均衡算法作业2&#xff1a;Emojify表情生成1. Baseline model: Emojifier-V11.1 数据集1.2 模型预览1.3 实现 Emojifier-V11.4 在训练集上测试2. Emojifier-V2: Using L…