Hadoop实战一

来源:互联网 发布:苹果 联通4g劫持网络 编辑:程序博客网 时间:2024/04/30 17:33

1.     三副本放置

1)  第一个副本放在写入文件的DataNode上

2)  第二个副本放在不同机架上的任意DataNode

3)  第三个副本放在同一个NameNode管理的DataNode上(一个NameNode可管理4000个DataNode)

2.     Block概述

1)  默认是64MB

2)  错误处理:

l  每当DataNode读取Block时,会进行CRC校验计算得到checksum

l  计算得到的checksum与读取前的checksum对比,若不同则向NameNode报告,NameNode会标记该Block已损坏,并有该Block的其他副本进行恢复以达到配置的副本数

3.     安全模式(适用于升级)

NameNode处于安全模式下客户端是只读的

 

4.     常用命令

bin/hadoop job –list //列出正在运行的作业

bin/hadoop job –kill job_id //删除作业

bin/hadoop fsck  //查看HDFS状态,是否有损坏块

bin/hadoop fsck –delete //删除损坏块

bin/hadoop dfsadmin –report //返回当前HDFS状态

sbin/start-balancer.sh //启动平衡器

5.     如何使用MapReduce解决问题

1.     将问题转化成MapReduce模型

2.     设置相关参数

3.     写Map逻辑

4.     写Reduce逻辑

MapReduce执行流程:

1)  JobClient对输入数据源分片

2)  通过JobTracker生成jobid

3)  检查输出目录不存在,输入目录存在

4)  拷贝任务资源到JobTracker(jar,集群配置文件,输入源切片信息)

5)  JobTracker遍历每一个InputSplit(切片信息),根据其记录的引用地址选择距离最近的TackTracker去执行

6) 将任务jar从HDFS拷贝到本地并进行解压
7)创建子JVM执行具体任务

7.1)若为Map任务,则处理流程:

l  加载InputSplit记录的数据源切片,通过InputFormat的getRecordReader()方法
获取到Reader后,执行如下操作

l  K key = reader.createKey();  

l  V value = reader.createValue();  

l  while (reader.next(key, value)) {//遍历split中的每一条记录,执行map功能函数  

l      mapper.map(key, value, output, reporter);  

如果JobTracker出现故障,则系统瘫痪

如果TaskTracker出现故障,JobTracker将其拉入黑名单,并调度其他TaskTracker重新执行此任务,失败次数超过4次,则Job失败或者以Task的成功数比例决定Job是否通过

Job资源调度器

1)  FIFO调度器

2)  Fair Schedule(公平调度器),具有多个Pool,每个Job需要按照优先级放入Pool中,支持资源抢占

3)  Capacity Schedule(容量调度器)

Configuration conf=new Configuration();//以上是其默认配置

Job job=new Job(conf,”wordcount”);

 

5.     Combine和Partitioner

1)     Combine作用

对于每个Map执行后的<key,value>集进行Combine操作,然后对多个Combine产生的<key,value>集进行Reduce操作得到最终结果

     

虽然可以减少网络流量但具有应用的局限性,可能导致错误的结果

job.setCombinerClass(reduce.class);//combine的作用实际上就是reduce

3) Partitioner(根据key分类进行reduce,解决Hadoop负载均衡和数据倾斜问题)

允许对Map之后的<key,value>数据集进行分类,分别放置于不同的文件中(文件的个数==Reduce个数)

 

 

 

 

6.     多文件输出格式

      只需要继承MutipleOutputFormat

 

7.      MapReduce单元测试

Mappermap=new Mapper();

Reducereduce=new Reduce();

MapReduceDriverdriver=new MapReduceDriver(map,reduce);

driver.withInput(“”,newText(str)).withOutput(new Text(“CDN”),new IntWritable(1));//输入为假设输入,输出为预计输出(需要考虑排序)

8.     源文件split

Split对源文件进行划分得到<key,value>,其中key表示起始偏移,value表示实际文本内容,一个split切片信息会作为一个map的一个输入

注意:

Split不会对小文件进行切分,所谓的小文件是指文件大小<Block大小的文件,此小文件会作为一个split作为一个map的输入,因此Hadoop对于小文件的处理效率不高

9.     MapReduce的输入FileInputFormat

getRecordReader():根据给定的split得到record

getSplits():对输入文件进行划分得到splits

1)     TextInputFormat每一行作为一个record,每一行的起始偏移量为key,每一行的内容为value,默认以\n或者回车键作为一个record

2)     CombinerFileInputFormat:针对大量小文件设计

3)     KeyValueFileInputFormat:针对key-value格式的文件设计,key value中间是tab分割

4)     NLineInputFormat:可以控制每一个split的行数

5)     SequenceFileInputFormat:文件格式是sequencefile(.seq)

自定义输入格式需要继承FileInputFormat并实现其两个接口函数

10.  MapReduce的输出FileOutputFormat

1) TextOutputFormat输出的每一行key value中间用tab隔开

2) SequenceFileOutputFormat:keyvalue以.seq文件保存

3) SequenceFileAsOutputFormat:keyvalue以原始二进制格式输出

4) MapFileOutputFormat:keyvalue写入MapFile文件中,写入时保证记录按key值顺序

5) MultipleOutputFormat:一个reduce产生多个输出

11.  MapReduce对输出进行压缩

常用的是压缩编码Gzip,LZO(适用于大文件压缩),Snappy

Hadoop自带小文件解决方案

1) HadoopArchive 能将小文件快速放入HDFS的文件归档工具中,能将多个小文件打包成一个HAR文件

2) Sequencefile 由一系列的二进制key/value组成的,key为小文件名,value为文件内容,将大批小文件合并成大文件

3) CombineFileInputFormat将多个小文件合并成单独的split,并会考虑数据的存储位置

 

 

 

 

小文件优化:

1) 开启JVM重用,可以提升45%的性能

2)

3) 开启并行拷贝,可以提升12%的性能

 

12.  排序中job.setComparatorClass()和job.setGroupingComparatorClass()区别

Job.setComparatorClass():对Map输出的所有键值对按照key值排序

Job.setGroupingComparatorClass():对Shuffle,Sort之后的键值对进行排序,允许一个reduce处理多个记录(即多个values)

13.  PageRank算法思想


q为G的特征向量,q的值为每个网页的评分,MapReduce是PageRank实现的基础

14.  Hadoop配置文件清单

1)  core-site.xml

  

fs.default.name       HDFS的NameNode的IP+Port

fs.defaultFS Hadoop默认的文件系统

hadoop.tmp.dir Hadoop默认的工作目录

hadoop.http.staticuser..user Hadoop默认的http用户

2)  hdfs-site.xml

dfs.namenode.name.dir  配置NameNode的工作目录(保存镜像)

dfs.namenode.edits.dir  配置NameNode的工作目录(保存编辑日志)

dfs.datanode.data.dir  配置DataNode的工作目录(保存数据块和校验块)
dfs.namenode.checkpoint.dir  配置SecondaryNameNode的工作目录(保存镜像)

dfs.namenode.checkpoint.edits.dir  配置SecondaryNameNode的工作目录(保存编辑日志)

dfs.namenode.http-address  配置NameNode的HTTP访问地址

dfs.namenode.secondary.http-address  配置SecondaryNameNode的HTTP访问地址

 

dfs.data.dir   DataNode的工作目录(保存数据块的位置)

dfs.name.dir  NameNode的工作目录(fsimage和edit log)

3)  mapred-site.xml

yarn.resourcemanager.hostname  配置ResourceManager的主机名

mapreduce.jobhistory.address  配置JobHistoryServer的IPC地址

mapreduce.jobhistory.webapp.address  配置JobHistoryServer的HTTP地址

 

 如果是完全分布式模式,一般选择3个主机,一个Master主机(启动NameNode和JobTracker守护进程),两个Slave主机(启动DataNode和TaskTracker)

15.  通过WEB页面访问HDFS NameNode和MapReduce Job信息

1)  http://localhost:50070/ 访问NameNode目录树

2)  http://localhost:19888/ 访问结束的Job(必须先执行mr-jobhistory-daemon.shstart historyserver命令启动JobHistoryServer

3)  http://localhost:8088/ 访问正在运行的应用程序


原创粉丝点击