能做的事:可以搭建一个处理数据的基础平台;、
1.提高读取速度
如果要这样实现就需要解决两个主要问题:1)不同硬盘的故障问题,hadoop提供HDFS(HadoopDistributeFileSystem)分布式文件系统,基本通过保存文件副本的方式,解决出现硬盘故障问题
2)确保每个硬盘拿来的数据正确,提供了MapReduce(一个编程模式)抽象出这些硬盘读写问题并将其转换为map和reduce两部分
Hadoop初始版本:HadoopCommon(基础模块,网络通信);HadoopHDFS(分布式存储);HadoopMapReduce(分布式计算)
Hadoop后来版本:多了一个HadoopYARN(负责资源管理,资源调度,类似Hadoop的操作系统),基于这个层面有了很多应用层面的框架出现(HIVE,Strom,Spark,Flink,MapReduce)
二:MapReduce
通过例子:从国家天气数据中,找到每年的最高气温,文件都是以日志二进制形式保存;
对于这种情况,就非常适合用Hodoop的MapReduce来解决了,主要解题思路:先将每年日志文件通过map函数变为特定集合,再通过reduce函数,在每个map中元素做reduce函数处理这里是取最大值,这样mapreduce就找到每年的最大气温了
HadoopStreaming是MapReduce的API
概述:
<1>将分布式计算作业拆分成两个阶段:Mapper和Reducer<2>Shuffle流程:连接Mapper和Reducer阶段I.shuffle写入流程mapper任务将输出数据写到本地磁盘上II.shuffle读取流程reducer任务从mapper磁盘上远程读取数据信息<3>使用场景:离线批处理,速度慢<4>缺点:各个task任务需要不断申请释放资源,过多使用磁盘
流程图:
<1>输入文件切片<2>mapper进程处理切片<3>shuffle流程<4>reducer进程聚合数据<5>输出文件
2.1具体聊聊
1)案例运行方式
a.单机运行<1>导入window支持的两个文件:winutils.exe和hadoop.dll放到C:\java\hadoop-2.6.0-cdh5.9.0\bin目录下<2>配置HADOOP_HOME环境变量(需要重启机器)临时配置环境变量:System.setProperty("hadoop.home.dir","C:\java\hadoop-2.6.0-cdh5.9.0");<3>修改NativeIO类,将access0调用处直接换成true
WardCount例子:单机运行java方式mapreduce方式
WardCount(这里的是将入参变为由下面一个脚本执行获得的SequenceFile文件做处理到yarn平台)
2.2.Shuffle流程
1)位置在mapper和reducer处理逻辑之间,连接map和reduce的纽带
2)功能
Shuffle的本义就是洗牌、混洗,把有规律有一定规则的数据尽量转为一组无规律的数据,越随机越好。MapReduce中的Shuffle更像是洗牌的逆过程,把一组无规律的数据变为一组有规律的数据
从shuffle写入流程(map端)到shuffle读取流程(reduce端)整个过程可以被广义的称为Shuffle。Shuffle横跨Map端和Reduce端,在Map端包含Splill写过程,在Reduce端包含copy和sort读过程3)写入流程
a.map输出数据经过分区,分区完后通过collect收集到内存环形缓冲区kvbufferb.sort将缓冲区中的数据排序<1>按分区排序<2>每个分区中数据按key进行排序c.spill线程溢写到本地磁盘每次缓冲区满就溢写,会产生很多小文件d.merge合并将小文件合并到大文件4)读取流程a.copyreduce端通过HTTP协议从mapper磁盘上读取相应分区的数据b.merge-sort<1>如果读取的数据在reduce内存中能放得下,就直接放到内存中。当内存空间达到一定阈值,就merge成一个磁盘文件<2>如果读取过来的数据内存放不下,就直接输出到磁盘上。每个mapper过来的数据,就建一个文件。当文件数达到一定阈值,就merge成一个大文件。
三:HDFS分布式文件系统
3.1设计原则
3.2概念
3.2.1块
一般文件系统有块的概念512字节,是数据读写最小单元,但是HDFS分布式文件系统也有块的概念,确实默认128M大小,弄这么大的原因:
1)最小化寻址开销
2)有了这个块的概念,一个文件可以存在在不同的网络空间
3)使用抽象块而非整个文件作为存储单元,大大简化存储子系统的设计
fsck命令可以查看块信息
3.2.2namenode和datanode
namenode:管理文件命名空间,维护整个系统树和整个系统树内所有的文件和目录,这些信息在磁盘上以文件形式永久保存在本地磁盘:命名空间镜像文件+编辑日志文件
datanode:文件系统的工作节点,他根据需要存储检索数据块
客户端POSIX:可移植操作系统界面的文件系统接口,通过他与namenode,datanode交互
联邦HDFS:namenode在内存中保存文件系统中每个文件和每个数据块的应用关系,意味着对于一个拥有大量文件的超大集群来说,存在限制了系统横向扩展的瓶颈,次数通过这个模式就可以解决
想要访问方法:客户端需要使用客户端挂载的数据表将文件路径映射到namenode
3.2.3块缓存
datanode从磁盘中读取块,对于频繁访问的文件,其对应的块可以被显示的缓存起来,用户或者应用可以通过增加一个cachedirective来告诉namenode需要缓存哪些文件及缓存多久
3.2.4HDFS高可用
通过NFS或者日志管理器QJM的机制在活动namenode失效之后,备用namenode能快速切换(热切换),如果配用的namenode也坏了,管理员也可以申明一个namenode冷启动
3.2.5文件系统
文件系统的基本操作如:%hadoopfa-copyFromLocalinput/docs/qq.txt\hdfs://localhost/user/qq.txt;//将本地文件复制到HDFS中
HDFS具备一定的权限机制
由于Hadoop的抽象的文件系统概念,HDFS只是其中一个实现,定义了很多接口可供java调用;
HttpFS:提供代理
libhdfs:C语言库,可允许你调用hadoop的api
HFS:通过NFSv3网关将HFDS挂载为本地客户端的文件系统是可行的(如何配置你可以自己百度小伙子)
FUSE:用户空间文件系统,允许将用户空间实现的文件系统作为Unix文件系统集成(HFS相对来说更好推荐)
3.2.6Java接口
1)从Hadoop的URL中读取数据:
2)通过FileSystemAPI读取数据:FSDataInputStream对象
3)写入数据:FSDataOutputStream
4)创建目录:create()
3.2.7文件模式
可用通过通配符方式匹配到更多文件globStatus():返回路径模式与指定模式匹配的所有FileStatus对象组成的数组(正则表达式模式如:*,?[ab]......)
PathFilter对象:通配符模式
删除数据:delete()
一致模式:hflush,hsync
通过distcp并行复制:%hadoopdistcpfile1file2
保证HDFS集群的均衡,对系统性能是非常棒的条件,可通过均衡器(balancer)达到这一点
3.3深入了解
3.4HDFS命令行及JavaAPI操作
1)HDFS命令行a.bin/hdfsdfs命令:<1>-help:查看有哪些命令<2>-mkdir:创建目录,-p:创建多个目录<3>-put:上传本地文件到HDFS服务器上-copyFromLocal-moveFromLocal<4>-ls:查看指定目录下有哪些文件和子目录,-R:递归地查看有哪些文件和目录<5>-du(s):查看目录或文件的大小-count【-q】<6>-mv/-cp:移动/复制目录或文件<7>-rm-r:删除目录或文件,-r:递归删除<8>-get:将服务器上的文件下载到本地-copyToLocal-moveToLocal<9>-cat/-text:查看服务器上文本格式的文件
b.bin/hdfsdfsadmin命令
<1>-report:查看文件系统的基本信息和统计信息
<2>-safemodeenter|leave|wait:安全模式命令
<3>-refreshNodes:重新读取hosts和exclude文件,在新增节点和注销节点时使用
<4>-finalizeUpgrade:终结HDFS的升级操作
<5>-setQuota
<6>-clrQuota
2)HDFSJavaAPI操作(filesystem)
下面是java调用方法类方法实例:
a.Hadoop默认支持权限控制,可将其关闭hdfs-site.xml文件:dfs.permissions.enabled设置成false注:需配置到服务器hdfs-site.xml中,服务器重启b.获取文件元数据信息副本策略:dfs.replication配置项在客户端进行指定c.下载文件时候调用copyToLocalFile的问题由于本地是windows系统,没有安装hadoop环境,所以使用第四个参数指定使用本地文件系统fileSystem.copyToLocalFile(false,newPath(srcPathName),newPath(dstPathName),true);
四:YARN(资源调度和任何管理)
1.四大组件
ResourceManager(RM)、NodeManager(NM)、ApplicationMaster(AM)、Container
2.执行流程
<1>client连接RM提交作业,RM给client一个JobId(注:ApplicationsManager和ResourceScheduler)<2>RM中的ApplicationsManager连接一个NM,让NM创建一个AM处理客户端作业请求<3>AM连接RM中ApplicationsManager申请NodeManager<4>AM去ResourceScheduler给client的作业申请资源(cpu、内存、磁盘、网络)<5>AM连接NM,发送clientjob作业程序和申请的资源cpu、内存、磁盘、网络)<6>NM启动Container进程运行job的不同任务<7>Container进程运行状态实时反馈给AM<8>AM反馈任务状态信息给RM中的ApplicationsManager<9>client端可以连接RM或AM查询job的执行情况注:NM启动后去RM上进行注册,会不断发送心跳,说明处于存活状态
3.具体聊聊
1)资源调度
2)资源隔离(NodeManager)a.含义NodeManager运行多个container进程,进程需要的资源需要进行隔离,不让彼此产生干扰b.隔离方式内存隔离、CPU隔离c.YarnContainer两种执行方式DefaultContainerExecutor(内存隔离)和LinuxContainerExecutor(内存隔离、CPU隔离(cgroup))注:两种方式的内存隔离都是采用线程监控方式
五:生态系统
1)Hadoop:分布式存储、分布式计算、资源调度与任务管理hdfs、mapreduce、yarn、common2)Lucene:索引检索工具包;Solr:索引服务器3)Nutch:开源的搜索引擎4)HBase/Cassandra:基于谷歌的BigTable开源的列式存储的非关系型数据库5)Hive:基于SQL的分布式计算引擎,同时是一个数据仓库Pig:基于PigLatin脚本的计算引擎6)Thrift/Avro:RPC框架,用于网络通信7)BigTop:项目测试、打包、部署8)Oozie/Azakban:大数据的工作流框架9)Chukwa/Scribe/Flume:数据收集框架10)Whirr:部署为云服务的类库11)sqoop:数据迁移工具12)Zookeeper:分布式协调服务框架13)HAMA:图计算框架14)Mahout:机器学习框架
六:安装配置
1.三个版本:单机、伪分布式、分布式
2.三个分支:apache版本(Apache基金会),cdh版本(cloudera公司),hdp版本(HortOnWorks公司)
3.单机(仅仅适用于单机运行分布式计算作业)
直接执行mapreduce-examples.jar案例
1)通过rz命令上传自己本地的hadoop安装包到linux服务上,我创建了一个/opt/software文件夹专门放安装包
2)解压:tarzxfhadoop-2.6.0-cdh5.9.0.tar.gz-C/opt/module(解压文件都指定文件夹中去module)
3)改名字:mvhadoop-2.6.0-cdh5.9.0hadoop-2.6.0
4)测试小demo
创建input文件夹放很多xml文件;执行测试脚本:bin/hadoopjarshare/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.9.0.jargrepinputoutput'dfs[a-z.]+'
查看结果:在output文件夹中出现succuss和另一个文件:catpart-r-00000(出现结果dfsadmin表示成功)
这单机版的hadoop没什么可以做的,这里只是他最简单的一个小demo
4.伪分布式
I.HDFS
<1>配置core-site.xml
fs.defaultFS
et/hadoop/core-site.xml(配置这目的:通过指定端口来访问HDFS的主节点NameNode)
dfs.replication
etc/hadoop/hdfs-site.xml(hdfs配置指定块复制数,这里由于是伪分布式,所以指定多个也没用,块坏了还是跳不到其他地方的)
bin/hdfsnamenode-format
作用:清空NameNode目录下的所有数据,生成目录结构,初始化一些信息到文件中
(我们初始化的目录默认在:/tmp/hadoop-root/dfs/name/current/;副本默认在)<4>启动HDFS各个进程sbin/start-dfs.sh或sbin/hadoop-daemon.shstartnamenodesbin/hadoop-daemon.shstartdatanodesbin/hadoop-daemon.shstartsecondarynamenode
II.YARN
<1>配置mapred-site.xml(指定mapreduce的选定方案:yarn而不是默认的mapreduce了)
etc/hadoop/mapred-site.xml
etc/hadoop/yarn-site.xml
5.分布式环境搭建
1)先将之前伪分布式的配置复制到另一个文件夹
cp-rhadoophadoop-pseudo(这里hadoop-pseudo我们就作为之前分布式的配置吧,我们接下来的操作时修改hadoop文件中的配置项为分布式)
2)配置namenode访问地址,配置secondarynamenode访问地址,配置resourcemanager访问地址,配置从节点的主机名
scp-r*root@hadoop-senior02-test-com:/opt/module/hadoop-2.6.0/etc/hadoop
5)配置聚合日志
三:Hadoop高级部分
3.1MapReduce案例
1)去重排序
需求:将原始数据中出现次数不超过一行的每行数据在输出文件中只出现一次,并按字典排序
原始数据:C:\java\eclipse\workspace\hadoop课程源码\src\demo\去重排序
需求:求取每年气温最高的是哪一天,气温是多少
原始数据:C:\java\eclipse\workspace\hadoop课程源码\src\demo\气温数据
分析:
a.Map拆分原始数据每一行,将年份抽取出来。输出格式<年份,日期:温度>
b.Reduce拆分日期:温度数据,将温度逐个分析,找到每年最大气温及日期
c.Reduce输出数据。输出格式:<日期,温度>
需求:从给出的父子关系数据表中找到祖父祖孙的关系
原始数据:C:\java\eclipse\workspace\hadoop课程源码\src\demo\单表关联\单表关联.txt
a.map将原数据拆分,输出左表数据。数据格式
b.Map同时输出右表数据,输出格式
c.Reduce连接左表的parent列和右表的child列
需求:将订单明细表和商品表中的数据关联
原始数据:C:\java\eclipse\workspace\hadoop课程源码\src\demo\多表关联
方案:订单明细表中map输出的key添加10000内随机数后缀,将生成的新的key分发到不同的reducetask上商品表中的map输出需要扩容10000条,输出到各个reducetask上