Hadoop大数据生态系统 实验教程
第1章 欢迎来到大数据世界
1.1 拥抱大数据 当今社会是一个信息爆炸的社会。随着社会的快速发展、科技的发展和信息流通,人们之间的交流越来越密切,生活也越来越方便。在这个高科技时代,大量数据迅速产生。大数据有多大?一组名为互联网上的一天的数据告诉我们,互联网生成的所有内容都可以在一天内刻满1.68亿张DVD;邮件多达2940亿封(相当于美国两年的纸质信件数量);社区帖子200万(相当于《时代》杂志770年的文字量);卖的手机是37.8万个婴儿比世界上每天出生的婴儿高37万个.1万……。 随着移动互联网、移动终端和数据传感器的出现,数据正以超出想象的速度快速增长。近年来,数据量已经从TB级别跃升到PB乃至ZB级别。 合作伙伴产业研究院(PAISI)研究统计,2017 年数据总量将超过 15.2ZB,同比增长 35.7%。到 2018 全球年数据总量为19.4ZB。未来几年全球数据的增长率将是每年 25% 以上,以此计算,到 2020 年,全球数据总量将达到 30ZB,2020 年接近50ZB的数据量。
IBM研究表明,过去两年产生了90%的人类文明获得的所有数据。到了2020年,全球数据规模将达到今天的44倍。全世界每天上传5亿多张图片,每分钟分享20个小时的视频。然而,即使是人们每天创建的所有信息,包括语音通话、电子邮件和信息,以及上传的所有图片、视频和音乐,也无法与人们每天创建的数字信息相匹配。 1.1.1 为什么要学习大数据? 我们有大量的数据,这些数据正在迅速增长。但这是没有用的,就像一堆破碎的金子。如果每个企业都想在这个时代获得竞争优势,他们必须从这些数据中获得有价值的信息,所以我们必须找到存储和分析这些数据的方法。 从以下成功案例中不难看出大数据的神奇魅力。 ? 谷歌的云计算平台在2014年成功预测了世界杯前16名的胜利者。来自谷歌的使用 Opta Sports(-家庭体育数据提供商)的数据评估了过去几个赛季每个职业足球联盟的情况和世界杯小组赛的统计数据。根据对球员在比赛前和比赛中表现的分析,谷歌预测了这些球员在接下来的比赛中会表现如何。 ? 沃尔玛(零售连锁超市)-啤酒和尿布。沃尔玛超市经理在分析销售数据时发现了一个难以理解的现象:啤酒和尿布经常出现在同一个购物篮里。所以啤酒和尿布放在一起销售,并获得了良好的销售收入>2014年推出的百度高考预测在全国18套作文试题中获得12套。 ? 对于体育爱好者来说,几乎不可能放的最新体育赛事几乎是不可能的,因为8000多个电视频道播放了数百场比赛。现在市场上开发了一个可以跟踪所有体育赛事的应用程序RUWT,它已经可以在iOS和Android设备,在Web使用浏览器,它不断分析运动数据流,让球迷知道他们应该转换成他们想看的节目,在电视频道上找到,并让他们在比赛中投票。谷歌电视和TiVo实际上,用户 RUWT就是让他们改变频道,到一场比赛。该程序可以根据活动的紧张程度对比赛进行评分和排名,用户可以通过该应用程序找到值得观看的频道和活动。
大数据已广泛应用于推荐引擎、情感分析、风险建模、欺诈检测、营销活动分析、客户流失分析、社交地图分析、用户体验分析、网络监控等多个领域.产品设计等。作为技术人员,大数据为我们带来了广阔的职业发展空间,能够将我们现有的IT扩大升级项目。
目前大数据流行的就业方向如下。 ? 大数据运维工程师:负责公司大数据平台的部署、管理、优化、监控和报警,确保平台服务7*24运行稳定、可靠、高效。 ? 大数据系统研发工程师:负责大数据分析处理系统的开发。 ? 大数据应用开发工程师:负责在大数据分析处理系统中开发大数据处理应用。 ? 大数据可视化工程师:负责以图像等可视化形式向用户展示数据。 ? 大数据分析师:负责发现数据的价值,设计数据分析算法。 Hadoop,Spark 1.1.2 大数据是什么? 随着大数据时代的到来,大数据已成为互联网信息技术行业的一个流行词。大数据的定义是指传统软件工具无法在一定时间内捕获、管理和处理的数据集。它是一种海量、高增长率、多样化的信息资产,需要新的处理模式才能具有更强的决策能力、洞察力、发现能力和流程优化能力。 大数据有六个特征,我们称之为6V数据量大(Volume)、数据种类繁多(Variety)、处理速度快(Velocity)、价值密度低(Value)、真实性(Veracity) 和临近性(Vicinity)。 1数据量大 人类进入信息社会后,数据自然增长,不以人的意志转移。从1986年到2010年的20多年里,全球数据的数量增长了100倍,未来数据的增长将更快。我们生活在一个数据爆炸的时代。如今,世界上只有25%的设备是互联网,约80%的互联网设备是计算机和手机。在不久的将来,将会有更多的用户成为互联网用户,汽车、电视、家用电器生产机器等设备也将接入互联网。随着Wb2.随着移动互联网的快速发展,人们可以随时随地发布各种信息,包括博客、微博、微信等。未来,随着物联网的推广和普及,各种传感器和摄像头将遍布我们工作和生活的各个角落,这些设备将自动生成大量数据。 综上所述,人类社会正在经历第二次数据爆炸(如果印刷在纸上的文本和图形也被视为数据,那么人类历史上第一次数据爆炸发生在造纸和印刷发明时期)。数据爆炸已经成为大数据时代的一个鲜明特征,因为各种数据产生和数量都远远超出了人类的控制范围。根据著名的咨询机构IDC( Internet Data Center)据估计,人类社会产生的数据每年以50%的速度增长,即每两年翻一番,这被称为大数据摩尔定律。这意味着,人类在最近两年产生的数据量相当于之前产生的全部数据量之和预计到2020年,全球将总共拥有35ZB与2010年相比,数据量将增加近30倍。 单位 换算单位 Byte (字节) 1Byte=8bit KB(千字节) 1KB = 1024B MB(兆字节) 1MB = 1024KB GB(吉字节) 1GB = 1024MB TB(太字节) 1TB = 1024GB PB(拍字节) 1PB = 1024TB EB(艾字节) 1EB = 1024PB ZB(泽字节) 1ZB = 1024EB 2 数据种类繁多 科学研究、企业应用和大数据来源众多Web应用程序不断生成新数据。生物大数据、交通大数据、医疗大数据、电信大数据、电力大数据、金融大数据都呈现出井喷式的增长TB级别跃升到PB级别。大数据类型丰富,包括结构化数据和非结构化数据,其中前者约占10%,主要指存储在关系数据库中的数据;后者约占90%,主要包括邮件、音频、视频、微信、微博、位置信息、链接信息、手机呼叫信息、网络日志等。 对数据处理和分析技术提出了新的挑战,并带来了新的机遇。传统数据主要存储在关系数据库中,但在类似数据中web2.在0等应用领域,越来越多的数据开始存储在非关系数据库中( Not Only SQL, NoSQL)在集成过程中,数据转换是必然的,这是非常复杂和难以管理的。传统的在线分析处理(On-Line Analytical Processing,OLAP)商业智能工具大多面向结构化数据,在大数据时代,用户友好、支持非结构化数据分析的商业软件也将迎来广阔的市场空间。 3 处理速度快 大数据时代的数据生成速度非常快。在Web2.0应用领域,1min内,新浪可生产2万条微博, Twitter苹果可以下载47万个应用程序,淘宝可以销售6万件商品,人人网可以访问30万次,百度可以搜索90万次, Facebook浏览量可产生600万次。著名的大型强子对撞机(LHC,大约每秒产生6亿次的碰撞,每秒生成约700MB数据中有成千上万台计算机分析这些碰撞 大数据时代的许多应用程序需要根据快速生成的数据给出实时分析结果,以指导生产和生活实践。因此,数据处理和分析的速度通常需要达到秒响应,这与传统的数据挖掘技术有本质的不同,而后者通常不需要实时分析结果。 新兴的大数据分析技术通常采用集群处理和独特的内部设计,以实现海量数据快速分析的目的。谷歌 Dreme例如,它是一个可扩展的交互式实时查询系统,用于只阅读嵌套数据的分析。通过结合多级树形执行过程和列数据结构,可以在几秒钟内完成万亿张表的聚合查询,系统可以扩展到成千上万CPU满足谷歌数万用户的操作PB需要级数据,可以在2~3s内完成PB查询等级数据。 4 价值密度低 虽然大数据看起来很漂亮,但价值密度远低于传统关系数据库中现有的数据。在大数据时代,许多有价值的信息分散在海量数据中。以社区监控视频为例。如果没有事故,连续生成的数据毫无价值。当发生盗窃等事故时,只有记录事件过程的短视频才有价值。然而,为了获得盗窃等事故发生时的宝贵视频,我们不得不投入大量资金购买监控设备、网络设备和存储设备,消耗大量电能和存储空间,以保存相机持续传输的监控数据。 如果这个例子不够典型,我们可以想象另一个更大的场景。假设电子商务网站希望通过微博数据进行有针对性的营销,为了实现这一目标,必须建立一个大数据平台,可以存储和分析新浪微博数据,以便根据用户的微博内容预测有针对性的商品需求趋势。愿景很好,但实际成本很高。建立整个大数据团队和平台可能需要数百万元,企业销售利润的最终增长可能远低于投资。从这个角度来看,大数据的价值密度较低。 5 真实性 数据来自不同的来源,需要考虑一些来源的数据(如JD.COM的评论和博客上的帖子)的可信度。 6 临近性 相邻性与大数据的存储有关处理数据的程序和服务器需要就近获取资源,否则会造成大量浪费和效率降低。 1.2 大数据对社会发展的影响 大数据将对社会发展产生深远的影响,具体体现在以下几个方面:大数据决策已成为一种新的决策式,大数据应用促进信息技术与各行业的深度融合,大数据开发推动新技术和新应用的不断涌现。 1.大数据决策成为一种新的决策方式 根据数据制定决策,并非大数据时代所特有。从20世纪90年代开始,数据仓库和商务智能工具就开始大量用于企业决策。但是,数据仓库以关系数据库为基础无论是数据类型还是数据量方面都存在较大的限制。现在,大数据决策可以面向类型繁多的、非结构化的海量数据进行决策分析,已经成为受到追捧的全新决策方式。比如,政府部门可以把大数据技术融入“奥情分析”,通过对论坛、微博、微信、社区等多种来源数据进行综合分析,弄清或测验信息中本质性的事实和趋势,揭示信息中含有的隐性情报内容,对事物发展做出情报预测协助实现政府决策,有效应对各种突发事件。 2.大数据应用促进信息技术与各行业的深度融合 有专家指出,大数据将会在未来10年改变几乎每一个行业的业务功能。互联网、银行、保险、交通、材料、能源、服务等行业领域,不断累积的大数据将加速推进这些行业与信息技术的深度融合,开拓行业发展的新方向。比如,大数据可以帮助快递公司选择运费成本最低的最佳行车路径.协助投资者洗择收益最大化的股票投资组合,辅助零售商有效定位目标客户群体,帮助互联网公司实现广告精准投放,还可以让电力公司做好配送电计划确保电网安全等。 3.大数据开发推动新技术和新应用的不断涌现 大数据的应用需求是大数据新技术开发的源泉。在各种应用需求的强烈驱动下,各种突破性的大数据技术将被不断提出并得到广泛应用,数据的能量也将不断得到释放。在不远的将来,原来那些依靠人类自身判断力的领域应用,将逐渐被各种基于大数据的应用所取代。比如,今天的汽车保险公司,只能凭借少量的车主信息,对客户进行简单类别划分,并根据客户的汽车出险次数给予相应的保费优惠方案,客户选择哪家保险公司都没有太大差别。随着车联网的出现,“汽车大数据”将会深刻改变汽车保险业的商业模式,如果某家商业保险公司能够获取客户车辆的相关细节信息,并利用事先构建的数学模型对客户等级进行更加细致的判定,给予更加个性化的“一对—”优惠方案,那么毫无疑问,这家保险公司将具备明显的市场竞争优势,获得更多客户的青睐。 1.3 大数据、云计算、物联网之间的关系 物联网,云计算,大数据是近两年科技、产业界的热门话题。分别什么意思?之间又有什么关系呢?下面写了一点浅显认识和总结。
物联网 简单理解:物物相连的互联网,即物联网。物联网在国际上又称为传感网,这是继计算机、互联网与移动通信网之后的又一次信息产业浪潮。世界上的万事万物,小到手表、钥匙,大到汽车、楼房,只要嵌入一个微型感应芯片,把它变得智能化,这个物体就可以“自动开口说话”。再借助无线网络技术,人们就可以和物体“对话”,物体和物体之间也能“交流”,这就是物联网。随着信息技术的发展,物联网行业应用版图不断增长。 现在的物联网产业以应用层、支撑层、感知层、平台层以及传输层这五个层次构成。
云计算 云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括网络、服务器、存储、应用软件、服务),这些资源能够快速提供,只需投入很少的管理工作,或与服务商进行很少的交互。 云,是指作为接受服务的对象,不论何时何地,都能享受云计算提供的服务。云计算提供了最可靠、最安全的数据存储中心,用户不用再担心数据丢失、病毒入侵等麻烦。云端平台数据可以共享,可以在任意地点对其进行操作,同时对多个对象组成的网络进行控制和协调,云端各种数据能同时被多个用户使用。简单来说,云计算就是提供基于互联网的软硬件服务。
经典应用案例:苹果icloud 苹果icloud不仅是一个云端硬盘,它可让你轻松访问你所有苹果设备上的一切内容,并自动同步所有设备中的文件、图片、音乐、日程表、邮件、联系人目录,更贴心的是,在你修改文件后还能自动将修改同步到所有苹果设备并对旧文件备份。你可以选择免费的5G存储空间,也可以每年花费24.99美元购买iTunes Match服务,这样一来,你可以通过任何苹果设备收听存放在苹果云服务器中的音乐。 物联网和云计算的关系 云计算相当于人的大脑,是物联网的神经中枢。云计算是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。 大数据与云计算的关系 大数据与云计算的关系就像一枚硬币的正反面一样密不可分。大数据必然无法用单台的计算机进行处理,必须采用分布式架构。它的特色在于对海量数据进行分布式数据挖掘。但它必须依托云计算的分布式处理、分布式数据库和云存储、虚拟化技术。 大数据、云计算和物联网的关系 物联网对应了互联网的感觉和运动神经系统。云计算是互联网的核心硬件层和核心软件层的集合,也是互联网中枢神经系统萌芽。大数据代表了互联网的信息层(数据海洋),是互联网智慧和意识产生的基础。包括物联网,传统互联网,移动互联网在源源不断的向互联网大数据层汇聚数据和接受数据。云计算与物联网则推动了大数据的发展。 1.4 大数据处理流程 大数据并非单一的数据或技术,而是数据和大数据技术的综合体。大数据技术主要包括数据采集、数据存储、数据清洗或预处理、数据处理和分析四个环节。
- 收集:原始数据种类多样,格式、位置、存储、时效性等迥异。数据收集从异构数据源中取出或利用日志采集工具把实时采集的数据收集并转换成相应的格式方便处理。
- 存储:收集好的数据需要根据成本、格式、查询、业务逻辑等需求,存放在合适的存储中,方便进一步的分析。
- 数据清洗/预处理:原始数据需要变形与增强之后才适合分析,比如网页日志中把IP地址替换成省市、传感器数据的纠错、用户行为统计等。
- 分析:通过整理好的海量数据处理和分析,对分析结果进行可视化呈现,帮助人们更好的理解数据,分析数据和进行企业决策。分析分为离线数据分析和实时查询分析两种,离线处理就是每天定时处理,最后输出结果或进行展示。实时查询分析是将产生的数据实时进行处理。
1.5 大数据的学习方法 归功于大数据处理系统的发展,以 Hadoop为代表的解决方案和工具逐渐成熟,进行大数据应用开发的门槛正在逐渐降低。本书就是学习如何使用Hadoop完成大数据解决方案。学习Hadoop,仅仅需要了解一些 Linux的操作,以及Java编程基础知识就足够进行大数据课程的学习。对于Linux要了解常用的 shell命令和操作,如安装软件、解压包、配置环境变量等对于Java基础要了解面向对象的概念、集合类, Eclipse的使用等。 针对初学者来说,Hadoop运行环境的安装是个门槛,很大程度上是由于大家对于Linux系统相对不熟悉而实际上Hadoop的安装并不复杂。在配置运行环境时可先简单了解配置步骤与方法按教材所示步骤逐步完成,待后面讲解每个模块时再回顾各配置属性的具体含义。 首先要明确一点,Hadoop解决了大数据的存储和数据处理作业的并行运算这两个问题。幸运的是,这两个核心模块对开发人员都是透明的,也就是说我们不用去关心它是如何进行底层的分布式存储与计算,仅需要我们能够使用 Hadoop提供的HDFS文件管理命令和 MapReduce并行计算的API即可让 Hadoop为我们处理大数据 1.6 大数据的就业方向 大数据作为一种趋势,已经吸引了越来越多的重视,目前,上至国家部委、下至普通公司,已纷纷开展大数据平台的建设和应用,大数据人员的需求在极速扩大,具体的岗位有以下几个。 一是大数据平台架构与研发:从事底层的大数据平合研发,这类从业者难度最高,适合于前沿技术机构,要不断发现与改进目前大数据技术的缺陷,对于形成稳定版本的大数据平台,要面向业界进行推广。这类岗位整体数量不多,但方向会比较专注。这个岗位不是我们核心岗位。 二是大数据平台应用开发:从事大数据平台应用技术的开发工作,满足大量企事业单位使用大数据平台的需求,这类岗位会比较充足,需要不断学习各类大数据平台,并应用到开发项目中。 三是大数据平台集成与运维:从事大数据平台的集成与运维工作。对于大量的企事业单位的大数据部署与常规应用来说,需要有专职的集成人员进行集成安装与调试,需要定期运维人员进行运维与提供技术保障,这类岗位也会比较充足,但需要熟练掌握大数据平台的使用,针对问题能够及时解决。 四是大数据平台数据分析与应用:从事数据分析、预测与应用工作,借助于大数据平台,分析各类业务数据,并服务于业务,这类岗位跟业务休戚相关,一些对数据高度重视的机构,如精确广告营销、大数据安全分析等单位,对此会有充足的人才需求。 五是大数据技术培训与推广:从事大数据技术教育与培训工作。这类工作机构会随着大数据人才需求热度的提高而不断增加岗位人数,与此同时,随着推广程度的延伸,也促生更多的机构,更多的人才加入大数据领域。 六是大数据可视化开发:从事大数据可视化开发,借助大数据平台,可视化工具将各类数据转化成图表的形式展示。需要熟练地使用sql,这类岗位会比较充足。 七是ETL开发:从事数据处理,构建数据仓库重要一环。主要技术发展方向侧重与数据库、或大批量数据处理方向,今后可以向数据库开发工程师、数据库架构师、数据分析师等方面发展。 二三四五岗位是我们的核心岗位。
本章小结:
第2章 Hadoop简介
2.1结构化、半结构化、非结构化数据的理解 记得在课上,老师说,结构化数据就是我们关系数据库里的表,剩下的都是半结构化和非结构化数据,好比XML文档就是半结构化数据,WORD文档就是非结构化数据,大数据就是半结构化和非结构化数据。心中一直有一个疑问?难道大数据不应该包含结构化数据吗?实在学习数据库这门课时,就对这几个概念有所混淆,所幸今天在书中发现了比较清晰的解释,记录下来,方便以后参考。 1.结构化数据 定义:业界是指关系模型数据,即以关系数据库表形式管理的数据 简析:虽然专业角度上看,结构化就是关系模型的说法并不准确,但针对目前业内现状,还是定义为关系模型最为妥善,因为它准确的代表了我们传统上最熟悉的企业业务数据。 2.半结构化数据 定义:非关系模型的、有基本固定结构模式的数据,例如日志文件、XML文档、JSON文档、Email等。 3.非结构化数据 定义:没有固定模式的数据,如WORD、PDF、PPT、EXCEL,各种格式的图片、视频等。 简析:区分半结构化与非结构化的意义在于,对两者的处理方法是不同的,非结构化数据大多采用内容管理方法,而半结构化数据基本没有有效的管理方法。 总结 结构化、半结构化、非结构化其实是按照数据格式分类。 严格讲,结构化与半结构化数据都是有基本固定结构模式的数据 半结构与非结构化数据与目前流行的大数据之间只是有领域重叠的关系,本质讲两者并无必然联系。 业界有将大数据认同为半结构/非结构化数据,是因为大数据技术最初是在半结构化数据领域发挥作用,其本质是将数据处理技术与数据格式混淆,是不正确的。 大数据包括结构化、半结构化和非结构化数据,非结构化数据越来越成为数据的主要部分。据IDC的调查报告显示:企业中80%的数据都是非结构化数据。 2.2 Hadoop概述 我们以前学习了数据库知识,知道数据库主要保存和处理结构化数据。而Hadoop除了可以处理结构化数据,还可以处理非结构化和半结构化数据。事实上,Hadoop已经成为存储、处理和分析大数据的标准平台。当人们说要搭建大数据平台时,很多时候默认就是搭建Hadoop平台。 Hadoop可以存储以下类型的内容。 结构化数据 半结构化的数据,比如日志文档 完全没有结构的内容,比如文本文件 二进制数据,比如音频、视频等 Hadoop系统有以下特点。 可靠性高 可扩展性好 性价比高 灵活 本节简要介绍Hadoop的起源、发展历史、特征、应用现状和版本演变。 2.2.1 Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台,为用户提供了系统底层细节透明的分布式基础架构。所谓分布式架构可以看做将海量的数据保存在成千上万台普通的电脑上,并且数据进行了冗余备份保存。就像找多头牛一起拉货比培养一头更强壮的牛容易。同理,对于单机无法解决的问题,综合利用多个普通的机器比打造一台超级计算机更加可行,这就是Hadoop的设计思想。Hadoop是基于Java语言开发的,具有很好的跨平台特性,并且可以署在廉价的计算机集群中。 Hadoop的核心有两个,分别是分布式文件系统(Hadoop Distributed File Systen,HDFS)和 MapReduce。HDFS是针对谷歌文件系统( Google File System,GFS)的开源实现,是面向普通硬件环境的分布式文件系统,具有较高的读写速度、很好的容错性和可伸缩性,支持大规模数据的分布式存储,其冗余数据存储的方式很好地保证了数据的安全性。MapReduce是针对谷歌 MapReduce的开源实现,允许用户在不了解分布式系统底层细节的情况下开发并行应用程序,采用MapReduce来整合分布式文件系统上的数据,可保证分析和处理数据的高效性。借助于Hadoop程序员可以轻松地编写分布式并行程序,将其运行于廉价计算机集群上,完成海量数据的存储与计算。 Hadoop的目标是从单一的服务器扩展到成千上万的机器,将ZB级的数据保存在集群中的电脑中,每台电脑提供本地计算和存储,并且将存储的数据备份在多个节点,由此提升集群的可用性,而不是通过硬件提升。当一台机器宕机时,其他节点依然可以提供备份数据和计算服务。 Hadoop被公认为行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力。几乎所有主流厂商都围绕 Hadoop提供开发工具、开源软件、商业化工具和技术服务,如谷歌、雅虎、微软、思科、淘宝等都支持 Hadoop。 2.2.2 Hadoop的发展简史 Hadoop这个名字郎朗上口,至于为什么要取这样一个名字,其实并没有深奥的道理,只是追求名称简单、容易发音和记忆而已。很显然,小孩子是这方面的高手,大名鼎鼎的“Google”就是由小孩子给取名的。Hadoop同样如此,它是一个小孩子取的名字,意思是“一头吃饱了的棕黄色大象”,如图2.1所示。Hadoop后来的很多子项目和模块的命名方式都沿用了这种风格。如猪(Pig)、蜂巢(Hive)、动物园管理员(zookeeper)。
Hadoop最初是由Apache Lucene项目的创始人Doug Cutting开发的文本搜索库。Hadoop源自2002年的Apache Nutch项目----一个开源的网络搜索引擎并且也是 Lucene项目的一部分。在2002年的时候,Nutch项目遇到了棘手的难题,该搜索引擎框架无法扩展到拥有数十亿网页的网络。而就在一年以后的2003年,谷歌公司发布了分布式文件系统GFS方面的论文,可以解决大规模数据存储的问题。于是在2004年,Nutch项目也模仿GFS开发了自己的分布式文件系统(Nutch Distributed FileSystem,NDFS),也就是HDFS的前身。 2004年,谷歌公司又发表了另一篇具有深远影响的论文,阐述了 MapReduce分布式编程思想。2005年,Nutch开源实现了谷歌的 MapReduce。到了2006年2月,Nutch中的NDFS和 MapReduce开始独立出来,成为 Lucene项目的一个子项目,称为 Hadoop,同时 Doug Cutting加盟雅虎。2008年1月, Hadoop正式成为 Apache顶级项目,Hadoop也逐渐开始被雅虎之外的其他公司使用。2008年4月,Hadoop打破世界纪录,成为最快排序1TB数据的系统,它采用一个由910个节点构成的集群进行运算,排序时间只用了209s。在2009年5月, Hadoop更是把1TB数据排序时间缩短到62s。 Hadoop从此声名大噪,迅速发展成为大数据时代最具影响力的开源分布式开发平台并成为事实上的大数据处理标准。
2.2.3 Hadoop的特征 Hadoop是一个能够对大量数据进行分布式处理的软件框架,并且是以一种可靠、高效、可伸缩的方式进行处理的,它具有以下几个方面的特性。 高可靠性。采用冗余数据存储方式,即使一个副本发生故障,其他副本也可以保证正常对外提供服务。 高效性。作为并行分布式计算平台,Hadoop采用分布式存储和分布式处理两大核心技术,能够高效地处理PB级数据。 高可扩展性。 Hadoop的设计目标是可以高效稳定地运行在廉价的计算机集群上,可以扩展到数以千计的计算机节点上。 高容错性。采用冗余数据存储方式,自动保存数据的多个副本,并且能够自动将失败的任务进行重新分配。 成本低。 Hadoop采用廉价的计算机集群,成本比较低,普通用户也很容易用自己的PC搭建 Hadoop运行环境。 运行在 Linux平台上。Hadoop是基于Java语言开发的,可以较好地运行在 Linux平台上。 支持多种编程语言。 Hadoop上的应用程序也可以使用其他语言编写,如C++。 2.2.4 Hadoop的版本 Hadoop的版本比较混乱,总的来说,Hadoop分为两代,如表2.1所示。 Apache Hadoop 大版本 说明 Hadoop 3.0 3.x.x 第二代Hadoop 2.0 2.x.x 下一代Hadoop由0.23.x演化而来 0.23.x 下一代Hadoop 第一代Hadoop 1.0 1.0.x 稳定版,由0.20.x演化而来 0.22.x 非稳定版 0.21.x 非稳定版 0.20.x 经典版本,最后演化成1.0.x Apache Hadoop版本分为两代,第一代Hadoop称为Hadoop 1.0,包含0.20.x,0.21.x,0.22.x,最后0.22.x演化为稳定版1.0.x。Hadoop2.0指的是0.23.x,2.x.x。在本课程中,我们将选择Hadoop2.6.5。 第二代Hadoop一个重大的变化是重构了MapReduce。Hadoop的下载地址为http://hadoop.apache.org/release.html。 2.3 Hadoop体系结构 Hadoop源自Google在2003到2004年公布的关于GFS(Google File System),MapReduce和BigTable三篇论文,创始人是Doug Cutting,Hadoop现在是Apache基金会顶级项目。 2.3.1 Hadoop的核心 前面提过HDFS和 MapReduce是Hadoop的两大核心。通过HDFS来实现对分布存储的底层支持达到高速并行读写与大容量的存储扩展。通过 MapReduce实现对分布式并行任务处理程序支持,保证高速分析处理数据。HDFS在 MapReduce任务处理过程中提供了对文件操作和存储的支持MapReduce在HDFS的基础上实现了任务的分发、跟踪,、执行等工作,并收集结果,二者相互作用完成了Hadoop分布式集群的主要任务。 2.3.2 Hadoop子项目 经过多年的发展,Hadoop生态系统不断完善和成熟,随着整个Hadoop生态圈已发展成为包含很多子项目的集合。除了HDFS和MapReduce两个核心内容之外还包括Hive、HBase、Yarn、ZooKeeper等。下面是Hadoop的项目结构如图2.2所示。下面分别对它们进行简单介绍。
- HDFS:Hadoop分布式文件系统,是Hadoop生态系统的核心和基石。是谷歌文件系统(Google File System,GFS)的开源实现。HDFS的设计思路是将ZB级超大数据保存在廉价的大型服务器集群上,数据可以同时备份多地。并且把硬件故障作为一种常态来考虑,能够保证在部分硬件发生故障时仍然能够保证文件系统的整体可用性和可靠性。
- MapReduce/Yarn:并行编程模型。Yarn是第二代的MapReduce框架。MapReduce允许用户在不了解分布式系统底层细节的情况下开发并行应用程序,并将其运行于计算机集群上,完成海量数据的处理。通俗地说,MapReduce的核心思想就是“分而治之”,它把需要处理的数据集切分为若干独立的数据块,分发到各个分节点来共同并行完成;最后将所有的结果合并成最终的结果。
- Hive:Hive是一个基于Hadoop的数据仓库工具,提供类似SQL语言的查询方式对Hadoop中的数据进行查询,这种类似SQL的语言称为Hive QL。Hive QL语言底层转换为MapReduce任务进行处理,而不必开发专门的MapReduce应用。处理具有一定结构的文件。
- HBase:全称为Hadoop Database,Hadoop的分布式,面向列的数据库,来源于Google的BigTable论文,HBase的底层一般采用HDFS进行数据存储,主要用于随机访问、实时读写的大数据。HBase与传统的数据库的一个重要的区别是一个采用列的方式存储,一个采用行的方式存储。
- ZooKeeper:是一个为分布式应用所设计的协调服务,主要是为用户提供同步、配置管理、分组和命名等服务,减轻分布式应用程序所承担的协调服务。我们说过,Hadoop生态系统的子项目喜欢用动物的名称命名,zookeeper的中文意思是动物园管理员,就是用来管理Hadoop的各个子项目的。
- Sqoop:Sqoop是SQL-to-Hadoop的缩写,主要用来在Hadoop和关系型数据库之间交换数据。通过Sqoop可以方便地将数据从MySQL、Oracle、PostgreSQL等关系型数据库中导入Hadoop,或者将数据从Hadoop导出到关系数据库。Sqoop主要通过JDBC完成和关系型数据库进行交互,理论上支持JDBC的关系型数据库都可以和Sqoop交互。
- Flume:日志采集系统。
- Kafka:Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。
- Pig:一个对大型数据集进行分析、评估的平台,主要作用类似于数据库里的存储过程。
- Oozie:可以将多个MapReduce作业组合到一个逻辑工作单元中,进行工作计划的安排,类似于工作流管理引擎。
2.4 安装Hadoop的预备内容 学习本章内容之前,必须先安装下面的两个软件 VMware Workstation CentOS6.5 这两个软件在Linux应用一书中已经讲过,本书不再赘述。在Linux安装Hadoop之前,需要先安装两个必要的程序:
- JDK1.7或更高版本
- SSH(安全外壳协议),主要用于主机间的免密码登录。Hadoop需要通过SSH来启动Slave列表(Hadoop组件集群中分为Master和Slave两个角色,Master是管理者,Slave是被管理者,是存储数据的主机列表,通常由Master启动Slave。)中各台主机的守护进程,这里推荐OpenSSH。一般默认CentOS已经安装了OpenSSH,所以只需进行SSH配置即可。 SSH是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。 SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。 本节讲解安装Hadoop的预备内容,包括以下内容:
- 静态IP的设置
- 修改主机名和域名测试
- JDK的安装和配置
- SSH免密码配置 下一章讲解Hadoop的具体安装步骤。 2.4.1 静态IP的设置 (1)在Linux系统命令终端,执行命令 cd /etc/sysconfig/network-scripts 切换到该目录并查看该目录下的文件ifcfg-eth0,如图所示。
(2) 在Linx系统命令终端,执行命令 vim ifcfg-eth0,并修改文件的内容。 按“键入编辑内容编译完成后按Esc键退出编译状态,之后执行命令wq,保存并退出。 IPADDR、 NETMASK、 GATEWAY、DNS1的值可以根据自己的本机进行修改,如下所示。 DEVICE=“eth0” #设备名字 BOOTPROTO=“static” #静态ip HWADDR=“00:0C:29:ED:83:F7” #mac地址 IPV6INIT=“yes” NM_CONTROLLED=“yes” ONBOOT=“yes” #开启自启动 TYPE=“Ethernet” #网络类型 UUID=“28354862-67a7-4a5b-9f9a-54561401f614” IPADDR=192.168.140.128 #IP地址 NETMASK=255.255.255.0 #子网掩码 GATEWAY=192.168.140.2 #网关 DNS1=192.168.140.2 # dns
如何设置IPADDR、NETWASK、GATEWAY、DNS1,使用下面的方法: 单击VMWare WorkStation编辑菜单下的虚拟网络编辑器菜单,打开虚拟网络编辑器窗体。选择VMnet8,如下图所示。
单击NAT设置按钮显示下图。
点击DHCP设置按钮显示下图。
注意: IPADDR是自定义的地址,但是必须和192.168.140.x匹配,x自定义 NETMASK在刚才的图片中显示 GATEWAY在刚才的图片中显示,DNS1和GATEWAY相同 (3)配置iP地址完毕之后,在命令终端的任意目录下,执行命令 ifconfig,查看配置效果,如图所示。
注意:执行ifconfig前必须保证网络畅通,如下图所示。
(4)在命令终端的任意目录下重启服务,执行命令 [root@hadoop network-scripts]# reboot (5) ping ip地址看是否安装成功,如图所示。
注意:执行ping前必须保证网络畅通,按ctrl+z退出。 2.4.2修改主机名和域名映射 (1)启动命令终端,在任何目录下执行命令cd /etc/sysconfig,切换到该目录并查看目录下的文件,可以发现存在文件 network,如图所示。
(2)在/etc/sysconfig目录下找到文件 network,然后执行命令 vim network,按“i”进入编辑内容,编译完成后按Esc退出编译状态,之后执行命令wq保存并退出,如下图所示修改了主机名,主机名是我们刚才安装Linux时的主机名(hadoop是我们刚才安装时设置的主机名)。
(3)修改主机名和IP地址具有映射关系,执行命令vim /etc/hosts,按“i”进入编辑内容,编译完成后按Esc退出编译状态,之后执行命令wq保存并退出,如图所示。
前面是设置的静态IP地址,后面的是主机名。 一旦修改过主机名和域名映射,重启Linux会显示下图。
2.4.3 JDK的安装和配置 (1)启动 Linux命令终端,创建目录mkdir /usr/java,执行命令cd/usr/java,切换到该目录下 [root@hadoop ~]# mkdir/usr/java [root@hadoop ~]# cd /usr/java (2)把JDK文件jdk-8u181-linux-x64.tar.gz上传到该目录下 (3)然后对/usr/java目录下的JDK压缩文件jdk-8u181-linux-x64.tar.gz,执行命令 对jdk-8u181-linux-x64.tar.gz进行解压 [root@hadoop java]# tar -xzvf jdk-8u181-linux-x64.tar.gz (4)解压之后,执行命令ll,可以看到该目录下多了一个解压后的JDK文件,如图2-43所示。
(5)完成上一步之后,可以执行cd jdk1.8.0_181,进入JDK安装目录
(6)确定解压无误之后,此时需要配置JDK环境变量,执行命令 vim /etc/profile 单击”i“进入编辑内容,编译完成后按Esc退出编译状态,之后执行命令wq保存并退出。如图
(7)编辑完后进行配置文件刷新,执行命令 source /etc/profile,刷新配置,配置的信息才会生效,如图所示。 [root@hadoop Desktop]# source /etc/profile (8)完成以上步骤之后,需要测试环境变量是否配置成功,只需要在任何目录下执行 [root@hadoop Desktop]# java -version 如图,出现下图情况就是配置成功。
2.4.4 SSH免密码配置 SSH是 Secure Shell的缩写,由IETF的网络工作小组制定。SSH是建立在应用层和传输层上的安全协议,专为远程登录会话和其他网络服务提供安全性的协议。 Hadoop集群的节点之间的通信应该设置为不用密码交互,否则节点之间每次通信都需要输入密码,会给集群运行带来很大麻烦。使用SSH公钥登录可以解决这个问题,省略掉节点通信需要输入密码的步骤。 先在本机上实现SSH免密码登录实质上是使用一对加密字符串,一个称为公钥,另一个称为私钥。公钥对任何人都可见,而私钥仅对拥有者可见。 (1)在Linux系统的终端的任何目录下通过切换cd ~/.ssh,进入到.ssh目录下。 [root@hadoop Desktop]# cd ~/.ssh ~表示当前用户的home目录,通过cd ~可以进入到你的home目录。.开头的文件表示隐藏文件,这里.ssh就是隐藏目录文件。 (2)在Linux系统命令框的.ssh目录下,执行ssh-keygen命令。 [root@hadoop .ssh]# ssh-keygen -t rsa
(连续按三次回车)执行完上面命令后,会生成两个id_rsa(私钥)、id_rsa.pub(公钥)两个文件,如图所示。
(3)授权SSH免密码 [root@hadoop .ssh]# ssh-copy-id hadoop 相当于该主机给自己设置免密码登录,hadoop是刚才设置的主机名。根据提示输入yes并输入访问主机所需要的密码。
(4)执行ssh Hadoop命令,发现不需要密码就能使用ssh命令连接Hadoop主机了。 [root@hadoop .ssh]# ssh hadoop 如图所示,注意hadoop是刚才设置的主机名。
注意一旦执行ssh命令后,需要使用exit命令注销ssh连接。 如果没有执行步骤(3),会显示下面的信息,如下图所示。
2.4.5 xshell连接Linux (1)新建会话 单击”文件”菜单下的”新建…”,打开”新建会话属性”对话框,输入名称和主机。 名称可以任意起,主机是2.3.1中设置的静态IP地址。
(2)用户身份验证 选择用户身份验证,输入用户名和密码,单击确定。
(3)连接 选择创建好的会话,单击连接。
第3章 Hadoop实验:Hadoop环境的搭建
3.1 实验目的 1.了解如何搭建单机版和伪分布式集群 2.熟悉Linux的基本命令 3.2 实验要求 1.搭建Hadoop集群 2.通过SSH工具登录集群服务器 注意:本章搭建Hadoop集群时有很多没有讲过的知识,后面章节我们会完整讲解。
3.3 Hadoop环境搭建 本节讲解Hadoop的环境搭建,Hadoop有三种运行模式。 单机运行模式(standalone或local mode):单机模式是Hadoop的默认模式。Hadoop会完全运行在本地。因为不需要与其他节点交互,单机模式不使用HDFS,也不加载任何Hadoop的守护进程。由于在本机模式下测试和调试MapReduce程序较为方便,因此,这种模式适宜用在开发阶段。
伪分布式模式:在本地机器上模拟一个小规模的集群,但是集群中只有一个节点,Hadoop守护进程运行在这个节点上。换句话说,可以配置一台机器的Hadoop集群,伪分布式是完全分布式的一个特例。
完全分布式模式:Hadoop运行在一个集群上,集群中有多个节点(每个节点可以是一个物理机器或VMWare WorkStation上的一个Linux虚拟机),每个节点都有各自的Hadoop守护进程。
注意:守护进程(Daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。 分布式模式要启动守护进程。即使用分布式hadoop时,要先启动一些准备程序进程,然后才能执行分布式的命令。而本地模式不需要启动这些守护进程。 伪分布式安装是指在一台机器上模拟一个小的集群,但是这个集群中只有一个节点。需要说明的是,在一台机器上也是可以实现完全分布式安装(而不是伪分布式),只需要在一台机器上安装多个Linux虚拟机,每个虚拟机成为一个节点,这时就可以实现Hadoop的完全分布式安装。本节只介绍伪分布式安装,后面当我们学习HDFS、MapReduce等相关概念后,再讲解单机下的完全分布式安装。
Hadoop的组件配置,均可以利用XML文件进行配置,有以下的5个配置文件,具体配置作用见表3.1。这些文件都存储在hadoop安装目录下的etc/hadoop子目录中。 配置文件名 配置文件功能 etc/hadoop/hadoop-env.sh 配置JAVA_HOME core-site.xml 配置通用属性 hdfs-site.xml 配置HDFS的属性 mapred-site.xml 配置MapReduce属性 yarn-site.xml 配置YARN属性 下面我们介绍两种Hadoop运行方式:分别是单机运行安装和伪分布式安装Hadoop。 3.3.1 Hadoop单机运行安装
-
启动 Linux命令终端 [root@hadoop Desktop]# mkdir /usr/hadoop [root@hadoop Desktop]# cd /usr/hadoop, 切换到该目录下,把Hadoop文件上传到该目录下
-
然后对/usr/hadoop目录下的Hadoop压缩文件hadoop-2.6.5.tar.gz [root@hadoop Desktop]# tar -zxvf hadoop-2.6.5.tar.gz -C /usr/hadoop -C是指解压压缩包到指定位置
-
切换到$HADOOP_NAME/etc/hadoop 目录下并查看该目录下的包,如图 [root@hadoop Desktop]# ls
-
在$HADOOP_NAME/etc/hadoop目录下 [root@hadoop Desktop]# vim hadoop-env.sh 按“i”键进入编辑内容,在文件中添加如下内容: export JAVA_HOME=/usr/java /jdk1.8.0_181 编写完成后,按ESC退出编辑状态,之后执行命令wq!保存并退出
注意:$HADOOP_NAME目录是/usr/hadoop/hadoop-2.6.5 因为Hadoop是使用Java语言开发的,所以这里在Hadoop的环境文件中增加了JAVA_HOME。
-
在$HADOOP_NAME/etc/hadoop目录下执行命令vim yarn-site.xml,并修改配置文件yarn-site.xml ,内容如下 <!—获取数据的方式–> yarn.nodemanager.aux-services mapreduce_shuffle 上面的参数yarn.nodemanager.aux-services,是NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序。
-
开启Hadoop进程,切换到$HADOOP_NAME/sbin目录,执行命令。 [root@hadoop sbin]# start-all.sh 或 [root@hadoop sbin]# ./start-all.sh
-
用jps查看进程。 jps是JDK提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。如下所示。
如果显示ResourceManager和NodeManager进程,表示MapReduce/Yarn启动了。 8. 关闭Hadoop进程,切换到$HADOOP_NAME/sbin目录,执行命令。 [root@hadoop Desktop]# stop-all.sh 或 [root@hadoop Desktop]# ./stop-all.sh 9. 在浏览器的地址栏输入http://192.168.140.128:8088/cluster(ResourceManager运行在主节点master上,可以Web控制台查看状态),如下图所示。
注意:地址栏输入的网址”192.168.140.128”是第二章设置的静态IP地址。 3.3.2 Hadoop伪分布式安装 注意:Hadoop单机运行安装和Hadoop伪分布式安装很多步骤是相同的,我们可以创建一个新的虚拟机操作一下步骤。
-
启动 Linux命令终端 [root@hadoop Desktop]# mkdir /usr/hadoop [root@hadoop Desktop]# cd /usr/hadoop, 切换到该目录下,把Hadoop文件上传到该目录下
-
然后对/usr/hadoop目录下的Hadoop压缩文件hadoop-2.6.5.tar.gz [root@hadoop hadoop]# tar -zxvf hadoop-2.6.5.tar.gz -C /usr/hadoop -C是指解压压缩包到指定位置 [root@hadoop hadoop]# ls hadoop-2.6.5 hadoop-2.6.5.tar.gz 解压缩后的目录为hadoop-2.6.5,这个目录是$HADOOP_NAME。
-
切换到$HADOOP_NAME/etc/hadoop 目录下并查看该目录下的包。 [root@hadoop hadoop]# ls
-
在$HADOOP_NAME/etc/hadoop目录下 [root@hadoop hadoop]# vim hadoop-env.sh 按“i”键进入编辑内容,在文件中修改如下内容。
The java implementation to use.
export JAVA_HOME=${JAVA_HOME} 修改为 export JAVA_HOME=/usr/java/jdk1.8.0_181 修改完成后,按ESC退出编辑状态,之后执行命令wq保存并退出。
-
在$HADOOP_NAME/etc/hadoop目录下执行命令vim core-site.xml,并修改配置文件core-site.xml ,内容如下 <!—指定fs的缺省名称 这是一个描述集群中NameNode结点的URI(包括协议、主机名称、端口号),集群里面的每一台机器都需要知道NameNode的地址。DataNode结点会先在NameNode上注册,这样它们的数据才可以被使用。 –> fs.default.name hdfs://hadoop:9000 <!—指定HDFS的(Namenode)的缺省路径地址:Hadoop是计算机名,也可以是ip地址, 注意:Hadoop2.x后fs.defaultFS已经替换了fs.default.name,这里我还是加上了。 –> fs.defaultFS hdfs://hadoop:9000 <!—指定Hadoop运行时产生文件的存储目录 --> hadoop.tmp.dir /hadoop/tmp 注意: 红色的hadoop是当前的主机名,一定要根据当前主机名进行相应修改。 /hadoop/tmp目录会自动产生。
-
在$HADOOP_NAME/etc/hadoop目录下执行命令vim hdfs-site.xml,并修改配置文件hdfs-site.xml ,内容如下 dfs.replication 1 dfs.name.dir /hadoop/name dfs.data.dir /hadoop/data 注意: /hadoop/name和/hadoop/data目录会自动产生。
-
在$HADOOP_NAME/etc/hadoop目录下查看是否有配置文件mapred-site.xml。目录下默认情况下没有该文件,可通过执行命令,修改一个文件的命名 mv mapred-site.xml.template mapred-site.xml 然后执行命令,并修改配置文件mapred-site.xml vi mapred-site.xml 内容如下: <!—指定mr运行在yarn上-> mapreduce.framework.name yarn
-
在$HADOOP_NAME/etc/hadoop目录下执行命令vim yarn-site.xml,并修改配置文件yarn-site.xml ,内容如下 <!—指定resourcemanager 的地址,value是主机名–> yarn.resourcemanager.hostname hadoop <!—获取数据的方式–> yarn.nodemanager.aux-services mapreduce_shuffle 注意: yarn.resourcemanager.hostname的value值是当前主机名。
-
执行命令vi /etc/profile,把Hadoop的安装目录配置到环境变量中,如图
-
然后让配置文件生效,执行命令 [root@hadoop Desktop]# source /etc/profile
-
格式化namenode。在任意目录下(配置Hadoop环境变量的情况下)执行命令 [root@hadoop Desktop]# hdfs namenode -format 或者 [root@hadoop Desktop]# hadoop namenode -format 实现格式化。 注意:这个命令在Hadoop创建使用一次,以后不用。如果以前已经格式化过了。需要格式化的时候需要先删除Hadoop的临时缓存目录也就是我们在core-site.xml里面配置的hadoop.tmp.dir。
-
启动Hadoop进程,首先启动HDFS系统,在$HADOOP_NAME/sbin目录下 [root@hadoop sbin]# ./start-dfs.sh 然后用jps查看进程,如图
-
启动YARN,在$HADOOP_NAME/sbin目录下,执行命令 [root@hadoop sbin]# ./start-yarn.sh 然后用jps查看进程,如图
注意:执行hadoop代码时,有时会产生下面的异常: 18/12/18 06:56:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable 需要修改$HADOOP_HOME/etc/hadoop/log4j.properties文件,添加以下内容。 log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
- 测试HDFS和YARN,首先在浏览器地址栏中输入http://192.168.140.128:50070 下面显示HDFS管理界面,如下图所示。
在浏览器的地址栏输入http://192.168.140.128:8088 下面显示MapReduce的管理页面,如下图所示。
注意:上面的IP地址必须是第二章2.4.1设置的本地IP。 14. 关闭HDFS系统,在$HADOOP_NAME/sbin目录下,执行命令 [root@hadoop sbin]# ./stop-dfs.sh
- 关闭YARN系统,在$HADOOP_NAME/sbin目录下,执行命令 [root@hadoop sbin]# ./stop-yarn.sh
第4章 分布式文件系统HDFS
4.1 Hadoop概述 大数据时代必须解决海量数据的高效存储问题。为此,谷歌开发了分布式文件系统(Google File System,GFS),通过网络实现文件在多台机器上的分布式存储,较好的满足了大规模数据存储的需求。Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)是针对GFS的开源实现,它是Hadoop两大核心组成部分之一,提供了在廉价服务器集群中进行大规模分布式文件存储的能力,HDFS具有很好的容错能力,并且兼容廉价的硬件设备,因此可以以较低的成本利用现有机器实现大流量和大数据量的读写。 4.1.1 计算机集群结构 计算机集群简称集群,是一种分布式计算机系统, 它通过一组松散集成的计算机软件或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。 节点可能代表的是一台计算机这样的物理节点,在有数据传入和输出的点都也可以叫节点。 分布式文件系统把文件分布存储到多个计算机节点上,成千上万的计算机节点构成计算机集群。与之前使用大量的高性能处理器和专用高级硬件的昂贵大型机不同的是,目前的分布式文件系统所使用的计算机集群都是由普通硬件构成,这大大降低了硬件上的开销。 计算机集群的基本架构如图所示。集群中的计算机节点存放在机架(Rack)上,每个机架上可以存放8~64个节点,同一机架上的不同节点之间通过网络互连,多个不同机架之间采用交换机互练。
分布式文件系统由块组成,如HDFS的块大小有64MB,如果一个文件小于一个数据块大小,它并不占用整个数据块的存储空间。 分布式文件系统在物理结构上是由计算机集群中的多个节点构成的,如图4-2所示。这点分为两类:一类叫“主节点”(Master Node),或者也被称为“名称节点”(NameNode);另类叫“从节点”(Slave Node),或者也被称为“数据节点”(DataNode)。名称节点负责文件和目录的创建、删除和重命名等,同时管理着数据节点和文件块的映射关系,因此客户端只有访问名称节点才能找到请求的文件块所在的位置,进而到相应位置读取所需文件块。数据节点负责数据的存储和读取,在存储时,由名称节点分配存储位置,然后由客户端把数据直接写入相应数据节点;在读取时,客户端从名称节点获得数据节点和文件块的映射关系,然后就可以到相应位置访问文件块。数据节点也要根据名称节点的命令创建、删除数据块和冗余复制。
计算机集群中的节点可能发生故障,因此为了保证数据的完整性,分布式文件系统通常采用多副本存储。文件块会被复制为多个副本,存储在不同的节点上,而且存储同一文件块的不同副本的各个节点会分布在不同的机架上,这样,在单个节点出现故障时,就可以快速调用副本重启单个节点上的计算过程,而不用重启整个计算过程,整个机架出现故障时也不会丢失所有文件块。文件块的大小和副本个数通常可以由用户指定。 分布式文件系统是针对大规模数据存储而设计的,主要用于处理大规模文件,如TB级文件。处理过小的文件不仅无法充分发挥其优势,而且会严重影响到系统的扩展和性能。
4.1.2 HDFS简介 我们现在开始讲Hadoop的核心组件:HDFS。为什么我们不说Hadoop呢?因为Hadoop由很多组件组成。它是一个大的概念,我们必须通过讲解Hadoop的组件来理解Hadoop。 目前得到广泛应用的分布式文件系统主要包括GFS和HDFS等,Hadoop就是使用的HDFS,它是Google GFS的开源实现。 下面是HDFS的优势: 存储超大文件,文件大小通常都是上百MB、TB、PB级别。 标准流式访问,基于“一次写入,多次读取”的构建思路,即只支持文件的追加写,不支持随机访问,这是最高效的访问模式。流式方式就是按照顺序来,一条线,找一次就够了。所以适合一次写,多次读的数据。 运行在廉价的商用机器集群上, Hadoop并不需要昂贵且高可靠的硬件。 兼容廉价的硬件设备。在成百上千的廉价服务器上存储数据,常会出现节点。 强大的平台兼容性。HDFS是由java编写的,支持JVM的机器都可以运行HDFS。 HDFS特殊的设计,在实现上述优良特性的同时,也使得自身具有一些应用局限性,主要包括以下几个方面: 不适合低延迟数据访问。HDFS主要是面向大规模数据批量处理而设计的,采用流式数据读取,具有很高的数据吞吐率,但是,这也意味着较高的延迟。因此,HDFS不适合用在需要较低延迟(如数十毫秒)的应用场合。对于低延时要求的应用程序而言, HBase是一个更好的选择。 无法高效存储大量小文件。小文件是指文件大小小于一个块(64MB)的文件,HDFS无法高效存储和处理大量小文件,过多小文件会给系统扩展性和性能带来诸多问题。首先,HDFS采用名称节点(Name Node)来管理文件系统的元数据,这些元数据被保存在内存中,从而使客户端可以快速获取文件实际存储位置。通常,每个文件、目录和块大约占150字节,如果有1000万个文件,每个文件对应一个块,那么,名称节点至少要消耗3GB的内存来保存这些元数据信息。很显然这时元数据检索的效率就比较低了,需要花费较多的时间找到一个文件的实际存储位置。而且如果继续扩展到数十亿个文件时,名称节点保存元数据所需要的内存空间就会大大增加,以现有的硬件水平,是无法在内存中保存如此大量的元数据的。其次,用 MapReduce处理大量小文件时,会产生过多的Map任务,线程管理开销会大大增加,因此处理大量小文件的速度远远低于处理同等大小的大文件的速度。再次,访问大量小文件的速度远远低于访问几个大文件的速度,因为访问大量小文件,需要不断从一个数据节点跳到另一个数据节点,严重影响性能。 不支持多用户写入及任意修改文件。HDFS只允许一个文件有一个写入者,不允许多个用户对同一个文件执行写操作,而且只允许对文件执行追加操作,不能执行随机写操作。 HDFS的体系结构如图所示。
下面我们针对此图中各部分分别介绍。 4.1.3 基本概念 1.块 HDFS中的文件被分成块进行存储,它是文件的最小逻辑单元,默认块大小为64MB,使用文件块的好处是: 文件的所有块并不需要存储在同一个磁盘上,可以利用集群上的任意一个磁盘进行存储。 对分布式系统来说,由于块的大小是固定的,因此计算单个磁盘能存储多少个块就相对容易,可简化存储管理。 在数据冗余备份时,将每个块复制到少数几台独立的机器上(默认为三台).可以确保在块磁盘或机器发生故障后数据不会丢失。如果发现一个块不可用,系统会从其他地方读取个副本,这个过程对用户是透明的。 使用fsck命令可以显示块信息: [root@hadoop sbin]# hdfs fsck / -files -blocks Connecting to namenode via http://hadoop:50070 FSCK started by root (auth:SIMPLE) from /192.168.142.139 for path / at Tue Dec 18 00:44:00 PST 2018 /
注意:执行hadoop代码时,有时会产生下面的异常: 18/12/18 06:56:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable 需要修改$HADOOP_HOME/etc/hadoop/log4j.properties文件,添加以下内容。 log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR 2.NameNode和DataNode节点 NameNode和DataNode属于HDFS集群的两类节点。 NameNode负责管理文件系统的命名空间,属于管理者角色。它维护文件系统树内所有文件和目录,记录每个文件在各个DataNode上的位置和副本信息,并协调客户端对文件的访问。名称节点(Name Node)保存了两个核心的数据结构(见图4-3),即FsImage和 EditLog。FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据。操作日志文件 EditLog中记录了所有针对文件的创建、删除、重命名等操作。名称节点记录了每个文件中各个块所在的数据节点的位置信息,但是并不持久化存储这些信息,而是在系统每次启动时扫描所有数据节点重构得到这些信息。 名称节点在启动时,