typora-root-url: …/Hadoop
Hadoop光速入门
一 、大数据基本概念
1.1 大数据概念
大数据:指无法在一定时间范围内用常规软件工具进行捕捉,管理和处理的数据集合,是需要新模式才能具有更强大的决策力,洞察发现力和流程优化能力的海量,高增长率和多样化的信息资产
最小的基本单位是bit,按顺序给出所有单位:bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB。
1 Byte =8 bit
1 KB = 1,024 Bytes = 8192 bit
1 MB = 1,024 KB = 1,048,576 Bytes
1 GB = 1,024 MB = 1,048,576 KB
1 TB = 1,024 GB = 1,048,576 MB
1 PB = 1,024 TB = 1,048,576 GB
1 EB = 1,024 PB = 1,048,576 TB
1 ZB = 1,024 EB = 1,048,576 PB
1 YB = 1,024 ZB = 1,048,576 EB
1 BB = 1,024 YB = 1,048,576 ZB
1 NB = 1,024 BB = 1,048,576 YB
1 DB = 1,024 NB = 1,048,576 BB
主要解决,海量数据的存储和海量数据的分析计算问题
1.2 大数据的特点
1、大量。大数据的特征首先就体现为“大”,从先Map3时代,一个小小的MB级别的Map3就可以满足很多人的需求,然而随着时间的推移,存储单位从过去的GB到TB,乃至现在的PB、EB级别。随着信息技术的高速发展,数据开始爆发性增长。社交网络(微博、推特、脸书)-、移动网络、各种智能工具,服务工具等,都成为数据的来源。淘宝网近4亿的会员每天产生的商品交易数据约20TB;脸书约10亿的用户每天产生的日志数据超过300TB。迫切需要智能的算法、强大的数据处理平台和新的数据处理技术,来统计、分析、预测和实时处理如此大规模的数据。
2、多样。广泛的数据来源,决定了大数据形式的多样性。任何形式的数据都可以产生作用,目前应用最广泛的就是推荐系统,如淘宝,网易云音乐、今日头条等,这些平台都会通过对用户的日志数据进行分析,从而进一步推荐用户喜欢的东西。日志数据是结构化明显的数据,还有一些数据结构化不明显,例如图片、音频、视频等,这些数据因果关系弱,就需要人工对其进行标注。
3、高速。大数据的产生非常迅速,主要通过互联网传输。生活中每个人都离不开互联网,也就是说每天个人每天都在向大数据提供大量的资料。并且这些数据是需要及时处理的,因为花费大量资本去存储作用较小的历史数据是非常不划算的,对于一个平台而言,也许保存的数据只有过去几天或者一个月之内,再远的数据就要及时清理,不然代价太大。基于这种情况,大数据对处理速度有非常严格的要求,服务器中大量的资源都用于处理和计算数据,很多平台都需要做到实时分析。数据无时无刻不在产生,谁的速度更快,谁就有优势。
4、价值。这也是大数据的核心特征。现实世界所产生的数据中,有价值的数据所占比例很小。相比于传统的小数据,大数据最大的价值在于通过从大量不相关的各种类型的数据中,挖掘出对未来趋势与模式预测分析有价值的数据,并通过机器学习方法、人工智能方法或数据挖掘方法深度分析,发现新规律和新知识,并运用于农业、金融、医疗等各个领域,从而最终达到改善社会治理、提高生产效率、推进科学研究的效果。
1.3 大数据应用
从证券行业到医疗领域,越来越多公司意识到大数据的重要性。2015年Gartner调查显示,超过75%的公司正在投资或计划在未来两年内投资大数据。而在2012年进行的类似调查中,仅有58%的公司在未来两年内计划投资大数据。
增强客户体验、降低成本、精准营销以及提高流程效率、数据安全是公司关注大数据的主要目的。本文将研究正在使用大数据的10个垂直行业及面临的挑战,以及大数据如何解决这些难题。
1 银行和证券
挑战:
通过对10家投行券商的16个项目的研究表明,该行业面临的挑战包括:证券欺诈预警、蜱虫分析、检测卡片欺诈、审计跟踪档案、企业信用风险报告、贸易可视性、客户数据转换、用于交易的社交分析、IT运营分析和IT策略合规性分析等。
应用:
证券交易委员会(SEC)正在使用大数据网络分析和自然语言处理器来捕捉金融市场中的非法交易活动。
商业银行,对冲基金和其他金融公司在高频交易的交易分析,交易前的决策支持分析,情绪测量,预测分析等方向使用大数据。
该行业还严重依赖大数据进行风险分析,这其中包括:反洗钱,企业风险管理,客户画像,以及减少欺诈行为等。
2 通讯,媒体和娱乐
挑战:
每个观众消费着不同形式的娱乐,以及不同的娱乐设备,因此通信,媒体和娱乐行业正面临以下大数据挑战:
1 收集,分析和利用消费者习惯
2 利用移动和社交媒体内容
3 实时追踪媒体内容使用形式
应用:
公司同时分析客户数据和行为数据,以创建详细的客户档案,可用于:
1 个性化定制内容
2 按需推荐内容
3 衡量内容结果
一个典型的例子是国外视频网站YouTube上的温网比赛,它利用大数据实时向电视、移动和网络用户提供网球比赛的详尽的情感分析。亚马逊Prime大量使用大数据,在一站式商店提供视频,音乐和Kindle书籍来提供卓越的客户体验。
1.4 大数据发展前景
大数据技术目前正处在落地应用的初期,从大数据自身发展和行业发展的趋势来看,大数据未来的前景还是不错的,具体原因有以下几点:
第一:大数据自身能够创造出更多的价值。大数据相关技术紧紧围绕数据价值化展开,数据价值化将开辟出广大的市场空间,重点在于数据本身将为整个信息化社会赋能。随着大数据的落地应用,大数据的价值将逐渐得到体现。目前在互联网领域,大数据技术已经得到了较为广泛的应用。
第二:大数据推动科技领域的发展。大数据的发展正在推动科技领域的发展进程,大数据的影响不仅仅体现在互联网领域,也体现在金融、教育、医疗等诸多领域。在人工智能研发领域,大数据也起到了重要的作用,尤其在机器学习、计算机视觉和自然语言处理等方面,大数据正在成为智能化社会的基础。
第三:大数据产业链逐渐形成。经过近些年的发展,大数据已经初步形成了一个较为完整的产业链,包括数据采集、整理、传输、存储、分析、呈现和应用,众多企业开始参与到大数据产业链中,并形成了一定的产业规模,相信随着大数据的不断发展,相关产业规模会进一步扩大。
第四:产业互联网将推动大数据落地。当前互联网正在经历从消费互联网向产业互联网过渡,产业互联网将利用大数据、物联网、人工智能等技术来赋能广大的传统产业,可以说产业互联网的发展空间非常大,而大数据则是产业互联网发展的一个重点,大数据能否落地到传统行业,关乎产业互联网的发展进程,所以在产业互联网阶段,大数据将逐渐落地,也必然落地。
通过以上分析可以得出,未来大数据领域的发展空间还是比较大的,而且目前大数据领域的人才缺口比较大,所以从就业的角度来说,当前学习大数据相关知识是个不错的选择。
二、 Hadoop框架
2.1 Hadoop是什么?
Hadoop是一个由Apache基金会所开发的分布式系统基础架构,用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS具有高容错性的特点,并且设计用来部署在低廉的硬件上,而且它提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集的应用程序
Hadoop的框架最核心的设计就是:HDFS和MapReduce。 HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算
2.2 Hadoop发展历史
Hadoop系统最初的源头来自于Apache Lucene项目下的搜索引擎子项目Nutch,该项目的负责人是Doug Cutting。2003年,Google公司为了解决其搜索引擎中大规模Web网页数据的处理,研究发明了一套称为MapReduce的大规模数据并行处理技术,并于2004年在著名的OSDI国际会议上发表了一篇题为MapReduce的论文,简要介绍MapReduce的基本设计思想。论文发表后,Doug Cutting受到了很大启发,他发现Google MapReduce所解决的大规模搜索引擎数据处理问题,正是他同样面临并急需解决的问题。因而,他尝试依据Google MapReduce的设计思想,模仿Google MapReduce框架的设计思路,用Java设计实现出了一套新的MapReduce并行处理软件系统,并将其与Nutch分布式文件系统NDFS结合,用以支持Nutch搜索引擎的数据处理。2006年,他们把NDFS和MapReduce从Nutch项目中分离出来,成为一套独立的大规模数据处理软件系统,并使用Doug Cutting小儿子当时呀呀学语称呼自己的玩具小象的名字“Hadoop”命名了这个系统。2008年他们把Hadoop贡献出来,成为Apache最大的一个开源项目,并逐步发展成熟,成为一个包含了HDFS、MapReduce、HBase、Hive、Zookeeper等一系列相关子项目的大数据处理平台和生态系统。
Hadoop开源项目自最初推出后,经历了数十个版本的演进。它从最初于2007年推出的Hadoop-0.14.X测试版,一直发展到2011年5月推出了经过4500台服务器产品级测试的最早的稳定版0.20.203.X。到2011年12月,Hadoop又在0.20.205版基础上发布了Hadoop1.0.0,该版本到2012年3月发展为Hadoop1.0.1稳定版。1.0版继续发展,到2013年8月发展为Hadoop1.2.1稳定版。
与此同时,由于Hadoop1.X以前版本在MapReduce基本构架的设计上存在作业主控节点(JobTracker)单点瓶颈、作业执行延迟过长、编程框架不灵活等较多的缺陷和不足,2011年10月,Hadoop推出了基于新一代构架的Hadoop0.23.0测试版,该版本系列最终演化为Hadoop2.0版本,即新一代的Hadoop系统YARN。2013年10月YARN已经发展出Hadoop2.2.0稳定版。
2.3 Hadoop的发行版本
Hadoop的发行版除了有Apache hadoop外cloudera,hortonworks,mapR,华为,DKhadoop等都提供了自己的商业版本。
商业发行版主要是提供了更为专业的技术支持,这对于大型企业更为重要,不同发行版都有自己的一些特点,本文就各发行版做简单对比介绍。
对比版选择:DKhadoop发行版、cloudera发行版、hortonworks发行版。
1、DKhadoop发行版:有效的集成了整个HADOOP生态系统的全部组件,并深度优化,重新编译为一个完整的更高性能的大数据通用计算平台,实现了各部件的有机协调。因此DKH相比开源的大数据平台,在计算性能上有了高达5倍(最大)的性能提升。DKhadoop将复杂的大数据集群配置简化至三种节点(主节点、管理节点、计算节点),极大的简化了集群的管理运维,增强了集群的高可用性、高可维护性、高稳定性。
2、Cloudera发行版:CDH是Cloudera的hadoop发行版,完全开源,比Apache hadoop在兼容性,安全性,稳定性上有增强。
3、Hortonworks发行版:Hortonworks 的主打产品是Hortonworks Data Platform (HDP),也同样是100%开源的产品,其版本特点:HDP包括稳定版本的Apache Hadoop的所有关键组件;安装方便,HDP包括一个现代化的,直观的用户界面的安装和配置工具。
2.4 Hadoop的优缺点
优点
高可靠性:因为 Hadoop 假设计算元素和存储会出现故障,因为它维护多个工作数据副本,在出现故障时可以对失败的节点重新分布处理
高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。
高效性:在 MapReduce 的思想下,Hadoop 是并行工作的,以加快任务处理速度。
高容错性:自动保存多份副本数据,并且能够自动将失败的任务重新分配。
缺点
Hadoop不适用于低延迟数据访问。
Hadoop不能高效存储大量小文件。
Hadoop不支持多用户写入并任意修改文件
2.4 Hadoop架构组成
整个Hadoop的体系结构主要是通过HDFS来实现对分布式存储的底层支持,并通过MR来实现对分布式并行任务处理的程序支持。
HDFS采用主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的(在最新的Hadoop2.2版本已经实现多个NameNode的配置-这也是一些大公司通过修改hadoop源代码实现的功能,在最新的版本中就已经实现了)。NameNode作为主服务器,管理文件系统命名空间和客户端对文件的访问操作。DataNode管理存储的数据。HDFS支持文件形式的数据。
从内部来看,文件被分成若干个数据块,这若干个数据块存放在一组DataNode上。NameNode执行文件系统的命名空间,如打开、关闭、重命名文件或目录等,也负责数据块到具体DataNode的映射。DataNode负责处理文件系统客户端的文件读写,并在NameNode的统一调度下进行数据库的创建、删除和复制工作。NameNode是所有HDFS元数据的管理者,用户数据永远不会经过NameNode。
2.4.1 HDFS架构组成
上图为:HDFS体系结构图
NameNode:存储文件的元数据,如文件名称,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表和块所在的DataNode等
DataNode:在本地文件系统存储文件块数据,以及数据块的校验和
Secondary NameNode:用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。
2.4.2 MapReduce架构原理
MapReduce是一种可用于数据处理的编程模型,其程序的本质是并行运行的,可以将大规模的数据分析任务分发给任何一个拥有足够多机器的数据中心
MapReduce任务过程分为两个处理阶段:Map阶段与reduce阶段
Map阶段并行处理输入数据
Reduce阶段对map结果进行汇总
2.4.3 YARN架构原理
Apache YARN 是Hdoop集群资源管理系统。YARN 被引入Hadoop2.x版本,最初是为了改善MapReduce实现,它具有足够的通用性,可以支持其它的分布式计算模型
YARN通过两类长期运行的守护进程提供自己的核心服务:
1)管理集群上资源使用的资源管理器 resource manager: 处理客户端请求、启动/监控 ApplicationMaster、监控 NodeManager、资源分配与调度;
2)运行在集群中所有节点上且能够启动和监控容器的节点管理器node manager:单个节点上的资源管理,处理来自resourceManager的命令、处理来自applicationMaster的命令
3)用于执行特定应用程序的容器container:对任务运行环境的抽象,封装了 CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息。
4)applicationMaster :数据切分、为应用程序申请资源,并分配给内部任务、任务监控与容错。
2.5 大数据技术生态体系
上图中涉及到的技术名词解释如下:
1)Sqoop:sqoop 是一款开源的工具,主要用于在 Hadoop(Hive)与传统的数据库(mysql)间进
行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle 等)中的数据导进到
Hadoop 的 HDFS 中,也可以将 HDFS 的数据导进到关系型数据库中。
2)Flume:Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚
合和传输的系统,Flume 支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume
提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
3)Kafka:Kafka 是一种高吞吐量的分布式发布订阅消息系统,有如下特性:
(1)通过 O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以 TB 的消息 存储也能够保持长时间的稳定性能。
(2)高吞吐量:即使是非常普通的硬件 Kafka 也可以支持每秒数百万的消息 (3)支持通过 Kafka 服务器和消费机集群来分区消息。
(4)支持 Hadoop 并行数据加载。
4)Storm:Storm 为分布式实时计算提供了一组通用原语,可被用于“流处理”之中,实时
处理消息并更新数据库。这是管理队列及工作者集群的另一种方式。 Storm 也可被用于“连
续计算”(continuous computation),对数据流做连续查询,在计算时就将结果以流的形式
输出给用户。
5)Spark:Spark 是当前最流行的开源大数据内存计算框架。可以基于 Hadoop 上存储的大数据进行计算。
6)Oozie:Oozie 是一个管理 Hdoop 作业(job)的工作流程调度管理系统。Oozie 协调作业
就是通过时间(频率)和有效数据触发当前的 Oozie 工作流程。
7)Hbase:HBase 是一个分布式的、面向列的开源数据库。HBase 不同于一般的关系数据库,
它是一个适合于非结构化数据存储的数据库。
8)Hive:hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张
数据库表,并提供简单的 sql 查询功能,可以将 sql 语句转换为 MapReduce 任务进行运行。
其优点是学习成本低,可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专
门的 MapReduce 应用,十分适合数据仓库的统计分析。
9)Mahout:
Apache Mahout是个可扩展的机器学习和数据挖掘库,当前Mahout支持主要的4个用 例:
推荐挖掘:搜集用户动作并以此给用户推荐可能喜欢的事物。 聚集:收集文件并进行相关文件分组。 分类:从现有的分类文档中学习,寻找文档中的相似特征,并为无标签的文档进行正确 的归类。
频繁项集挖掘:将一组项分组,并识别哪些个别项会经常一起出现。
10)ZooKeeper:Zookeeper 是 Google 的 Chubby 一个开源的实现。它是一个针对大型分布
式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、 分布式同步、组服务等。
ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能
稳定的系统提供给用户。
三、Hadoop运行环境搭建
3.1 虚拟机网络设置
3.2 修改IP地址
3.3 修改主机名
- 进入 Linux 系统查看本机的主机名。通过 hostname 命令查看。
[root@localhost ~]# hostname
localhost.localdomain
- 如果此时需要修改主机名则可以按照如下的方式进行修改
范例1:临时修改主机名称为Hadoop01 hostname hadoop01 重启之后失效
范例2:永久修改主机名称为Hadoop01
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hadoop01
- 在修改完主机名称之后,需要编辑/etc/hosts 文件需要把主机名称与IP地址进行映射
vi /etc/hosts 在该文件下添加如下内容
192.168.1.128 hadoop01
3.4 关闭防火墙
1)service iptables stop 关闭防火墙
2)chkconfig iptables off 永久关闭防火墙启动
3)chkconfig iptables --list 查看防火墙开机启动状态
3.5 规划软件安装目录
1)创建安装包的保存目录,以及安装目录
mkdir -p /opt/soft 保存软件的安装包
mkdir -p /opt/app 软件的安装了路径
3.6 创建Hadoop用户,以及赋予sudo权限
1)创建Hadoop用户,以后的操作都是在hadoop用户下完成的
useradd hadoop 创建hadoop用户
passwd hadoop 为hadoop用户设置密码
2)为hadoop用户赋予sudo权限
在root用户下,执行visudo命令编辑如下内容
Allow root to run any commands anywhere
root ALL=(ALL) ALL
hadoop ALL=(ALL) ALL 为hadoop用户设置sudo权限
Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
hadoop ALL=(ALL) NOPASSWD: ALL. 为hadoop用户设置免密码sudo权限
3.7 安装jdk环境
首先先把jdk的安装包上传到soft 文件夹下,之后对其安装
1)解压 sudo tar -zvxf jdk-8u181-linux-x64.tar.gz
2)配置JDK环境变量
首先获取JDK的安装路径
[hadoop@hadoop01 jdk1.8.0_181]$ pwd
/opt/soft/jdk1.8.0_181
接下来打开 /etc/profile 文件进行环境变量的设置
vi /etc/profile
在 profie 文件末尾添加 jdk 路径:
#JAVA_HOME
export JAVA_HOME=/data/jdk1.8.0_181
export PATH=
PATH
保存后推出 :wq
完成以上的操作之后,配置文件并不能立即生效,需要使用到如下命令,使配置文件立即生效
[hadoop@hadoop01 jdk1.8.0_181]$ source /etc/profile
之后测试JDK环境变量是否配置成功,使用如下命令输出JDK的版本信息
[hadoop@hadoop01 jdk1.8.0_181]$ java -version
java version “1.8.0_181”
Java™ SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot™ 64-Bit Server VM (build 25.181-b13, mixed mode)
如果能看到如上的信息,说明JDK的环境变量已经配置成功
3.8 安装Hadoop环境
1)进入到软件包的安装路径下:
[hadoop@hadoop01 /]$ cd /opt/soft/
对hadoop安装包进行解压
[hadoop@hadoop01 soft]$ sudo tar -zvxf hadoop-2.7.2.tar.gz
解压成功之后,hadoop的安装目录结构如下:
bin:Hadoop最基本的管理脚本和使用脚本所在目录,这些脚本是sbin目录下管理脚本的基础实现,用户可以直接使用这些脚本管理和使用hadoop
etc:Hadoop配置文件所在目录,包括core-site.xml, hdfs-site.xml, mapred-site.xml等从hadoop1.0继承而来的配置文件和yarn-site.xml等hadoop 2.0新增的配置文件
include:对外提供的编程酷头文件(具体动态库和静态库在lib目录中),这些头文件均是用c++定义的,通常用于c++程序访问hdfs或者编写mapreduce程序
lib:该目录包含了Hadoop对外提供的的编程动态库和静态库,与include目录中的头文件结合使用。
libexec:各个服务对应的shell配置文件所在目录,可用于配置日志输出目录,启动参数(比如JVM参数)等基本信息。
sbin:Hadoop管理脚本所在目录,主要包含HDFS和YARN中各类服务的启动/关闭脚本
share:Hadoop各个模块编译后的jar包所在目录
- 配置hadoop环境
hadoop需要我们配置的相关文件都存放在$HADOOP_HOME/etc/hadoop目录下面,首先进入到该目录
[hadoop@hadoop01 hadoop]$ cd etc/hadoop/
进入到该目录之后使用ls 命令查看该目录下的文件信息
[hadoop@hadoop01 hadoop]$ ll
-rw-r--r--. 1 root root 4436 May 22 2017 capacity-scheduler.xml
-rw-r--r--. 1 root root 1335 May 22 2017 configuration.xsl
-rw-r--r--. 1 root root 318 May 22 2017 container-executor.cfg
-rw-r--r--. 1 root root 774 May 22 2017 core-site.xml
-rw-r--r--. 1 root root 3670 May 22 2017 hadoop-env.cmd
-rw-r--r--. 1 root root 4224 May 22 2017 hadoop-env.sh
-rw-r--r--. 1 root root 2598 May 22 2017 hadoop-metrics2.properties
-rw-r--r--. 1 root root 2490 May 22 2017 hadoop-metrics.properties
-rw-r--r--. 1 root root 9683 May 22 2017 hadoop-policy.xml
-rw-r--r--. 1 root root 775 May 22 2017 hdfs-site.xml
-rw-r--r--. 1 root root 1449 May 22 2017 httpfs-env.sh
-rw-r--r--. 1 root root 1657 May 22 2017 httpfs-log4j.properties
-rw-r--r--. 1 root root 21 May 22 2017 httpfs-signature.secret
-rw-r--r--. 1 root root 620 May 22 2017 httpfs-site.xml
-rw-r--r--. 1 root root 3518 May 22 2017 kms-acls.xml
-rw-r--r--. 1 root root 1527 May 22 2017 kms-env.sh
-rw-r--r--. 1 root root 1631 May 22 2017 kms-log4j.properties
-rw-r--r--. 1 root root 5511 May 22 2017 kms-site.xml
-rw-r--r--. 1 root root 11237 May 22 2017 log4j.properties
-rw-r--r--. 1 root root 951 May 22 2017 mapred-env.cmd
-rw-r--r--. 1 root root 1383 May 22 2017 mapred-env.sh
-rw-r--r--. 1 root root 4113 May 22 2017 mapred-queues.xml.template
-rw-r--r--. 1 root root 758 May 22 2017 mapred-site.xml.template
-rw-r--r--. 1 root root 10 May 22 2017 slaves
-rw-r--r--. 1 root root 2316 May 22 2017 ssl-client.xml.example
-rw-r--r--. 1 root root 2268 May 22 2017 ssl-server.xml.example
-rw-r--r--. 1 root root 2250 May 22 2017 yarn-env.cmd
-rw-r--r--. 1 root root 4567 May 22 2017 yarn-env.sh
-rw-r--r--. 1 root root 690 May 22 2017 yarn-site.xml
我们首先可以发现,这些文件目前的权限都是基于root用户的,但是我们现在使用的是hadoop用户,hadoop用户并没有这些文件的权限,所以首先需要修改权限
使用chown 命令修改用户与用户组权限
sudo chown -R hadoop:hadoop /opt/soft/hadoop-2.7.2/
修改完成之后再次使用ls命令查看文件,查看是否修改成功
[hadoop@hadoop01 hadoop]$ ll
-rw-r--r--. 1 hadoop hadoop 4436 May 22 2017 capacity-scheduler.xml
-rw-r--r--. 1 hadoop hadoop 1335 May 22 2017 configuration.xsl
-rw-r--r--. 1 hadoop hadoop 318 May 22 2017 container-executor.cfg
-rw-r--r--. 1 hadoop hadoop 774 May 22 2017 core-site.xml
-rw-r--r--. 1 hadoop hadoop 3670 May 22 2017 hadoop-env.cmd
-rw-r--r--. 1 hadoop hadoop 4224 May 22 2017 hadoop-env.sh
-rw-r--r--. 1 hadoop hadoop 2598 May 22 2017 hadoop-metrics2.properties
-rw-r--r--. 1 hadoop hadoop 2490 May 22 2017 hadoop-metrics.properties
-rw-r--r--. 1 hadoop hadoop 9683 May 22 2017 hadoop-policy.xml
-rw-r--r--. 1 hadoop hadoop 775 May 22 2017 hdfs-site.xml
-rw-r--r--. 1 hadoop hadoop 1449 May 22 2017 httpfs-env.sh
-rw-r--r--. 1 hadoop hadoop 1657 May 22 2017 httpfs-log4j.properties
-rw-r--r--. 1 hadoop hadoop 21 May 22 2017 httpfs-signature.secret
-rw-r--r--. 1 hadoop hadoop 620 May 22 2017 httpfs-site.xml
-rw-r--r--. 1 hadoop hadoop 3518 May 22 2017 kms-acls.xml
-rw-r--r--. 1 hadoop hadoop 1527 May 22 2017 kms-env.sh
-rw-r--r--. 1 hadoop hadoop 1631 May 22 2017 kms-log4j.properties
-rw-r--r--. 1 hadoop hadoop 5511 May 22 2017 kms-site.xml
-rw-r--r--. 1 hadoop hadoop 11237 May 22 2017 log4j.properties
-rw-r--r--. 1 hadoop hadoop 951 May 22 2017 mapred-env.cmd
-rw-r--r--. 1 hadoop hadoop 1383 May 22 2017 mapred-env.sh
-rw-r--r--. 1 hadoop hadoop 4113 May 22 2017 mapred-queues.xml.template
-rw-r--r--. 1 hadoop hadoop 758 May 22 2017 mapred-site.xml.template
-rw-r--r--. 1 hadoop hadoop 10 May 22 2017 slaves
-rw-r--r--. 1 hadoop hadoop 2316 May 22 2017 ssl-client.xml.example
-rw-r--r--. 1 hadoop hadoop 2268 May 22 2017 ssl-server.xml.example
-rw-r--r--. 1 hadoop hadoop 2250 May 22 2017 yarn-env.cmd
-rw-r--r--. 1 hadoop hadoop 4567 May 22 2017 yarn-env.sh
-rw-r--r--. 1 hadoop hadoop 690 May 22 2017 yarn-site.xml
通过再次查看我们发现,现在的权限已经全部修改为hadoop ,这样我们就可以在hadoop用户下对这些文件进行操作了
完成了以上的配置之后,我们接下来首先需要配置如下文件
hadoop-env.sh: 用于hadoop的环境变量配置文件
# The java implementation to use.
export JAVA_HOME=/opt/soft/jdk1.8.0_181
在该配置文件中,找到如上内容,并且修改JAVA_HOME 为自己的JDK路径
配置完成之后,可以在hadoop根路径下,输入如下命令
bin/hadoop
Usage: hadoop [--config confdir] [COMMAND | CLASSNAME]
CLASSNAME run the class named CLASSNAME
or
where COMMAND is one of:
fs run a generic filesystem user client
version print the version
jar <jar> run a jar file
note: please use "yarn jar" to launch
YARN applications, not this command.
checknative [-a|-h] check native hadoop and compression libraries availability
distcp <srcurl> <desturl> copy file or directories recursively
archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
classpath prints the class path needed to get the
credential interact with credential providers
Hadoop jar and the required libraries
daemonlog get/set the log level for each daemon
trace view and modify Hadoop tracing settings
Most commands print help when invoked w/o parameters.
如果能看到如上的信息,说明基本的运行环境已经搭建完成了
四、Hadoop运行模式
Hadoop的运行模式,分为以下几种:
1) 本地模式(默认模式)
不需要启用单独进程,直接可以运行,测试和开发时使用。
2)伪分布模式
等同于完全分布式,只有一个节点。
3)完全分布式模式
多个节点一起运行。
4.1 本地运行Hadoop官方案例Grep
对于这个案例来说,主要的作用就是,在一堆文件中与规定的正则表达式进行匹配,把匹配成功的单词出现的次数,进行统计
$ mkdir input
$ cp etc/hadoop/*.xml input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'
$ cat output/*
以上为官网上给出的案例代码
从以上的案例代码可以得出,首先需要创建一个目录,用于存放需要统计的文件,而对于统计结果的保存目录则不用以前创建,注意:Hadoop中输出结果的目录是不能提前存在的
范例:运行grep案例
1)在hadoop根目录下创建一个文件夹input
[hadoop@hadoop01 hadoop-2.7.2]$ mkdir input
- 将hadoop的xml配置文件复制到input
[hadoop@hadoop01 hadoop-2.7.2]$ cp etc/hadoop/*.xml input/
- 执行share目录下的mapreduce程序
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output ‘dfs[a-z.]+’
- 查看输出结果
[hadoop@hadoop01 hadoop-2.7.2]$ cat output/*
1 dfsadmin
4.2 运行官方wordcount案例
1) 在hadoop根目录中创建用于保存统计文件的wcinput目录
[hadoop@hadoop01 hadoop-2.7.2]$ mkdir wcinput
- 在 wcinput 文件下创建一个 wordcount.txt 文件
[hadoop@hadoop01 wcinput]$ vi worldcount.txt
hello java world input
hadoop hive zookeeper java
world input hello hadoop
hbase zookeeper sqoop
- 执行wordcount案例程序
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput
4) 查看结果
[hadoop@hadoop01 hadoop-2.7.2]$ cat wcoutput/part-r-00000
hadoop 2
hbase 1
hello 2
hive 1
input 2
java 2
sqoop 1
world 2
zookeeper 2
4.3 伪分布式运行Hadoop案例
4.3.1 启动 HDFS 并运行 MapReduce 程序
对于伪分布式安装来说,需要配置自定义的配置文件,用于启动hdfs,以及yarn
- 配置core-site.xml 配置文件,内容如下
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/app/hadoop-2.7.2/data/tmp</value>
</property>
</configuration>
配置HDFS的对外的访问路径,并且配置hadoop临时保存目录
2 ) 配置hdfs-site.xml 配置文件
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
以上的配置,把hdfs 文件块的副本复制的数量设置1 由于在伪分布式环境中,必须设置为1
完成以上的步骤,就可以对HDFS 文件进行格式化操作,命令如下
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hadoop namenode -format
INFO common.Storage: Storage directory /tmp/hadoop-hadoop/dfs/name
has been successfully formatted.
出现如上的信息,说明格式化成功
格式化成功之后,就可以分别启动,HDFS 的相关进程
1) 启动namenode
sbin/hadoop-daemon.sh start namenode
- 启动 datanode
sbin/hadoop-daemon.sh start datanode
启动namenode 与 datanode之后,可以通过web的方式进行访问(前提必须关闭防火墙)
http://10.0.153.228:50070/explorer.html#/
完成以上的操作之后,就可以通过操作HDFS 进行文件的上传并且在HDFS文件系统上对文件进行分析
范例:操作集群
1) 在HDFS文件系统上创建一个input文件夹
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -mkdir /input
- 将测试文件内容上传到文件系统上
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -put wcinput/wordcount.txt /input
- 查看文件上传是否正确
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -ls /input
Found 1 items
-rw-r–r-- 1 hadoop supergroup 98 2019-04-23 14:18 /input/wordcount.txt
- 运行mapreducec程序
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output
- 查看输出结果
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -cat /output/par*
hadoop 2
hbase 1
hello 2
hive 1
input 2
java 2
sqoop 1
world 2
zookeeper 2
除了以上的方式查看输出的结果文件之外,也可以通过web访问HDFS的方式进行查看
- 将输出结果下载到本地
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -get /output/part-r-00000
- 删除输出结果
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -rmr /output
4.3.2 在Yarn上运行MapReduce程序
首先需要在mapred-site.xml 配置文件,配置如下信息
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
接下来在yarn-site.xml 配置文件进行如下配置
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
配置完以上的配置之后,可以使用如下命令启动yarn的进行
- resoucemanager
[hadoop@hadoop01 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager
- nodemanager
[hadoop@hadoop01 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
启动成功之后,可以通过jps 查看进程是否启动成功
[hadoop@hadoop01 hadoop-2.7.2]$ jps
5139 Jps
29783 DataNode
29497 NameNode
4766 ResourceManager
5039 NodeManager
执行jps命令之后,可以发现进程中存在ResourceManager与NodeManager两个进程
启动成功之后,就可以通过web浏览器的方式进行查看
http://192.168.1.124:8088/cluster
再次执行mapredcue程序,可以发现mapreduce程序已经运行在yarn平台上
4.3.3 配置历史服务
1) 在mapred-site.xml 文件中,配置如下信息
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
配置MR任务的历史服务器地址,以及端口号
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
完成以上的配置之后,需要启动历史服务器,的服务进程
sbin/mr-jobhistory-daemon.sh start historyserver
通过以上命令启动,历史服务器
4.3.4 配置日志聚集功能
所谓日志聚集功能,其实就是在MR任务运行结束之后,把相关的运行日志上传到HDFS文件系统中,保存下来方便查看
开启日志聚集的步骤如下:
1)配置yarn-site.xml 配置文件
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
以上的配置内容为,启动日志聚集功能
- 配置日志在HDFS上保存的时间 yarn -site.xml
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
以上的配置,保存时间为7天,之后将会把日志删除
如果配置了日志聚集功能,在启动集群的时候,就需要注意,由于日志需要保存在HDFS上,所以必须保证HDFS首先启动完成。
配置完成之后,需要重新启动,历史服务器 jobhistoryserver
配置完日志聚集功能之后,需要把yarn (resourcemanager,nodemanager) 重新启动
4.3.4 配置文件的说明
在hadoop中配置文件分为两类,默认的配置文件,以及用户自定义的配置文件,在默认的配置文件中,属性都是已经定义好的,但是定义好的默认的属性,有些时候并不适用每个场景,所以需要用户对其进行自定义
在配置文件的优先级中:自定义的配置文件>高于默认的配置文件
默认的配置文件,存放在Hadoop中位置:
core-default.xml :hadoop-2.7.2\share\hadoop\common\hadoop-common-2.7.2.jar
hdfs-default.xml:hadoop-2.7.2\share\hadoop\hdfs\hadoop-hdfs-2.7.2.jar
yarn-default.xml:hadoop-2.7.2\share\hadoop\yarn\hadoop-yarn-common-2.7.2.jar
mapred-default.xml:hadoop-2.7.2\share\hadoop\mapreduce\hadoop-mapreduce-client-core-2.7.2.jar
4.4 完全分布式安装hadoop
1)环境准备
修改3台虚拟机的主机名称,ip地址,修改完成主机名称之后,修改hosts地址,要求3台主机全部一致
sudo vi /etc/hosts
10.0.153.228 hadoop01
10.0.153.223 hadoop02
10.0.153.225 hadoop03
编辑完成之后,把该文件分发到其他两个节点
scp /etc/hosts hadoop02:/etc/hosts
如果使用的用户不是root 则需要使用sudo 提升权限
由于目前的环境是从一台虚拟机克隆出来的,所以只需要修改主机名称,以及IP地址即可,其他的配置完全一样
- 集群规划
Hadoop01 | Hadoop02 | Hadoop03 |
---|---|---|
NameNode | dataNode | DataNode |
DataNode | ResourceManager | Nodemanager |
NodeManager | NodeManager | SecondaryNamenode |
3)集群安装
Hadoop 完全分布式的安装,在之前的基础上修改即可
core-site.xml 保持原来不变
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/app/hadoop-2.7.2/data/tmp</value>
</property>
</configuration>
hdfs-site.xml 配置的修改的内容如下
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop03:50090</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>
dfs.namenode.secondary.http-address: 设置secondaryNamenode 主机地址
dfs.namenode.http-address: NameNode WEB访问地址的主机地址设置
dfs.permissions.enabled: HDFS 文件系统的权限控制 false 为关闭
修改yarn-site.xml 配置文件,增加RM的主机位置
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop02</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
mapred-site.xml 配置文件 没有任何改变
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
</configuration>
在完全分布式环境中,必须要配置savles 文件,在该文件中增加从节点的主机名称
hadoop01
hadoop02
hadoop03
完成以上的配置之后,使用scp命令,把配置的文件分发到不同的节点上
scp -r /opt/app/hadoop-2.7.2/etc/hadoop/ hadoop03:/opt/app/hadoop-2.7.2/etc/
格式化之前,保证所有节点中的/tmp目录中是被清空的,以及hadoop根目录中的data/tmp 下面是没有内容的
清空所有节点之后,需要在hadoop01 也就是NameNode所在的节点上进行格式化
bin/hadoop namenode -format
格式化成功之后,就可以分别启动从节点上的服务
sbin/hadoop-daemon.sh start namenode 在hadoop01
sbin/yarn-daemon.sh start resourcemanager hadoop02
Datanode 与 nodemanager 分别在3台节点上启动 sbin/hadoop-daemon.sh start datanode
sbin/yarn-daemon.sh start nodemanager
4.4.1 配置集群节点之间的免密登录
在用户名中的家目录中进入到.ssh 隐藏目录中,使用如下命令
ssh-keygen -t rsa
生成公钥与私钥
id_rsa id_rsa.pub
分别在3台节点上重复以上的步骤
之后使用ssh-copy_id 对应相应的主机名进行公钥之间的拷贝完成免密
ssh-copy-id hadoop03
完成免密登录之后,就可以使用start-all.sh stop-all.sh 的方式启动和关闭集群。
4.4.2 集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时
的同步,比如,每隔十分钟,同步一次时间
配置时间同步的步骤如下:
1) 在root用户下检查是否安装ntp服务
[hadoop@hadoop01 hadoop-2.7.2]$ rpm -qa |grep ntp
fontpackages-filesystem-1.41-1.1.el6.noarch
ntpdate-4.2.6p5-10.el6.centos.x86_64
ntp-4.2.6p5-10.el6.centos.x86_64
五、Hadoop源码编译
六、HDFS分布式文件系统
6.1 HDFS产生背景
随着数据量越来越大,在一个操作系统管辖的范围内存不下了,那么就分配到更多的操
作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,
这就是分布式文件管理系统。HDFS 只是分布式文件管理系统中的一种。
6.2 HDFS概念
HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
HDFS的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。
6.3 HDFS优缺点
优点:
1)高容错性:数据自动保存多个副本,当一个副本丢失后,可以自动回复。
2)适合大数据处理:文件规模大(个数多)、数据规模大(数据大小)
3) 流式数据访问:一次写入,多次读取,不能修改,只能追加。保证数据一致性。
4) 构建成本低:可以构建在廉价的机器上。
缺点:
1)不适合做低延迟数据访问,比如毫秒级的数据访问是做不到的。
2)无法高效的对大量小文件进行存储。
3)无法并发写入和随机修改。
6.4 HDFS架构
对于HDFS的架构,存在以下组件:
Client ,NameNode DataNode 和SecondaryNameode
Client: 客户端
1)负责文件的切片,文件上传到HDFS的时候会把文件切分成一个个BLOCK进行上传存储
2)与NameNode进行交互,获得文件的存储位置,检查是否存在重复文件等
3)与DataNode进行交互,写入真正的数据,以及读取数据
4)提供了一些HDFS的访问命令,以及API操作
NameNode :主节点 只有一个(在没有HA的情况下)
1) 管理HDFS的命名空间
2) 管理数据块的映射信息
3) 配置副本策略
4) 处理客户端的请求
DataNode: 工作者
1)存储真正的数据(按照块进行存储)
2)执行数据块的读写操作
3)定时向NameNode进行汇报(心跳机制)
SecondaryNameNode:
SecondaryNameNode,作为nameNode的辅助节点,帮助namenode合并fsimae 与edits文件,由于SecondaryNameNode 的元数据不能与nameNode的元数据保持实时同步,所以不能作为NameNode的热备节点
6.5 HDFS 的文件块大小
HDFS 中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize) 来规定,默认大小在 hadoop2.x 版本中是 128M,老版本中是 64M。
HDFS 的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁 盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组 成的文件的时间取决于磁盘传输速率。
如果寻址时间约为 10ms,而传输速率为 100MB/s,为了使寻址时间仅占传输时间的 1%, 我们要将块大小设置约为 100MB。默认的块大小 128MB。
块的大小:10ms100100M/s = 100M
6.6 HDFS shell 命令行操作
HDFS的shell命令其实与linux上类似,对于一些常用的命令需要熟练掌握想要在hdfs上查看相关的HDFS命令则可以在 bin/hdfs 上可以列出相关命令
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs
Usage: hdfs [--config confdir] [--loglevel loglevel] COMMAND
where COMMAND is one of:
dfs run a filesystem command on the file systems supported in Hadoop.
classpath prints the classpath
namenode -format format the DFS filesystem
secondarynamenode run the DFS secondary namenode
namenode run the DFS namenode
journalnode run the DFS journalnode
zkfc run the ZK Failover Controller daemon
datanode run a DFS datanode
dfsadmin run a DFS admin client
haadmin run a DFS HA admin client
fsck run a DFS filesystem checking utility
balancer run a cluster balancing utility
jmxget get JMX exported values from NameNode or DataNode.
mover run a utility to move block replicas across
storage types
oiv apply the offline fsimage viewer to an fsimage
oiv_legacy apply the offline fsimage viewer to an legacy fsimage
oev apply the offline edits viewer to an edits file
fetchdt fetch a delegation token from the NameNode
getconf get config values from configuration
groups get the groups which users belong to
snapshotDiff diff two snapshots of a directory or diff the
current directory contents with a snapshot
lsSnapshottableDir list all snapshottable dirs owned by the current user
Use -help to see options
portmap run a portmap service
nfs3 run an NFS version 3 gateway
cacheadmin configure the HDFS cache
crypto configure HDFS encryption zones
storagepolicies list/get/set block storage policies
version print the version
Most commands print help when invoked w/o parameters.
对于hdfs文件系统来说,常用的操作命令都是在dfs模块中,如果想要查看dfs模块的命令则可以使用如下命令查看
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs
Usage: hadoop fs [generic options]
[-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 ...]]
Generic options supported are
-conf <configuration file> specify an application configuration file
-D <property=value> use value for given property
-fs <local|namenode:port> specify a namenode
-jt <local|resourcemanager:port> specify a ResourceManager
-files <comma separated list of files> specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars> specify comma separated jar files to include in the classpath.
-archives <comma separated list of archives> specify comma separated archives to be unarchived on the compute machines.
The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions]
虽然以上的命令有很多,但是我们只需要掌握常用的操作命令即可 ,对于常用的操作命令给出如下的分类
1)权限相关的命令如下:
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
2)文件夹相关的命令如下:
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-mkdir [-p] <path> ...]
[-rm [-f] [-r|-R] [-skipTrash] <src> ...]
3)文件相关的操作命令如下
[-cat [-ignoreCrc] <src> ...] 只能查看普通的文件,不能查看二进制的文件
[-text [-ignoreCrc] <src> ...] text 可以查看所有类型的文件
[-put [-f] [-p] [-l] <localsrc> ... <dst>] 上传文件到HDFS
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] 下载文件到本地
[-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>] 从本地拷贝文件到HDFS上
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] 从HDFS上拷贝文件到本地
[-moveFromLocal <localsrc> ... <dst>] 从本地剪切文件到HDFS上
[-moveToLocal <src> <localdst>] 从HDFS上剪切文件到本地
[-df [-h] [<path> ...]] 查看HDFS上可用空间
[-du [-s] [-h] <path> ...] 统计文件或者文件夹的大小
对于以上的操作命令,给出如下的操作案例
范例:修改HDFS上文件的权限
以下为使用ls 查看hdfs上文件的详细列表
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -ls /
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2019-01-04 09:44 /input
要把以上的文件修改权限,把hadoop修改为root用户
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -chown -R root:root /input
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -ls /
Found 1 items
drwxr-xr-x - root root 0 2019-01-04 09:44 /input
通过以上的命令,就可以修改数据的用户以及用户组为root
范例:使用 rmdir 删除在hdfs上的input目录观察是否可以删除
bin/hdfs dfs -rmdir /input
使用如上命令并不能删除一个非空的目录,所以如果想要删除一个非空的目录,则可以使用 rmr 递归删除目录并且删除目录中的文件
范例:使用rmr命令删除一个非空的目录
bin/hdfs dfs -rmr /input
对于文件的查看,存在两种方式,分别为cat 与text 在查看普通文件的时候,两种查看的方式没有任何的区别,但是如果出现了二进制的文件则需要使用text查看
范例:使用get 下载文件到本地linux系统上
bin/hdfs dfs -get /input /data/
范例:使用df 查看可用空间信息
[hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -df /
Filesystem Size Used Available Use%
hdfs://hadoop01:8020 96315457536 313176 77031145472 0%
范例:使用du 统计文件夹的大小
hadoop@hadoop01 hadoop-2.7.2]$ bin/hdfs dfs -du /input
4436 /input/capacity-scheduler.xml
774 /input/core-site.xml
9683 /input/hadoop-policy.xml
775 /input/hdfs-site.xml
620 /input/httpfs-site.xml
3518 /input/kms-acls.xml
5511 /input/kms-site.xml
690 /input/yarn-site.xml
6.7 HDFS API操作
其实类似于JDBC的操作,相当于在java中使用相关的接口以及方法对数据库进行CRUD的操作,而 HDFS API 也是在java中使用类,或者接口 调用相关方法操作HDFS文件系统
首先考虑到的就是jar的支持,由于现在没有搭建maven环境,可以使用hadoop中提供的jar包来使用
1)开发环境的准备
1、使用开发工具创建一个java项目,之后创建一个lib文件夹保存jar使用
2、找到以上的选项之后,创建文件夹,并且命名为lib
创建好相关jar之后,把Hadoop相关api导入到该目录中,导入之后把相关jar包增加到classpath路径中
由于Hadoop 是在32位系统上编译的,并且对windows 支持不好,所以需要在本地配置hadoop环境变量,并且把64的编译本地库文件,替换原来32位的
实现步骤:
1 ) 解压Hadoop的安装文件到windows 本地磁盘(要求是一个无中文,无空格的目录)
2 ) 需要在windows中配置环境变量
实现步骤:
1在我的电脑 点击 右键 找到属性 高级设置 环境变量 之后出现如下界面
2在以上的界面中增加HADOOP_HOME 并且给定hadoop的解压路径
3增加完成之后,在pat路径下,追加环境变量
4完成以上的配置,环境变量就配置完成了
6.7.1 HDFS 获得文件系统
如果想要在java中连接到HDFS 则必须首先获得FileSystem类 只有通过该类才可以对HDFS进行操作
package org.hdfs.test;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
public class TestFileSystem {
public static void main(String[] args) throws IOException {
// 首先连接HDFS 之前,需要获得一个配置类,用于封装连接信息
Configuration conf=new Configuration();
// 课题通过set的方法,设置属性与内容(连接HDFS 的一些相关信息)
conf.set("fs.defaultFS", "hdfs://hadoop01:8020");
// 获得文件系统 可以理解为客户端的概念
FileSystem fs =FileSystem.get(conf);
System.out.println(fs);
}
}
6.7.2 文件上传
package org.hdfs.test;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class TestCopyFromLocal {
public static void main(String[]args) throws IOException {
// 获得配置文件类
Configuration conf=new Configuration();
// 课题通过set的方法,设置属性与内容(连接HDFS 的一些相关信息)
conf.set("fs.defaultFS", "hdfs://hadoop01:8020");
// 获得文件系统
FileSystem fs=FileSystem.get(conf);
// 把本地磁盘中的文件 拷贝到HDFS上的根目录中
fs.copyFromLocalFile(new Path("c:/product.txt"), new Path("/"));
System.out.println("上传完毕");
fs.close();
}
}
6.7.3 文件的下载
package org.hdfs.test;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class TestCopyToLocal {
public static void main(String[] args) throws IOException {
Configuration conf=new Configuration();
conf.set("fs.defaultFS", "hdfs://hadoop01:8020");
FileSystem fs=FileSystem.get(conf);
// 从HDFS 文件系统上下载 数据到本地磁盘上
fs.copyToLocalFile(true,new Path("/a.txt"), new Path("c:/vvvvb.txt"));
fs.close();
System.out.println("下载完成");
}
}
6.7.4 目录的创建
package org.hdfs.test;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class MkdirTest {
public static void main(String[] args) throws IOException {
Configuration conf=new Configuration();
conf.set("fs.defaultFS", "hdfs://hadoop01:8020");
FileSystem fs=FileSystem.get(conf);
fs.mkdirs(new Path("/mytest"));
fs.close();
System.out.println("创建完成");
}
}
对于文件夹的创建,存在两种路径,如果想要在根目录中进行创建则必须加上指定路径分隔符“/”
如果没有加上任何的路径分隔符,则默认在hdfs上创建user/用户名成/创建的文件夹
6.7.5 删除文件或者目录
package org.hdfs.test;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class TestDelete {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://hadoop01:8020");
FileSystem fs = FileSystem.get(conf);
fs.delete(new Path("/mytest"),true);
fs.close();
System.out.println("删除完成");
}
}
对于删除文件或者文件夹的方法源码如下
/** Delete a file.
*
* @param f the path to delete.
* @param recursive if path is a directory and set to
* true, the directory is deleted else throws an exception. In
* case of a file the recursive can be set to either true or false.
* @return true if delete is successful else false.
* @throws IOException
*/
public abstract boolean delete(Path f, boolean recursive) throws IOException;
对于以上的方法,存在是否递归的参数 boolean recursive 如果删除的是一个目录,则该参数必须设置为true ,如果删除的是一个文件,则该参数true 或者false都可以
6.7.6 文件名称的修改
package org.hdfs.test;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class TestRename {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://hadoop01:8020");
FileSystem fs = FileSystem.get(conf);
fs.rename(new Path("/b.txt"), new Path("/c.txt"));
fs.close();
System.out.println("修改完成");
}
}
6.7.7 HDFS 文件的属性信息获得
package org.hdfs.test;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
public class TestStatus {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://hadoop01:8020");
FileSystem fs = FileSystem.get(conf);
// 获取文件的详细属性
RemoteIterator<LocatedFileStatus> listFile =fs.listFiles(new Path("/"), true);
while(listFile.hasNext()) {
LocatedFileStatus status=listFile.next();
// 输出文件的详细信息
//输出文件的名称
System.out.println(status.getPath().getName());
// 输出文件的长度
System.out.println(status.getLen());
//输出文件的权限
System.out.println(status.getPermission());
// 输出文件的块大小
System.out.println(status.getBlockSize());
}
}
}
6.8 通过IO流的方式访问HDFS
6.8.1 通过IO上传文件到HDFS上
package org.hdfs.io.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Test;
public class HDFSTest {
@Test
public void putFile() throws IOException, URISyntaxException {
//1 连接HDFS 文件系统
Configuration conf=new Configuration();
//获得文件系统
FileSystem fs=FileSystem.get(new URI("hdfs://hadoop01:8020"),conf);
// 创建输入流,读取输入文件
FileInputStream input=new FileInputStream(new File("c://a.txt"));
// 创建输出流
FSDataOutputStream out=fs.create(new Path("/gg.txt"));
//IO的流拷贝
IOUtils.copyBytes(input, out, conf);
//关闭资源
IOUtils.closeStream(input);
IOUtils.closeStream(out);
System.out.println("上传完毕");
}
}
6.8.2 通过IO流下载文件到本地
@Test
public void getFile() throws IOException, URISyntaxException {
// 1 连接HDFS 文件系统
Configuration conf = new Configuration();
// 获得文件系统
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop01:8020"), conf);
// 获取输入流 从HDFS上读取
FSDataInputStream input=fs.open(new Path("/gg.txt"));
// 获取输出流
FileOutputStream out=new FileOutputStream(new File("c://gg.txt"));
//流拷贝
IOUtils.copyBytes(input, out, conf);
//关闭流
IOUtils.closeStream(input);
IOUtils.closeStream(out);
System.out.println("下载完成");
}
6.9 HDFS数据流
6.9.1 HDFS文件读取流程
为了了解客户端及与之交互的HDFS,namenode和datanode之间的数据流是什么样的,我们可以通过下图来了解HDFS在读取文件时发生的顺序
1) 客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说,这个对象是DistributedFileSystem通过使用远程调用RPC来调用namenode,以确定文件起始块的位置
2) 对于每一个块NameNode返回存有该块副本的DataNode地址
3)DistributedFileSystem类返回一个FSDataInputStream对象(该对象是一个支持文件定位的输入流)给客户端以便读取数据,接着客户端对这个输入流调用read()方法
4)FSDataInputStream随即连接距离最近文件中第一个块所在的DataNode,通过对数据流反复调用read()方法,可以将数据从DataNode传输到客户端
5) 当读取到块的末端时,FSDataInputStream关闭与该DataNode的连接,然后寻找下一个块的最佳DataNode
6)客户端从流中读取数据时,块是按照打开FSInputStream与DataNode新建连接的顺序读取的。它也会根据需要询问NameNode来检索下一批数据块的DataNode的位置。一旦客户端完成读取,就对FSDataInputStream调用close()方法
在读取数据的时候,如果FSInputStream在与DataNode通信是遇到错误,会尝试从这个块的另外一个最近的DataNode读取数据。它也记住那个故障的DataNode,以保证以后不会反复读取该节点上后续的块。FSDataInputStream会视图从其他DataNode读取其副本,也会将被损坏的块通知给NameNode
6.9.2 HDFS文件写入流程
对于HDFS来说,新建一个文件,把数据写入到该文件,最后关闭文件其数据流程如下: