记录Hadoop学习---HDFS

一、Hadoop简介:

1、概念:

   一个开源(免费)、高可靠(数据有备份,如果数据丢失,Hadoop可以自动恢复)、可扩展(灵活性很高,可以随时添加服务节点)的分布式(多台服务器并行处理任务)计算框架。

 

2、解决的问题:

   * 海量数据的存储--HDFS

   * 海量数据的分析--MapReduce

   * 分布式资源调度--Yarn

 

3、产生背景:

   受Google三篇论文启发(GFS,MapReduce,BigTable)。

 

4、特点:

   * 扩容能力:能可靠的存储和处理千兆字节(PB)数据;

   * 成本低:可以通过普通机器组成的服务器群来分发以及处理数据,这些服务器群总计可达数千个节点。

   * 高效率:通过分发数据,Hadoop可以在数据所在的节点上并行的处理它们,这使得速度非常快。

   * 可靠性:hadoop能自动维护数据的多分副本,并且在任务失败后能自动重新部署。

 

5、应用场景:

   * 日志分析

   * 基于海量数据的在线应用

   * 推荐系统

   * 计算广告

   * 复杂算法

   * 网盘

   * 搜索引擎

   * 。。。。。。

6、

7、核心组件:

   * Hadoop Common: 为其他Hadoop模块提供基础设施;

   * Hadoop HDFS:一个高可靠、高吞吐量的分布式文件系统;

   * Hadoop MapReduce:一个分布式的离线并行计算框架;

   * Hadoop YARN:一个新的MapReduce框架,任务调度与资源管理。

 

8、分布式(并行处理任务)离线(高延迟)计算框架--MapReduce

   * Map任务处理:

       ① 读取输入文件内容,解析成key、value对;

       ② 重写map方法,编写业务逻辑输出新的key、value对;

       ③ 对输出的key、value对进行分区(Partitioner类);

       ④ 对数据按照key进行排序、分组,相同key的value放到一个集合中。

   * Reduce任务处理:

       ① 对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点;

       ② 对多个map任务的输出进行合并、排序,写reduce函数自己的逻辑,对输入的key、vlaue对处理,转换成新的key、value对输出;

       ③ 把reduce的输出保存到文件中。

 

二、Hadoop前置环境安装

1、Linux环境:

   * VMWare虚拟机、CentOS、JDK

 

2、配置虚拟机:

   * 关闭防火墙:service itables stop   (这样关闭在下次重启虚拟机时无效,需要永久关闭 chkconfig iptables off);

   * 禁用selinux:vim /etc/sysconfig/selinux   ,把“SELINUX”改为“disabled”;

 

3、修改主机名:

   * 查看当前主机名:hostname

   * 修改主机名:hostname newName(虚拟机重启,主机名会还原),修改配置文件永久修改主机名 vim /etc/sysconfig/network   , 把“HOSTNAME”改为“新的主机名”;

 

4、配置映射关系,把ip地址指向新的主机名:

   *  vim /etc/hosts   加入一行 172.16.11.178      hadoop  保存,reboot 重启虚拟机;

 

5、配置ssh免密码登录:

   * 使用ssh远程登录本机: ssh 172.16.11.178    yes   输入密码  ,每次远程都需要输入密码;

   * 首先生成密钥:ssh-keygen -t rsa  4次回车  ;

   * 复制密钥到本机:ssh-copy-id 172.16.11.178    输入密码,确定,完成,再次使用ssh 172.16.11.178 就不需要输入密码了。

 

6、配置JAVA环境:

    * cd /home

          mkdir tools  (存放工具安装包)

          mkdir softwares   (存放安装的软件)

          mkdir datas   (存放测试用的数据)

         * 查看系统是否自动安装jkd :rpm -qa|grep jdk

         * 查看系统是否安装java :rpm -qa|grep java

         * 安装上传工具 lrzsz:yum install -y lrzsz 

         * 上传jdk : rz   选择jdk;

         * 解压jdk到sorfwares目录下: tar -zxf jdk-x-x-x.tar.gz -C /home/softwares/

         * 配置环境变量:进入jdk目录下 cd /home/softwares/jdk-x-x/ ,  查看安装目录 pwd   ,

                   修改配置文件:vim /etc/profile, 

                   加入 export JAVA_HOME=/home/softwares/jdk-x-x

                        export PATH=$PATH:$JAVA_HOME/bin

                   刷新配置文件:source /etc/profile

                   输入 java -version查看jdk是否安装成功。

 

7、创建普通用户:

         * adduser hadoop01

          输入密码  admin

          再次输入  admin  成功

          切换用户 su hadoop01

          查看当前用户  whoami

          配置权限 切换到root     su  输入密码

     添加文件写权限  chmod u+x /etc/sudoers

          编辑文件  vim /etc/sudoers

          加入 hadoop01     ALL=(ALL)                   ALL

          至此,hadoop01拥有了sudo权限。

 

三、Hadoop伪分布式安装

1、Hadoop运行模式:

         * 本地模式:所有Hadoop的守护进程运行在一个jvm中;

         * 伪分布式:所有Hadoop的守护进程各自运行在自己的jvm中;(适合开发学习)

         * 集群模式:多台机器来搭建分布式集群,每个进程运行在独立的jvm中,并对Namenode和ResourceMananger做Ha配置(适合企业使用)

 

2、安装文档:

http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/SingleCluster.html

 

3、下载Hadoop:

         官方都是32位的,需要下载源码自己编译成64位的。

         hadoop-x-x-src.tar.gz 源码包,解压。

         编译需要的工具:

         上传,解压到softwares;

         配置maven、findbugs的环境变量(同java环境变量)mvn -v  findbugs -version

         安装protobuf,通过make来安装:

                   安装make和系统依赖:

                            yum -y install autoconf automake libtool cmake ncurses-devel openssl-devel lzo-devel zlib-devel gcc gcc-c++

                   cd /home/softwares/protobuf-2.5.0/

                   ./configure

                   make install

         编译成64位hadoop:

                   cd /home/softwares/hadoop-x-x-src/

                   mvn package -Pdist,native,docs -DskipTests -Dtar

         编译后的文件位于maven目录里

 

4、设置hadoop

         * 进入hadoop安装目录 cd /home/softwares/hadoop-x-x/etc/hadoop/

         * vim hadoop-env.sh 设置java环境变量  echo $JAVA_HOME

         * 把“export JAVA_HOME=”改为“/home/softwares/jdk-x-x”

         * vim core-site.xml  加入:

                   <property>

                     <name>fs.defaultFS</name>

                     <value>hdfs://hadoop:8020</value>

                </property>

                   创建/home/softwares/hadoop-2.7.6/data/tmp这个目录

                   <property>

                    <name>hadoop.tmp.dir</name>

                    <value>/home/softwares/hadoop-2.7.6/data/tmp</value>

               </property>

         fs.defaultFS:指定Namenode的通信地址8020,

         hadoop.tmp.dir:指定运行中产生数据的存放目录/data/tmp。

         *vim hdfs-site.xml  加入:

                   <property>

                   <name>dfs.replication</name>

                   <value>1</value>

             </property>

             <property>

                   <name>dfs.permissions.enabled</name>

                   <value>false</value>

             </property>

         * 格式化hdfs文件系统:

                   cd /home/softwares/hadoop-x-x

                   bin/hadoop namenode -format

                   格式化成功

                   启动文件系统:sbin/start-dfs.sh   ,  jps 查看进程

         * HDFS系统监控界面:

                   http://172.16.11.178:50070

         * 配置yarn:

                   重命名mapred-site.xml.template为mapred-site.xml

                   vim mapred-site.xml  加入:

                            <property>

                           <name>mapreduce.framework.name</name>

                         <value>yarn</value>

                       </property>

                   vim yarn-site.xml  加入:

                            <property>

                         <name>yarn.nodemanager.aux-services</name>

                         <value>mapreduce_shuffle</value>

                       </property>

                   启动yarn :sbin/start-yarn.sh

                   yarn监控界面:172.16.11.178:8088

                   cd /home/data/

                   创建words文件:touch words

                   写入数据:vim words

                   查看words内容:more words

                   做词频统计:上传words到hdfs

                            cd /home/softwares/hadoop-x-x/

                            bin/hadoop fs -put /home/data/words /words

                            hdfs系统界面里会增加一个words文件。

                   修改Windows的hosts文件:

                            C:\Windows\System32\drivers\etc\目录下hosts文件加入:

                            172.16.11.178    hadoop

                   可以在hdfs系统界面下载上传的文件words了。

                   运行词频统计的demo:

                            bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /words /out

                   此时yarn界面有一个任务。

                   查看运行结果:

                            bin/hadoop fs -ls /

                            bin/hadoop fs -ls /out

                   此时会有一个文件:/out/part-r-00000记录了运行结果,查看文件

                            bin/hadoop fs -cat /out/part-r-00000

 

四、HDFS架构详解

1、分布式文件系统

         * 物理层存储的分布式:用多台服务器共同存储;

         * 基于客户机/服务器模式:通常一个分布式文件系统提供多个供用户访问的服务器

         * 通常情况下都会提供备份和容错的功能;

         * 通常情况下都是基于操作系统的本地文件系统:

                   ext3,ext4

                   NTFS

2、分布式文件系统的优点:

         * 传统文件系统最大的问题是容量和吞吐量的限制;

         * 多用户多应用的并行读写是分布式文件系统产生的根源

         * 扩充存储空间的成本低廉,可以使用普通的pc机代替

         * 可提供冗余备份;

         * 为分布式计算提供基础服务

3、基本概念:

         * 是一个分布式文件系统;

         * 是使用java实现的、分布式的、可横向扩展的文件系统

         * 是Hadoop的核心组件

         * 基于*nix

         * 具有很高的容错性,提供了高吞吐量的数据访问

         * 适用于一次写入,多次查询的情况,不支持并发写的情况,小文件不合适

4、前提和设计目标:

         * 硬件错误是常态

                   错误检测和快速自动的恢复是HDFS最核心的架构目标

         * 存储超大文件

                   HDFS适合大量存储,总存储量可达到PB、EB级

                   HDFS适合大文件,单个文件一般在百MB级以上

                   文件数目适中

         * 流式数据访问

                   HDFS适合用于批量处理,不适合随机定位访问

         * 简单一致性模型

                   HDFS的应用程序需要对文件实行一次性写、多次读的访问模式

                   不能修改已写入的数据

         * 程序采用“数据就近”原则分配节点执行

                   移动计算比移动数据的代价要低

         * 运行在普通廉价的服务器上

                   HDFS设计理念之一就是让它能运行在普通的硬件指上,即便硬件出现故障,也可以通过容错策略来保证数据的高可用

        

5、局限性:

         * 不适合低延迟数据访问

                   高吞吐量可能要求以高延迟为代价

                   HBase可以弥补不足

         * 无法高效存储大量小文件

                   文件数量大小的限制由namenode决定

         * 不支持多用户写入及任意修改文件

 

6、基本概念--块

         * HDFS基本存储单位是块,传统的块存储介质中,块是读写的最小数据单位(扇区)

         * HDFS也使用块的概念,Hadoop1.x版本默认为64M,Hadoop2.x版本默认为128M

                   可自行在hdfs-site.xml文件中配置:

                   1.x版本修改:dfs.block.size , 2.x版本修改:dfs.blocksize

                   默认单位为比特,兆与比特的计算方法:128*1024*1024

                   每一个块有一个自己的全局ID

         * HDFS将一个文件分为一个或数个块来存储

                   每个块是独立的存储单位

                   以块为单位在集群服务器上分配存储

7、块--带来的好处:

         * 一个文件的大小可以大于网络中任意一个磁盘的容量

         * 简化了存储子系统的设计,简化了存储管理,消除了对元数据的顾虑

         * 适合用于数据备份,提高了容错能力和可用性

8、块的冗余备份:

         * 每个块在集群上会存储多份副本,默认三份,可以动态修改

         * 简化了存储子系统的设计,简化了存储管理,消除了对元数据的顾虑

         * 适合用于数据备份,提高了容错能力和可用性

9、体系架构图:

 

10、HDFS元数据:

         * 文件系统目录树信息

                   文件名、目录名

                   文件和目录的从属关系

                   文件和目录的大小,创建及最后访问时间

                   文件和目录的权限

         * 文件和块的对应关系

                   文件由哪些块组成

 

11、NameNode职责详解:

         * 管理文件系统的命名空间

         * 记录每个文件数据块在各个DataNode上的位置和副本信息

         * 记录客户端对文件的方位

         * 记录命名空间内的改动或空间本身属性的改动

         * NameNode使用事务日志记录HDFS元数据的变化。使用映像文件存储文件系统的命名空间,包括文件映射、文件属性等

         * 通过检查点(CheckPoint)更新影像文件,Secondary NameNode辅助完成处理

 

12、DataNode职责详解:

         * 负责所在物理节点的存储管理

         * 一次写入,多次读取,不支持修改

         * 文件由数据块组成,典型的块大小是64和128M

         * 数据块尽量散布到各个节点

 

13、HDFS读取文件流程:

        

 

14、HDFS写文件流程:

15、HDFS可靠性

         * 冗余副本策略

                   可以在hdfs-site.xml中设置复制因子指定副本数量

                   所有数据块都有副本

                   DataNode启动时,遍历本地文件系统,产生一份hdfs数据块和本地文件的对应关系列表汇报给namenode

         * 机架策略

                   集群一般放在不同的机架上,机架间的带宽要比机架内的带宽小

                   默认在一个机架内存放2个副本,在另外一个机架内存放1个副本,这样可以防止机架失效时丢失数据,也可以提高宽带利用率

         * 心跳机制

                   Namenode周期性从datanode接收心跳信号和块报告

                   Namenode根据块报告验证元数据

                   没有按时发送心跳的datanode会被标记为宕机,不会再给它任何I/O请求

                   如果datanode失效造成副本数量下降,并且低于预先设置的阀值,namenode会检测出这些数据块,并在合适的时机进行重新复制

                   重新复制的原因还包括数据副本本身损坏、磁盘错误、复制因子被增大等

         * 安全模式

                   namenode启动时会先经过一个“安全模式”阶段

                   安全模式阶段不会产生数据写

                   在此阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的

                   在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束

                   当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数

         * 校验和

                   HDFS客户端软件实现了对HDFS文件内容的校验和(Checksum)检查

                   在文件创立时,会计算每个数据块的校验和

                   校验和会作为单独一个隐藏文件保存在命名空间下

                   客户端获取文件时,可以检查数据块对应的校验和是否和隐藏在文件中的相同,从而发现数据块是否损坏

                   如果正在读取的数据块损坏,则可以继续读取其他副本

         * 回收站

                   删除文件时,其实是放入回收站/trash

                   回收站里的文件可以快速恢复

                   可以设置一个时间阀值,当回收站里的文件存放时间超过这个阀值,就被彻底删除,并且释放占用的数据块

                   默认回收站是关闭的,可以通过在core-site.xml中添加fs.trash.interval来打开并配置时间阀值,时间单位是分钟

         * 元数据的保护

                   映像文件和事务日志是Namenode的核心数据,可以配置为拥有多个副本

                   副本会降低Namenode的处理速度,但是增加安全性

                   Namenode依然是单点,如果发生故障需要手工切换,Hadoop2.x版本中可配置Namenode HA解决该问题

五、HDFS Shell操作

1、HDFS常见Shell命令

         * HDFS Shell文档地址:

         http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/FileSystemSehell.html

         * HDFS集中式缓存管理文档地址:

         http://hadoop.apache.org/docs/r2.7.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/DistributedCacheDeploy.html

         * HDFS小文件归档文档地址:

         htp://hadoop.apache.org/docs/r2.7.2/hadoop-archives/HadoopArchives.html

 

2、shell命令:

         cd /home/softwares/hadoop-x-x/

         * 查看常见shell命令:

                   bin/hdfs -help

         * 创建文件夹:

                   bin/hdfs dfs -mkdir -p /jkxy/test  (/jkxy/test---在hdfs上的存储位置)        

         * 上传单个文件到上面的目录:

                   bin/hdfs dfs -put /etc/profile /jkxy/test/profile  (/etc/profile--目标文件路径  /jkxy/test/profile---要上传的位置路径)

         * 上传文件夹(内含文件)

                   bin/hdfs dfs -put /etc/* /jkxy/test/

         * 查看hdfs上的一个文件内容:

                   bin/hdfs dfs -cat /jkxy/test/profile

         * 下载hdfs上的文件:

                   bin/hdfs dfs -get /jkxy/test/profile /home/data/  (/jkxy/test/profile---要下载的文件在hdfs的路径    /home/data/---要保存在本地的路径 )

         * 删除hdfs里的文件:

                   bin/hdfs dfs -rm -r /jkxy/test/profile

         * 删除的文件会在回收站保留一定时间,这个时间可以设置:

                   vim core-site.xml  加入:

                            <property>

                           <name>fs.trash.interval</name>

                         <value>10</value> <!--单位是分钟 -->

                       </property>

                   重启hdfs

                   删除一个文件,查看hdfs系统/user/root/.Trash/jkxy/test目录下有个刚才删除的文件,至此回收站配置完成

         * 集中式缓存管理:

                   查看所有缓存池:

                   bin/hdfs cacheadmin -listPools

                   新建缓存池:

                   bin/hdfs cacheadmin -addPool test  (test---新建缓存池名称)

                   hdfs中的文件放入缓存池中:

                   bin/hdfs cacheadmin -addDirective -path /jkxy/test -pool test  (/jkxy/test---要操作的文件路径   test---要放入的缓存池名称  )

                   查看某个缓存池下的文件:

                   bin/hdfs cacheadmin -listDirectives -pool test

                   查看hdfs中的文件内容:

                   bin/hdfs dfs -cat /jkxy/test/xxxx.xml

         * 小文件归档:

                   属于Hadoop的一个脚本,使用bin/hadoop 查看帮助,要启动hdfs和yarn

                   bin/hadoop archive -archiveName conf.har -p /jkxy/test -r 1 /conf(conf.har---要归档成为的文件名,.har后缀代表是归档文件   /jkxy/test---要归档的小文件路径    1---归档的备份数     /conf---归档后要存放在hdfs上的位置)

         * 查看归档文件:

                   bin/hdfs dfs -ls har:///conf/conf.har (///conf/conf.har---hdfs上的路径)

         * 解压归档文件:

                   bin/hdfs dfs -cp har:///conf/conf.har /har  (///conf/conf.har---要解压的文件在hdfs上的路径    /har---要解压到hdfs上的位置)

           hdfs系统里多了一个har,里面的文件跟/jkxy/test/下的文件一样,至此,小文件归档成功

猜你喜欢

转载自blog.csdn.net/qq_35414397/article/details/82863995