• 1. Hadoop平台结构浅析什么是Hadoop? Hadoop是Apache下面的一个分布式并行计算框架,是从Lunece中抽取出来的一个框架。Hadoop的核心设计思想是MapReduce和HDFS,其中MapReduce是 Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。
  • 2. 前提和设计目标 1. 硬件错误是常态,而非异常情况,HDFS可能是有成百上千的server组成,任何一个组件都有可能一直失效,因此错误检测和快速、自动的恢复是HDFS 的核心架构目标。 2. 跑在HDFS上的应用与一般的应用不同,它们主要是以流式读为主,做批量处理;比之关注数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。
  • 3. 3. HDFS以支持大数据集合为目标,一个存储在上面的典型文件大小一般都在千兆至T字节,一个单一HDFS实例应该能支撑数以千万计的文件。 4. HDFS应用对文件要求的是write-one-read-many访问模型。一个文件经过创建、写,关闭之后就不需要改变。这一假设简化了数据一致性问 题,使高吞吐量的数据访问成为可能。典型的如MapReduce框架,或者一个web crawler应用都很适合这个模型。
  • 4. 5. 移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此。将计算移动到数据附近,比 之将数据移动到应用所在显然更好,HDFS提供给应用这样的接口。 6. 在异构的软硬件平台间的可移植性。
  • 5. Hadoop的What, Why, HowHadoop框架中最核心的设计就是:MapReduce和HDFS。 MapReduce的思想是由Google的一篇论文所提及而被广为流传的,简单的一句话解释MapReduce就是“任务的分解与结果的汇总”。 HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的缩写,为分布式计算存储提供了底层支持。
  • 6. Reduce”就是将分解后多任务处理的结果汇总起来,得出最后的分析结果。在分布式系统中,机器集群就可以看作硬件资源池,将并行的任务拆分,然后交由每一个空闲机器资源去处理,能够极大地提高计算效率 任务分解处理以后,那就需要将处理以后的结果再汇总起来,这就是Reduce要做的工作。
  • 7. (本页无文本内容)
  • 8. HDFS结构分析HDFS是一个大规模的分布式文件系统,采用master/slave架构。一个HDFS集群是有一个Namenode和一定数目的Datanode组成。Namenode是一个中心服 务器,负责管理文件系统的namespace和客户端对文件的访问。Datanode在集群中一般是一个节点一个,负责管理节点上它们附带的存储。
  • 9. Namenode执行文件系统的namespace操作,例如打开、关闭、重命名文件和目录,同时决定block到具体Datanode节点的映射。 Datanode在Namenode的指挥下进行block的创建、删除和复制。Namenode和Datanode都是设计成可以跑在普通的廉价的运行 linux的机器上。
  • 10. HDFS架构图
  • 11. Hadoop的源代码现在已经对外公布,用户可以从它的官方网站上下载源代码并自己编译,从而安装在Linux或者Windows机器上。
  • 12. Hadoop的基本结构基本模型Master / Slaves / Client 其对应的实现: Master– NameNode Slaves–DataNode s Client –DFSClient
  • 13. (本页无文本内容)
  • 14. 可移植性与通用性Hadoop的框架代码采用Java编写,这就保证了其良好的移植性与通用性 但是在其上运行的应用程序并不局限于使用Java语言,使用C++,Python,Perl语言均可以方便地编写
  • 15. (本页无文本内容)
  • 16. 一些包与依赖关系
  • 17. 通信接口由于Hadoop 的MapReduce和HDFS都有通信的需求,需要对通信的对象进行序列化。Hadoop并没有采用Java的序列化,而是引入了它自己的系统。 org.apache.hadoop.io中定义了大量的可序列化对象,他们都 实现了Writable接口
  • 18. 实现了Writable接口的一个典型例子如下 public class MyWritable implements Writable {          // Some data               private int counter;          private long timestamp;               public void write(DataOutput out) throws IOException {              out.writeInt(counter);              out.writeLong(timestamp);          }                   public void readFields(DataInput in) throws IOException {              counter = in.readInt();              timestamp = in.readLong();          }               public static MyWritable read(DataInput in) throws IOException {              MyWritable w = new MyWritable();              w.readFields(in);              return w;          }      }   
  • 19. 下图给出了org.apache.hadoop.io中对象的关系。
  • 20. 分析 org.apache.hadoop.rpc RPC 采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。当我们讨论HDFS的,通信可能发生在: Client-NameNode之间,其中NameNode是服务器 Client-DataNode之间,其中DataNode是服务器 DataNode-NameNode之间,其中NameNode是服务器 DataNode-DateNode之间,其中某一个DateNode是 服务器,另一个是客户端
  • 21. 下图是org.apache.hadoop.rpc 的类图
  • 22. 由于Client 可能和多个Server通信,典型的一次HDFS读,需要和NameNode打交道,也需要和某个/某些DataNode通信。这就意味着某一个 Client需要维护多个连接。同时,为了减少不必要的连接,现在Client的做法是拿ConnectionId(图中最右侧)来做为 Connection的ID。ConnectionId包括一个InetSocketAddress(IP地址+端口号或主机名+端口号)对象和一个用户 信息对象。这就是说,同一个用户到同一个InetSocketAddress的通信将共享同一个连接。
  • 23. (本页无文本内容)
  • 24. 一个RPC 调用通过addCall,把请求加到Connection里。为了能够在这个框架上传输Java的基本类型,String和Writable接口的实现 类,以及元素为以上类型的数组,我们一般把Call需要的参数打包成为ObjectWritable对象。 Client.Connection会 通过socket连接服务器,连接成功后回校验客户端/服务器的版本号 (Client.ConnectionwriteHeader()方法),校验成功后就可以通过Writable对象来进行请求的发送/应答了。注意,每 个Client.Connection会起一个线程,不断去读取socket,并将收到的结果解包,找出对应的Call,设置Call并通知结果已经获 取。 Call使用Obejct的wait和notify,把RPC上的异步消息交互转成同步调用。 还有一点需要注意,一个Client会有多个Client.Connection,这是一个很自然的结果。