一、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/下的文件一样,至此,小文件归档成功