章节介绍:
单元1,使hadoop 集群运行起来,介绍怎样安装和运行单个与集群的hadoop
单元2: 进阶HDFS,介绍一些用 hadoop mapreduce 和不用MapReduce 处理大规模数据时有用的高级特性
单元3: 进阶hadoop mapreduce Administration (管理),解释怎样更改配置来确保hadoop的安全性和进行debug
单元4: 开发复杂的hadoop MapReduce应用 ,涉及几个hadoop MapReduce 的高级特性,可以开发出高度定制化,高效的MapReduce应用
单元5: hadoop 生态系统,介绍和hadoop相关的项目例如hbase ,hive,pig
单元6: 统计分析 ,介绍怎么使用hadoop进行基本的统计分析
单元7: 搜索与索引,介绍几款可以对Apache hadoop 进行大规模搜索和索引的工具与技术
单元8: 分类,推荐,相关性查找,解释如何使用hadoop进行复杂的算法处理如分类,推荐,相关性
单元9: 大量文本数据处理,解释如何使用hadoop和mahout 去处理大量文本数据集以及怎样使用hadoop进行数据的预处理和加载操作
单元10 : 云部署 ,在云上使用hadoop,如使用Amazon elastic MapReduce和Apache whirr去部署和执行hadoop MapReduce,pig,hive,和hbase在云基础设施上的计算
第一章
hadoop是一种最广为人知的和广泛使用的MapReduce应用程序
hadoop由四种类型的节点组成:
一个namenode,
多个datanodes,
一个jobtracker,
多个tasktracker HDFS nodes.
namenode和DataNode 提供了一个分布式文件系统 , jobtracker 负责管理任务,tasktrackers负责实际运行部分作业任务
用户提交MapReduce到jobtracker ,jobtracker在tasktracker上运行每个map和reduce部分的初始化工作,并收集结果,最终返回结果。
hadoop 安装提供了三种选择:
local mode(本地模式):这是一种解压后可以立即使用的模式,所有的hadoop组件运行在同一个jvm(Java虚拟机)上
pseudo distributed mode : 这种模式会将不同的hadoop组件运行在不同的Java处理机上,但仍然是在一台服务器上。
distributed mode : 这是真正的运行在多个服务器上的安装模式
前面三个例子讨论local mode ,后面三个例子讨论 pseudo distribute(模拟分布式)和distributed(分布式)模型
在hadoop 文件系统里创建新目录 : /test :
>bin/hadoop dfs -mkdir /test
查看HDFS文件系统的根目录下的文件
>bin/hadoop dfs -ls /
命令提示 :
WARNING :use of this script to execute dfs is deprecated .
WARNING: Attempting to execute replacement "hdfs dfs " instead
hdfs dfs -ls / 新版的列出根目录‘/‘’下的文件
hdfs dfs -put wc.txt / 将本地的wc.txt文件复制到hadoop的文件系统的 / 目录下
hdfs dfs -mkdir /test 在hdfs文件系统的根目录下创建test文件夹
hdfs dfs -get /test/README.txt README-NEW.txt 复制hdfs文件系统的 /test/README.txt文件到本地目录 README-NEW.txt
它是怎么工作的?
当一条命令被提交,客户端会代表用户 同hdfs namenode进行通话,进而实施一个操作 。 通常来说,我们关联到一个文件是以路径'/'’开始的,例如 /data,
然后客户端会从 HADOOP_HOME/conf 里面的配置信息中挑选出 namenode .
但是 如果有需要 ,也可以使用全路径来强制使客户端同指定的NameNode通话 ,如 hdfs://bar.foo.com:9000/data 将会要求客户端同bar.foo.com上端口为9000的NameNode进行通话。
HDFS 支持大多数的Unix命令,例如 cp ,mv ,chown ,命令格式模型同上面的一样
如果hadoop集群是运行在多台服务器上,就需要选择一台服务器作为master 节点用于运行hdfs的NameNode和jobtracker .
如果是运行在单个机器上,就把它既当做master节点也当做slave节点
hadoop的配置与启动 配置文件的配置,环境变量的设置,hadoop集群的启动,跳过。
启动命令 > bin/start-dfs.sh
浏览NameNode和jobtracker的网页管理页面
NameNode : http://MASTER_NODE:50070/
jobtracker : http://MASTER_node:50030/
怎么运行起来的?
hadoop 的安装由hdfs节点,一个jobtracker和worker 节点们组成。
当我们开启NameNode ,它就从HADOOP_HOME/slaves文件中查找slaves节点,并通过ssh开启远程服务器上的DataNode的setup程序
同样我们开启 jobtracker,它通过HADOOP_HOME/slaves 文件查找slaves节点,并开启tasktrackers
p23
over hadoop 1.0
start
hadoop 实战2.0
hadoop只包含HDFS,YARN和MapReduce
hadoop 介绍:
2000年,Apache开启了一个和搜索相关的Lucene项目,此项目主要功能是提供给全文文本搜索函数库。
2002年Apache在Lucene基础上新开发了网络爬虫(crawler)和web模块,并称新项目为Nutch.
但是在nutch开发过程中Apache无法将计算任务分配到多机执行,此间(2004年前后)恰巧谷歌发布论文GFS和MapReduce,参考论文,于是有了nutch版ndfs(nutch distributed filesystem)和MapReduce。
由于nutch是一个包括爬虫、索引、查询等功能的完整搜索系统,而NDFS和MapReduce模块只是让nutch任务可以以分布式方式在多机上执行,这两个模块更像一个分布式基础架构
于是在2006年Apache将NDFS和MapReduce抽出来,成立一个新的项目,称为hadoop。
hadoop本身只包括 分布式存储HDFS,分布式资源管理框架YARN和分布式全局数据处理引擎MapReduce。
hadoop生态圈 ,仅就如何将普通环境下的数据导入HDFS就出现了flume,sqoop,chukwa,kafka等组件。
HBASE和zookeeper都是独立项目。
HDFS (hadoop distribute filesystem)分布式文件系统 采用master、slave 架构,主服务器运行master进程NameNode,从服务器运行slave进程DataNode。
它将集群中所有服务器存储空间连接到一起,构成一个统一的,海量的存储空间。
ZooKeeper :分布式锁服务
chubby的开源实现,负责协调集群中运行在不同服务器上的进程间的互斥和同步操作。
ZooKeeper还提供维护配置信息、命名信息和组服务。显然让集群中的分布式程序之间协调这些功能几乎是不可能的事情,比如让运行在不同机器上的四个进程共同维护一个配置信息,
极有可能产生配置信息不一致问题,ZooKeeper就是一个这样的功能体。
为提供最稳定服务,zookeeper本身也是一个集群,并且集群中zookeeper个数只能为奇数。因为表面上zookeeper是对等架构,实际上依旧是master/slave架构。
集群在开始运行(或发生故障重新运行)时,会遵循少数服从多数原则,选出一个领导。zookeeper内部采用paxos算法来实现数据一致性,可以把它看成paxos算法的代码实现。
YARN :分布式操作系统
普通os(操作系统)的功能主要为处理器管理,存储器管理,设备管理,文件管理,作业管理和用户接口。
在集群环境下,HDFS已经负责了文件管理,而设备概念较弱,
故YARN主要负责统一管理集群内服务器的计算资源(主要包括CPU和内存资源),作业调度和用户接口。
YARN自身采用master/slave架构,主服务器运行master进程resourcemanager,从服务器运行slave进程nodemanager.
MapReduce:分布式全局数据处理引擎
谷歌MapReduce的开源实现,通过“map(本地处理) -> shuffle(洗牌) -> reduce(规约处理)“三个阶段,并行处理存储在HDFS上的全局数据。
从代码层次上说,实现上述三个过程,需要一个主进程(master)和诸多从进程(worker)来实现上述过程。主进程负责指挥整个过程,从进程负责map和reduce.
(对于大量数据来说,复制1Tb的数据可能需要半小时,而处理数据的程序代码只有几kb,于是与其把所有数据先复制到一起统一处理,还不如将代码复制到各个机器本地执行(map),最终将处理结果汇总到一台机器上(reduce))
Hbase :分布式数据库
bigtable的开源实现,底层数据存储在HDFS之上,上层采用master/salve架构。
主服务器运行master进程HMaster,从服务器运行slave进程HRegionServer.
Hmaster主要管理用户对Table的增删改查,管理所有HRegionServer, 它不会参与Table中具体数据的查看修改等操作;
每个HRegionServer负责具体存储索引信息,缓存数据,修改日志信息,并且是客户读写table信息的具体执行者,table中存储的实实在在信息,一般都被HRegionServer下放到HDFS中存储。
基于MapReduce的数据分析组件
虽说MapReduce代码的开发量不大,但和sql语句比起来,编写MapReduce代码依旧不够灵活。
鉴于此,一些公司或组织将他们开发的MapReduce函数集(如add函数,unique函数)添加在一起,再加上一个翻译器和HDFS工具集,即构成了基于MapReduce封装的组件(如hive,mahout等)。
Tez :DAG作业的计算框架
使用案例,加入一个作业需要4个有前后依赖关系的MapReduce完成,比如顺序只能为 job1->job2->job3->job4,则正常编写时就需要 写4个MR(MapReduce),且系统在执行时,
job1,job2,job3结果都会存入HDFS,这显然完全没有必要。Tez可以将这4个job配置成一个DAG作业,且前(n-1)个作业结果不会存入HDFS,大大提高了作业执行效率。也可在pig,hive中使用Tez.
Pig : mapreduce脚本化操作工具类组件
Google sawzall的开源实现,主要提供交互式的MR和HDFS操作。
实际上pig相当于Hadoop集群的一个智能终端,对外,pig向用户提供大量内置函数,对内,pig调用hadoop集群执行用户程序。
pig封装了常用的HDFS实用类(如将数据存入HDFS的存储操作pigstorage)、大量常用MapReduce函数(如均值函数 AVG({INT}))并提供了一个运行pig的执行环境,
方便实用,不需要每次都编写MR代码,对编程能力要求较低。
Mahout: MapReduce版机器学习算法代码库
简单地说,将大量经典算法(如naive bayes 、k-means)组合到一起,加上一些执行辅助工具即构成Mahout. 使用时,只在客户端上安装一个Mahout,用户代码里直接使用Mahout机器学习包,然后向集群提交任务即可。
Hive: 数据仓库组件
Hive 是一个构建在hadoop上的数据仓库框架,提供以类似SQL方式管理和查询存储在HDFS上的数据,Hive的设计目的是让Facebook内精通SQL(但Java编程相对较弱)的分析师能够以类SQL的方式查询存放在HDFS的大规模数据集。
Tajo 数据仓库组件
Tajo是基于YARN(分布式操作系统)开发的开源分布式数据仓库。设计思想类似于Tenzing,充分借鉴了MapReduce和database的优势,具有hive的扩展性和容错性好的优点,同时性能也比hive高。
具备低延迟高可伸缩的特点,还提供专用查询和ETL工具。Tajo 采用master/slave 架构,master 机运行主进程Tajomaster ,slave运行slave进程Tajoworker .
Crunch :特定MapReduce代码库
直接使用MapReduce编程的一大难点就是编写诸如 joining和data agreegation 这类操作, crunch 相当于hadoop集群的一个智能终端,提供了大量数据聚合类函数(如join,union)。它的api特别适合
处理诸如 “时间序列”,‘序列化对象格式’,hbase的行和列族这类非关系型数据
。。。。。
DataFu(强大的mr类库),MRQL (在hadoop,hama,spark,flink之上的类SQL查询系统),kylin(多维数据的分布式OLAP联机分析处理分析引擎),Lens(数据查询分析接口)
。。。。。
数据库组件:
bigtable的开源实现并不是只用hbase,虽然habse是当前最为成熟,应用最广的分布式数据库,但其采用<row,clomunfamily>数据模式不能解决一切问题,
其他分布式数据库或多或少地对habse进行了改进。
Drill(模式自由的分布式数据库),
Accumulo(安全性更强的分布式数据库) ,cassandra(k-v型分布式数据库) ,Phoenix(在hbase上关系数据库层,nosql版的数据库连接驱动包JDBC).
BSP组件:
并行模型mapreduce和分布式数据库hbase并不是万能的,如MapReduce并适合做含有大量迭代的科学计算和机器学习任务,但bsp(整体同步并行计算模型)却能够高效实现诸如矩阵运算、图迭代、机器学习,这种大规模科学计算与迭代任务。bsp为并行计算提供一个像串行计算的冯.诺依曼模型同样稳定
的模型,从而实现并行计算的可扩展性,可移植性和可预测性。
Hama(通用bsp计算引擎,底层数据存储在HDFS上),Giraph(图处理利器)
基于yarn框架组件:
批处理框架MapReduce及MapReduce的组件适合离线处理全量数据,但却不适于在线实时处理数据或高效执行机器学习算法,于是有新出现的
基于yarn的机器学习或实时处理框架
storm(分布式实时流式处理框架),Samoa(Storm的算法包),Spark(scala语言开发的分布式内存型计算框架,内存型hadoop)
Reef(微软基于yarn开发的一款可保留计算执行框架),TinkerPop(图处理工具),Ignite(内存数据组织框架),Flink(基于yarn的快速可靠的大规模数据处理引擎)。
基于yarn框架组件:
为了确保yarn精简高效,yarn自身代码量、复杂度有严格限制,导致用户直接使用yarn api编程教为困难,因此出现一些 新的组件,用以帮助用户快速编写
或发布yarn-app (yarn应用程序)
Slider(将已有服务部署到yarn),Twill(yarn上层应用编程工具包)
搜索引擎组件:
blur :基于表的查询系统,物理存储上,一个blur Table 由一系列分布在集群中的Shard(Lucene Indexs)构成, HDFS负责存储所有的索引信息(shard),
ZooKeeper负责协调集群,Thrift负责集群RPC,Lucene负责存储并对所有数据建立索引;
工作流组件:
一个数据分析人物处理流程可能是 “PythonApp->MRApp->HiveaPP->JavaApp-WekaApp->ShellApp”这样一个工作流。
一个项目不可能只有一个MapReduce程序。
Oozie(工作流组件),Falcon(数据管理框架)
数据流组件:对HDFS/HIVE/HBASE进行数据导入导出
Flume(分布式数据传输工具),kafka(发布-订阅式的分布式消息系统),Chukwa(分布式数据收集系统),Sqoop(HDFS与关系型数据库中数据相互迁移的工具)。
序列化和持久化组件:
处于两台不同机器上的进程间交换数据时,需要将数据序列化,与便于数据传输。
进程将其内存数据刷到硬盘上,称为数据持久化。
Avro(序列化与RPC框架),Gora(nosql数据持久化工具包),parquet(可重复的嵌套列数据结构工具包)
调试工具:
MRUnit(mapreduce 的本地集群调试工具)
安全性组件:
Knox(统一的轻量级集群访问中间层,可为Hadoop提供单点登录),Ranger(Hadoop平台的数据安全管理中心,负责授权、监控,管理Hadoop平台的数据安全)
Sentry(基于角色的细粒度授权系统)
兼容性组件:
Bigtop (可以规范各组件hdfs,oozie,kafka等的版本)
集群部署与管理组件:
Ambari(部署,管理和监控集群的工具软件)
Apache 社区大数据套件:
HDFS,MapReduce2,YARN,Tez,HBase,Sqoop,Oozie,pig,Hive,ZooKeeper,Storm,Flume,Kafla,Slider,Spark
大数据解决方案提供商主要为 Hortonworks,Cloudera,MapR,AWS,IBM,Microsoft,Pivotal,Intel,Teradata.
一般高层产品为商用组件(多与nosql,bi或集群管理相关如 Hortonworks的Ambari,Cloudera的Impala,MapR的MapR-DB)都以社区大数据套件为基础