Hadoop笔记

Hadoop自学笔记

通过Youtube视频自学点Hadoop,算是给自己技术储备。

Hadoop介绍

hadoop是批处理形式,storm和spark是刘处理形式。
Hadoop来源:是Google集群系统的开源实现

- GFS(google file system),MapReduce,BigTable 3 篇论文实现的。
-  Hadoop注意由HDFS(Hadoop Distriuted File system Hadoop分布式文件系统),Mapreduce和Hbase组成。

设计核心是HDFS和MapReduce,HDFS是来源于GFS。
HDFS是解决大数据存储问题的。理论说存储的数据量是没有限制的,PB级以上的。同时解决数据的稳定问题,不会丢失数据。

结构化的数据可以存储在关系型数据库中,但是对于譬如百度大型的公司,数据都是PB级的,存储的是非结构化的数据。Hadoop可以存储结构化或者非结构化的数据。

传统的关系型数据库的特点是单台的配置很高。如果数据量足够大的时候再增加另外一台数据库机器的时候,扩展很会很麻烦(同步问题方案,读写分离问题等)。使用Hadoop集群的价钱和单台的数据库机器价钱不会差很多,但是在整体的性能上Hadoop却比数据库服务更好。

上图中,红色的是必学的,属于Hadoop家族的成员。黑色的文字不属于Hadoop中的内容。Pig在目前使用的不多了。
使用的Hadoop的公司,百度阿里雅虎英特尔facebook亚马逊等。

Hadoop安装

hadoop的版本是多条线并行的开发的。
rbm是已经编译的,tar包是包含源码文档,同样已经编译的。

HDFS 介绍

HDFS是做存储用的。

HDFS优点:

可构建在廉价的机器上,甚至二手的台式机都可以使用。因为容错性很好,所以可以使用廉价的机器。就算是台式机挂了,硬盘坏了,也都不会影响数据的存储使用。
HDFS缺点:

  • 不适合要求毫秒级内反应的情景下。
  • 小文件或是大量的小文件不适合使用。小文件的数量多,导致元数据增加,元数据是加载到内存中,会大大的占用内存。所以就需对小文件进行压缩机制。将多个小文件压缩为一个文件。
  • 不适合修改。例如网盘的使用。

可靠性高: hdfs会将数据或者文件进行复制,存储多个副本到不同的机器中。 同时也加快了读取时的速度。

HDFS有三个节点:Name Node, DataNodes
元数据是除文件之外的数据,例如,文件名,文件大小等就是元数据。
文件的多少会影响元数据的大小。
NameNode节点中的元数据保存在内存中,也会在磁盘中保存一份。只是启动的时候会加载到内存中。工作中都是内存中读取数据的。
DataNodes存在磁盘中,所以DataNodes会大一些。

数据节点可以做数据的复制。

HDFS架构

上图架构是有问题的
Secondary NameNode是HDFS的第三个节点。【NameNode, DataNode】
实际HDFS Client的请求是直接发送到data node上。data node上的相同颜色表示同样的数据副本。数据副本会存储在多个机器上作为备份。
数据都是存在data node下的磁盘中的。副本越多丢失数据的可能性越小。这样的就不会丢失数据。
data node 中的矩形,就是存储数据的block。

  • block简称是夸,固定大小是64兆。可修改。一个夸只能存储一个文件的数据,即使文件没有达到64兆。
  • 夸只是逻辑结构,并不占用磁盘空间。并不是吧磁盘分隔为n个64兆空间。如果一个文件超过64兆,则存储在多个夸中。并且每个夸存储在不同的节点上,防止文件的丢失。默认每一个夸有三个副本。
  • 副本数可修改。副本的数量越多,磁盘利用率越低,因为存储的都是相同是数据。
  • 创建好的夸,大小是不能修改的。
  • 如果一个节点挂了,副本数会就小于指定的数量,当副本数小于你指定的副本的数时候,会自动的在空闲的节点上复制增加新的副本。这样依然保持足够的副本数防止数据丢失。
    一个典型的部署场景是集群中一台计算机运行一个Namenode实例,其他机器分别运行一个datanode实例。当然也可以一个机器运行多个datanode实例。集群中单一的namenode的设计大大简化了系统的架构。
    NameNode是所有的元数据的管理者,用户数据永远不经过NameNode。

    NameNode

    block保存在哪个datanode的信息,只会加载到内存中,不会存储到磁盘中,所以每次重启都会丢失一次,但是开机后,datanode又会上报一次,依旧正常。
    元数据会在内存中加载,同时磁盘中也会保存一份元数据(block保存在哪个datanode的信息不会保存到磁盘中)。如果元数据操作了,首先在edits中记录增删等操作,每隔段时间,将fsimages和操作日志合并,合并时候在namenode中进行元数据的增删等操作。
    Datanode中只存储的是数据而已,文件名字都会存储,文件名字等元数据只存在namenode中。

    SecondaryNameNode

    可以做一部分的元数据的备份,不是实时备份(不是热备,能找的是部分的存储数据。)。但并不是主要的作为备份使用。主要是帮助NN合并edits log。合并的时候会涉及大量的IO操作。namenode主要是接受客户端的请求,如果合并的io操作也是namenode完成,就会占用大量的cou资源。所以,将合并的部分交给secondarynamnenode完成。合并之后,得带新的fsimage,再传送给namenode,替换原来的fsimage。

合并过程:

  1. 到指定的间隔时间后,将fsimage和edit文件从namenode跨网络拷贝到secondarynamenode上。
  2. 同时,因为是将namenode上的edit文件拷贝了过来,但是namenode上还是会进行用户的读写操作。所以namenode上又会产生一个edits文件记录。新的edits记录的是在拷贝期间新的用户操作的日志。
  3. 在secondarynamenode上,会吧拷贝过来的edits文件和fsimage文件合并为一个新的fsimages文件。
  4. secondarynamenode会吧合并之后的fsimages文件推送给namenode,namenode将新的fsimages替换。
  5. 再到间隔时间后,重复上述的步骤。

同时产生一个fsimage,传送给namenode替换原来的fsimag,同是namenode上会产生一个新的edit日志文件,记录用户的请求操作。

DataNode

系统启动的时候,DataNode会向namenode汇报block的位置信息。
DataNode会定时向namenode发送心跳数据。

Block副本放置策略

解释:

  1. Rack指的是机架。
  2. 第二个副本选择的时候,会在不同的机架上,因为同一个机架的电源是相同的。
  3. 放置第三个副本的时候,为了保持速度,所以选择了放置在和第二个副本相同的地方。同一个机架会速度更快。
  4. 因为配置文件中会配置好服务器编号和机架对应的编号,所以会自动的将第二个副本放置对应的位置。

HDFS读写的流程

HDFS读的流程

  1. 客户端发送请求,使用open函数,请求到达distrbuted filesystemapi(蓝色的是api)。调用api的open 方法,发送请求到nameode。获得block中的文件位置信息。
  2. 将信息返回到客户端,再去经过新的一个api,fsdata inputstream【流】,通过这个流,并发去读各个block的信息。
  3. 因为存在多个副本,其实只要找到一个副本的位置即可。
  4. 读取完毕后关闭这个流。
  5. 在客户端统一的形成文件。因为datanode中的只是,被分隔的文件而已。
  6. 注意:一般只读取小的文件,因为,文件在客户端形成,吵到的文件会赵勇很大的硬盘空间。

HDFS写的流程

  1. 通过create方法,使用distributed filesystem,吧文件的名字大小,文件的拥有者等信息传递。首先请求namenode,收到传递过来的信息。
  2. 在namenode上会返回,吧文件切割多少个block,放置在哪里。因为datanode是会汇报所有的心跳数据。namenode是清楚所有的文件位置的。
  3. 返回给客户端的信息,经由FSData Outputstrem api
    吧数写到其中的一个datanode上。
  4. 完成第一个副本后,后面的副本是由datanode开启一个线程,按照副本放置的规则放置在其他的datanode上。完成第二个副本的复制。而不是在经由客户端了。
  5. 完成所有的后返回个i客户端一个信息。
  6. 再汇报给namenode。
  7. 再返回给namenode汇报的结果给客户端。

HDFS文件权限

文件上传的用户名就是文件的拥有者。注意:文件上传的用户名和linux用户名是不一致的。通过用户名识别,而不使用密码。

HDFS安全模式

因为刚启动的时候,需要datanode给namenode汇报所有的文件位置信息,所以会有的时间段,这时间段是安全模式期间,在此期间读取数据的时候会报错。即为初始化的阶段。
要么等,要么强制离开安全模式,但是强制会导致数据丢失。

HDFS安装

单节点安装 单节点模式也是本地模式(企业根本不会用)
集群安装 cluster
伪分布式模式(测试环境可能会用),全分布式模式。

设置ssh免密码登陆

格式化命令只执行一次即可,会产生一些初始的数据,只格式化namenode。

所有的节点都在一个机器上,叫做伪分布式。
不同的节点放置在不同的机器上,就是完全分布式。
区别就是节点在不在同一个机器上。
虚拟机建立快照,可以还原
ln -sf 添加软链
配置:
首先配置的是namenode读写的入口。
core-site配置namenode
默认的工作目录是在linux 下tmp目录下,重启linux后tmp会清空。所以还需要配置一个新的属性。

hadoop.tmp.dir 是hadoop的临时目录,但是hadoop.name.dir是以此为基础的,所以需要修改hadoop.tmp.dir目录所在的位置。

添加的目录不用创建,格式化的时候会自动创建