2019年5月13日
16:00
常用指令
命令提示符
[root@localhost ~]#/$
root:表示的用户名(最高权限用户)
localhost:当前虚拟机的主机名
~:表示当前所在的目录(系统目录)
#/$:表示的不同的权限 #:表示的是超级管理员的权限(最高权限---表示在当前只代的登录用户是root) $:表示的是普通用户
超级管理员用户:可以对当前虚拟机里的所有目录文件可以进行增删改查操作
普通用户:只能对当前虚拟机里的所有目录文件进行只读操作(不支持对文件目录的增删改操作)
目录相关的操作
pwd:表示的是查看当前所在的目录的路径
mkdir:表示的在当前目录下创建新的目录
touch:表示在当前目录下创建新的文件
cd:在当前目录下 进行目录的切换
路径问题
绝对路径:C:\Users\lenovo\Desktop\mfc110udll----全路径
在linux里绝对路径是以/开头的路径
相对路径:相对当前文件/目录的路径
C:\Users\lenovo\Desktop\a\image.jpg-----\a\image.jpg
在linux里如何表现相对路径??--以.开头的路径叫做相对路径
..:第一个.表示的是当前目录即home目录
[root@localhost home]# cd ..
第二个.表示的是当前目录/路径的父路径/父目录---返回上一级
-:表示的也是当前目录的前一个目录(返回操作当前目录之前操作的那一级目录)类似于遥控器的返回键
ls:查看当前目录下的详细信息,如下图所示
ll:ls -l---查看当前目录下的详细信息(以详细格式列表的形式存在)如下图所示:
ls -a:ls -all---与ls查看当前目录所表示的文件格式相同---也是查看当前目录的详细信息
唯一不同的点就是包含隐藏文件(以.为表现形式的文件或者目录就是隐藏文件)eg: .aaa.txt.swp/.swap为隐藏文件使用ls -a指令查看使用rm -rf删除
文件复制的指令
cp:
1.文件/目录复制 2.改名
文件复制格式:cp 文件名 目标目录
目录复制格式:cp -r 目录名 目标目录
-r:递归操作,逐层递进--ccccc---c.txt
先复制c.txt---又回到ccccc----又会复制ccccc---找到目标目录----将c.txt、ccccc进行存放
2.cp改名操作
操作格式:cp 要修改的文件名 修改之后的文件名
注意:先复制源文件efgh.txt,复制成功之后将复制产生的文件改名为abcd.txt,最后讲abcd.txt文件保存到当前目录下
文件/目录的删除指令(慎用)
在操作linux系统的时候,能不用就不用(系统里面的目录或者文件宁可多不能少)
rm
删除文件/目录的格式:rm -rf(-r -f) 文件/目录名
-r:递归操作(逐层向外删除)
-f:直接强制删除---没有提示信息---直接删除
文件/目录的移动指令
mv:1.文件/目录的移动 2.改名(副业)
注意:改名操作建议使用cp指令
操作格式:mv 文件/目录名 目标目录
mv改名如何进行操作??
操作格式:mv 要修改的文件名 修改之后的文件名
注意:mv改名的套路是直接在源文件上进行修改
文本编辑指令
vim
一般模式、编辑模式、命令模式
一般模式:只有只读操作
1、绿色的光标指示
2、就蓝色波浪线~(表示当前文件内容的编辑主体位置)
3、左下角有一行文字:出现当前文件的文件名、当前光标指示的位置、当前文件内容的大小(所占字节数)
编辑模式:
在一般模式下敲键盘小写字母i就会切换到编辑模式,操作完当前文件之后按键盘左上角esc键退出编辑模式
一般模式与编辑模式可以进行相互的转换
Vim/vi
Vim/vi原不是linux原生指令-----它是第三方厂家开发的指令
vi指令操作profile
vim操作profile
蓝色位置指代注释
彩色位置指代当前文件的配置内容
注意:建议大家在进行文件编辑的时候,使用vim指令
软件包管理(压缩包)
Tar
操作格式:tar -xvf 软件包名称
选项:
-c 建立打包文件
-f 指定打包文件名称,tar命令必须要有该选项
-v 显示打包过程
-x 解包
-z 表示解压方式为gzip
ssh远程登录---免密登录
ssh是最常用的Linux远程登录工具,一般设置免密码登录(在集群管理等场景会经常使用到。采用RSA非对称加密算法,由公钥和私钥组成一对密钥,通过公钥加密的信息只有私钥才能解密。
MD5加密算法---对称加密----公钥加密使用公钥解密
使用ssh配置免密登录的加密算法----非对称加密---公钥加密私钥解密
总结:
1.浏览器使用ssh免密登录产生一对密钥对:公钥a 私钥a
2.浏览器向服务器发送登录请求将公钥a发送给服务器
3.服务器接收到公钥a最后利用公钥a将密码进行加密操作,产生一个随机字符串
4.服务器会将加密产生的字符串返回给浏览器(客户端)
5.浏览器接收到服务器发送来的字符串利用自身的私钥a进行解密操作得到密码
6.浏览器将解密之后产生的密码发送给服务器
7.服务器会将接收到解密之后的密码与未加密之前的密码进行比较,如果比较没有问题就ssh免密登录配置成功,反之失败
Day02_Hadoop
2019年5月5日
21:42
Hadoop概述
Hadoop创始人
Doug Cutting,斯坦福大学毕业的。
Cutting是Lucence,nutch,hadoop的创始人。
Hadoop起源
2004年,开发一款搜索引擎,nutch。nutch基于Lucence实现的搜索引擎,能够从互联网上抓取网页数据。抓取来的海量数据的存储问题。但是,这些海量数据都是非结构化数据,不能存在关系型数据库里。如果连数据的存储和管理都解决不了化,就谈不上后续为用户提供搜索服务,包括通过算法去优化检索速度。
正好那时候,Google发表了两篇论文《Google File System》 《Google MapReduce》
《Google File System》简称GFS,是Google公司用于解决海量数据存储的文件系统。
《Google MapReduce》简称MapReduce,是Google的计算框架,基于GFS。
2006年cutting根据《Google File System》设计了Nutch的HDFS,hadoop distributed file system。
Hadoop最开始是nutch的子项目,目的是解决nutch的海量数据存储问题。在nutch 0.8版本之后,Hadoop独立处理,成为一个独立的项目。后来,又根据《Google MapReduce》设计了基于HDFS的uMapRedce计算框架。
2006年之后,cutting带着Hadoop去了雅虎,当时有100多人的团队共同帮cutting完善hadoop。后来yahoo把Hadoop贡献了Apache。所以,现在Hadoop是Apache的顶级项目
大数据的特点
1.TB,PB级别的数据
2.非结构化数据
3.快速增长,每天都会有大量数据产生。
大数据带来的变化
1.大数据没有产生之前,数据分析,主要要依靠比较精良的算法。算法越严密,结果越精确。但是有了大数据之后,当数据量达到一定规模的时候,数据本身就可以说话了。所以就不需要太依靠算法去分析结果。
2.当数据量达到一定程度后,不需要考虑因果关系,就能得到结果。
所以,大数据是一种新的生产力。
Hadoop三种搭建模式
单机模式:只支持MapReduce,不支持HDFS。这种模式一般用于调试MapReduce任务用的。
伪分布模式:这种模式即支持MR,也支持HDFS,用多个线程模拟多台真实机器,即模拟真实的分布式环境。
完全分布式:用多个机器或多台虚拟机去搭建集群
2019年5月5日
23:08
HDFS技术细节
HDFS的主要原理,是将数据进行切块后进行复制并分布式存储在集群的多个节点中,从而实现了海量数据分布式存储,并通过副本实现了可靠性保证。
其中切出的块称为Block。
负责存放Block的节点称之为DataNode节点。
负责存放元数据的节点称之为NameNode节点。
另外还有一个独立进程称作SecondaryNameNode负责帮助NameNode进行元数据的合并操作
1.Block
HDFS中存储的基本单位。
当文件被存储到hdfs的过程中,会先将文件按照指定大小来切块即block,复制出指定数量的副本(默认是3个),分布式存储在集群中
Block 默认的大小为128(早期版本中为64)M。
例如,一个256MB文件,共有256/128=2个Block.
一个258MB文件,共有258/128 = 2 余下2MB,则余下的2MB会独占一个Block大小为2MB,则且分出 两个128MB的Block和一个2MB的Block
一个1MB文件,则单独占用一个Block,这个Block为1MB大小。
3.NameNode
NameNode维护着HDFS中的元数据信息,包括文件信息 目录结构信息 副本数量信息 文件和Block之间关系的信息、Block和DataNode之间的关系信息,数据格式参照如下:
FileName replicas block-Ids id2host
例如: /test/a.log,3,{b1,b2},[{b1:[h0,h1,h3]},{b2:[h0,h2,h4]}]
NameNode中的元数据信息存储在内存/文件中,内存中为实时信息,文件中为数据镜像作为持久化存储使用。
其中内存中的信息包括 文件信息 目录结构信息 副本数量信息 文件和Block之间关系的信息、Block和DataNode之间的关系信息
而文件中的信息包括文件信息 目录结构信息 副本数量信息 文件和Block之间关系的信息
可以发现文件中的元数据比起内存中缺失了 blockid和datanode之间的对应关系,这是因为,hdfs集群经常发生变动,datanode变多或变少都是很正常的,因此这些信息都是临时在内存中组织的,而不会存储在磁盘镜像文件中
文件包括:
fsimage 元数据镜像文件。存储某NameNode元数据信息,并不是实时同步内存中的数据。
edits 操作日志文件
fstime 保存最近一次checkpoit的时间
当有写请求时,NameNode会首先写editlog到磁盘edits文件中,成功后才会修改内存,并向客户端返回
所以,fsimage中的数据并不是实时的数据,而是在达到条件时要和edits文件合并,合并过程需要SNN参与
**之所以不直接改fsimage而是要在edits中记录日志,是因为记录日志是一种连续读写操作,比直接改fsimage的随机读写操作效率要高的多。
4.SecondaryNameNode
SecondaryNameNode并不是NameNode的热备份,而是协助者帮助NameNode进行元数据的合并,
从另外的角度来看可以提供一定的备份功能,但并不是热备,只在极端情况下可能用来恢复元数据,但是可能丢失数据。
何时出发数据合并?:
根据配置文件设置的时间间隔:fs.checkpoint.period 默认3600秒
根据配置文件设置的edits log大小 fs.checkpoint.size 默认64MB
合并过程(参看文档图):
达到条件后 snn会将nn中的fsimage和edits文件拷贝过来,同时nn中会创建一个新的edits.new文件,新的读写请求会写入到这个edits.new中,在snn中将拷贝过来的fsimage和edits合并为一个新的fsimage,最后snn将合并完成的fsimage文件拷贝回nn中替换之前的fsimage,nn再将edtis.new改为edits
由于NameNode实时数据都在内存中,此处的合并指的是磁盘中的持久化的数据的处理。
判断:ssn可以对元数据做一定程度的备份,但是不是热备,对不对?
思考:什么情况下可能造成NameNode元数据信息丢失?
snn并不是nn的热备,但是能保存大部分备份数据。原因就在于edits.new中的数据丢失了就找不回来了
**通常NameNode和SNN要放置到不同机器中以此提升性能,并提供一定的元数据安全性。
2.DataNode
数据以Block的形式存放在DataNode中
DataNode节点会不断向NameNode节点发送心跳报告保持与其联系(3秒一次)
在心跳报告中,向NameNode报告信息,从心跳响应中接受NameNode的指令,执行对块的复制 移动 删除等操作。
NameNode如果10分钟都没收到dn的心跳,则认为该DataNode已经lost,并copy其上的block到其他dn
5.Block副本放置策略:
第一个副本:放置在上传文件的DN,如果是集群就外提交,就随机选择一台磁盘不太满,cpu不太忙的节点
第二个副本:放置在第一个副本不同机架的节点上
第三个副本:放置在与第二个副本相同机架的节点上
更多副本:随机节点
**机架感知策略(参看文章)
六、HDFS执行流程(参看文档图)
1.HDFS读流程
使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;
NameNode会检验当前文件是否存在 以及当前客户端是否有权限读取该文件
如果都没有问题,Namenode会视情况返回文件的部分或者全部block列表,对于每个block,Namenode都会返回有该block副本的DataNode地址;
客户端开发库Client会选取离客户端最接近(并不是物理上的最近,而是延迟最低负载最低)的DataNode来读取block;如果客户端本身就是DataNode,那么将从本地直接获取数据.
读取完当前block的数据后,关闭与当前的DataNode连接,并为读取下一个block寻找最佳的DataNode;
当读完列表的block后,且文件读取还没有结束,客户端开发库会继续向Namenode获取下一批的block列表。
读取完一个block都会进行checksum验证,如果读取datanode时出现错误,客户端会通知Namenode,然后再从下一个拥有该block拷贝的datanode继续读。
当文件最后一个块也都读取完成后,datanode会连接namenode告知关闭文件。
2.HDFS的写流程
使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;
Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;
当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并在内部以数据队列"data queue"的形式管理这些packets,并向Namenode申请新的blocks。,获取用来存储replicas的合适的datanodes列表, 列表的大小根据在Namenode中对replication的设置而定
开始以pipeline(管道)的形式将packet写入所 有的replicas中。客户端把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此 pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。
最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着"ack queue",成功收到datanode返回的ack packet后会从"ack queue"移除相应的packet。
如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除, 剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持 replicas设定的数量。
当所有的packges都成功的上传后,客户端通知NameNoe文件上传完成,NameNode将该文件置为可用状态,并关闭该文件
3.HDFS的删除流程
客户端发起请求连接NameNode表示要删除文件
NameNode检查文件是否存在 及 是否有权限删除文件.
NameNode执行元数据的删除 - 将该元数据置为已删除状态。
向客户端表示文件删除成功.
当保存着这些数据块的DataNode节点向NameNode节点发送心跳时,在心跳响应中,NameNode节点会向DataNode发出指令,要求删除这些block。
DataNode收到指令后删除对应的Block
所以在执行完delete方法后的一段时间内,数据块才能被真正的删除掉。
当该文件对应的所有block及其副本都被删除后,NameNode中将之前标记为已删除的元数据删除。
4.HDFS的启动流程
在HDFS启动时,NameNode先合并fsImage和edits文件,生成新的fsimage和空的edits文件,
这个过程是NameNode自己进行的
然后再将fsimage中的数据恢复到内存中,
但此时内存中的元数据并不够,还差block和datanode的映射关系,
这个信息在fsimage中是不存在的,需要临时在内存中组织出来。
此时NameNode等待DataNode的连接,
DataNode在启动时会向NameNode发送心跳报告,其中携带自己具有的Block的编号信息,
NameNode基于这些信息,在内存中组织元数据信息。
直到NameNode达到最小启动条件 -- 每个Block都至少有了一个副本被找到 -- 后,进行必要的副本的复制和删除,
之后开始对外提供服务。整个这个过程中,HDFS无法正常工作,称之为处在安全模式中。
**安全模式
在启动HDFS时,会立即进入安全模式,此时不能操作hdfs中的文件,只能查看目录文件名等,读写操作都不能进行。
在HDFS正常运行过程中,如果因为意外情况,造成有block找不到任何副本,则HDFS进入安全模式。
org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Name node is in safe mode
安全模式其实是HDFS对元数据的一种保护机制,防止意外的操作损坏元数据。
当遇到安全模式,最简单的办法就是等一会。
如果很长时间都无法退出安全模式,则应检查进入安全模式的原因,找到问题的原因解决,则hadoop会自动退出安全模式。
如果非要强制退出安全模式,可以使用如下命令,但是要慎用,一不小心损坏了元数据,hdsf中的数据就都无法使用了:
hadoop dfsadmin -safemode leave
七、java接口方式操作HDFS
//导入jar
hadoop/share/hadoop/common/*.jar
hadoop/share/hadoop/common/lib/*.jar
hadoop/share/hadoop/hdfs/*.jar
//--下载
FileSystem fs = FileSystem.get(new URI("hdfs://xxxx:9000"),new Configuration());
InputStream in = fs.open(new Path("/xxx"));//HDFS路径
OutputStream out = ..
IOUtils.copyBytes(in,out,buffersize,close);
//--上传
InputStream in = ..
FileSystem fs = FileSystem.get(new URI("hdfs://xxxx:9000")new Configuration());
OutputStream out = fs.create(new Path("..."));//hdfs路径
IOUtils.copyBytes(in,out,buffersize,close);
#问题:Permission Denied -- 权限错误
FileSystem fs = FileSystem.get(new URI("hdfs://xxxx:9000")new Configuration(),"root");
//--删除文件、文件夹(如果要删除的文件夹中有内容,必须选择递归删除)
boolean fs.delete(new Path("目标hdfs路径"),是否递归删除);
//--创建文件夹
boolean fs.mkdirs(new Path(".."));
八、HDFS的优缺点
HDFS优点
支持超大文件
支持超大文件。超大文件在这里指的是几百M,几百GB,甚至几TB大小的文件。一般来说hadoop的文件系统会存储TB级别或者PB级别的数据。所以在企业的应用中,数据节点有可能有上千个。(有次和一个亚信的一个工程师聊天说到这个集群的问题,说他们光一个hadoop集群就2000多台机器)
检测和快速应对硬件故障(但是他们的故障率是万分之一,有故障很正常)---举例子谷歌换硬盘(那是因为在咱们集群集群中是不是有复制副本的策略挂掉几台机器是没有问题不受影响的)
在集群的环境中,硬件故障是常见的问题。因为有上千台服务器连接在一起,这样会导致高故障率。因此故障检测和自动恢复是hdfs文件系统的一个设计目标。
流式数据访问
Hdfs的数据处理规模比较大,应用一次需要访问大量的数据,同时这些应用一般都是批量处理,而不是用户交互式处理。应用程序能以流的形式访问数据集。主要的是数据的吞吐量,而不是访问速度。
简化的一致性模型(那这大家是不是经过操作也感受到了虽然是分布式原理但是操作起来和操作一个单机的文件系统没什么区别---整体来说很简单)
大部分hdfs操作文件时,需要一次写入,多次读取。在hdfs中,一个文件一旦经过创建、写入、关闭后,一般就不需要修改了。这样简单的一致性模型,有利于提高吞吐量。
高容错性
数据自动保存多个副本,副本丢失后自动恢复
可构建在廉价机器上(那同学们这不光是hdfs的意义还是整个分布式文件系统的意义所在----那这就是为什么咱们要提分布式文件系统,那当数据量特别大的时候是不是一台机器处理能力有限 花更多的钱买更好的机器(你花的钱和你性能上的提升比不是成正比的---那比如说同学们如果你买2000的笔记本是不是和5000的性能就差很多但是5000和8000的差距就没有那么明显,(那越追求改性能是不是对于机器的单价就越高)其实盲目追求高价并不是最优选择,拿你们说单机模式真的处理不了吗,有能力把天河二号买下来那是不是要花很多钱并且有钱都不一定买的到)(在举一个阿里巴巴换硬盘的例子)这个是不合适的,那我买很多便宜的机器但是我把他组合起来使用是不是效率就会提高很多---那大家记住任何一个技术能流行起来要么是能赚钱要么就是能省钱---就说白了就是钱的问题----那如果是高性能的单机的话性能不够还得再换是不是成本很高,那廉价机器性能不够就加过剩就卖吧(大家不要以为这个机器买了还有卖的---扯点云计算弹性扩容(阿里云,那大家你们就以为每天阿里是几千台机器为大家服务吗不是的。。。。。)有一个技术叫docker))
构建在廉价机器上可以轻松的通过扩展机器数量来近乎线性的提高集群存储能力
HDFS缺点
低延迟数据访问(做不到低延迟,一般来说低延迟就是毫秒级别比如咱们用的mysql----基本在秒级别(这和他的执行原理有关系的)低延迟不是他的重点重点是他的高吞吐(就是说有可能开始处理数据较慢但是只要开始数据的吞吐量就很高)----举例子(铲子(延迟低)和挖掘机(高吞吐)的例子)---举一个和女朋友吃饭的例子)()
低延迟数据。如和用户进行交互的应用,需要数据在毫秒或秒的范围内得到响应。由于hadoop针对高数据吞吐量做了优化,牺牲了获取数据的延迟,所以对于低延迟来说,不适合用hadoop来做。
大量的小文件
Hdfs支持超大的文件,是通过数据分布在数据节点,数据的元数据保存在名字节点上。名字节点的内存大小,决定了hdfs文件系统可保存的文件数量。虽然现在的系统内存都比较大,但大量的小文件还是会影响名字节点的性能。(那是不是咱们出来了文件数据的时候是会出现小文件的那出现这个小文件就会在nn里面记录元数据---据统计在nn里一个元数据所占的字节是100字节---那文件才多大但是在nn里是不是占据了大量的空间--本身nn是很忙的,并且元数据是不是存到内存里的是不是元数据过多就把内存吃没了,降低性能严重了会出现挂机的现象,那出现了问题游客可能咱们还没有存1G 的数据但是全身是小文件主要的问题不是dn而是nn)
多用户写入文件、修改文件
Hdfs的文件只能有一次写入,不支持修改和追加写入(2.0版本支持追加),也不支持修改。只有这样数据的吞吐量才能大。(不支持,只能一次写入不支持行级别的增删改但是但是2.0之后允许追加,那这个追加和杭级别有什么区别是不是追加是在屁股后面添加顶多就是在来一个block吧,同时不支持多用户,就是我在着进行读写操作再来一个人操作不允许啊)
不支持超强的事务(从他的结构上就没有过多对其进行强调)
没有像关系型数据库那样,对事务有强有力的支持。----有点好好主要是他的缺点(面试的会经常问到)
好这就是咱们hdfs的优缺点,还是那句话整个hdfs全部都是重点大家课下一定要在整理一下。