浏览 2605 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-02-09
最后修改:2010-02-09
假使我们现在需要让DataNode成为我们存储系统的下载、及存储服务器。那么按照现有的Hadoop的实现,会遇到如下问题: 1. 远程机无法下载文件。 2. 远程机器无法使用flashGet、迅雷等下载工具,实现断点下载。 3. 远程机可以任意拼出HTTP地址,下载集群中的文件。 首先出现第一种情况的主要原因是,远程机无法解析Datanode的host。因为在namenode接收到web请求时,servlet默认返回的是存在该BLOCK的节点的host,那么解决的方法是返回Datanode的ip地址。这里如果在应用中,存在一个注意点,那就是在我们的集群中,我们让集群内部通信,使用各自的内网地址。然而对外返回时,使用其各个节点的公网地址。初使阶段,我尝试过让Datanode的公网地址通过注册,告知Namenode,不过这种方法有几个毛病:1. 修改hdfs的代码量巨大,2. 在公网地址改变时,需要重起节点。 朋友们如想修改代码,我这里可以提供点思路供参考,在DatanodeID中,加入一个公网地址的字段。同时实现readFied/writeFied方法。不过抱歉的是,当时调试时还是失败了。不过之前我的分存式系统居然没有出现问题,由于时间问题,所以没来的急研究,在linux及Cygwin中,put文件时未出现问题,不过Hadoop Over Ftp中,传输文件时,cast 下面的异常: Exception in thread "IPC Client (47) connection to /192.168.3.*:54310 from xxx" java.lang.NegativeArraySizeException at org.apache.hadoop.io.Text.readString(Text.java:401) at org.apache.hadoop.hdfs.protocol.DatanodeInfo.readFields(DatanodeInfo.java:342) at org.apache.hadoop.hdfs.protocol.LocatedBlock.readFields(LocatedBlock.java:133) at org.apache.hadoop.io.ObjectWritable.readObject(ObjectWritable.java:237) at org.apache.hadoop.io.ObjectWritable.readFields(ObjectWritable.java:66) at org.apache.hadoop.ipc.Client$Connection.receiveResponse(Client.java:506) at org.apache.hadoop.ipc.Client$Connection.run(Client.java:438) 问题1的解决方案是,在Namende#FSNameystem中,做一个Map,用于存各个节点的内网及公网地址。当然最好是被一个类封装,然后定义一个本地文本文件。启动NameNode时,从本地文件读入。当节点地址发生变更时,我们调用dfsadmin –refresh命令,在fsnamesystem的refreshNodes方法中,加入更新公网地址的方法,就OK了。 问题2 在保证可以下载文件之后,接下来可以扩展其他功能,如断点下载。Hadoop默认是一次性把文件读完的。要做到这一点,其实不难,只需要了解Http头信息的处理,以前调用hadoop的open(offset)方法即可。 在HTTP头信息中,主要是读取Range的头信息,关于格式,可以参考RFC文档,有更为详细的说明,那么程序也就根据规范来实现即可。那么最后主要是取得offset参数就行。 问题3 这个问题实际对hadoop的更改并不多,主要是添加防盗链的技术。可以通过时间、加解密等方法实现。 作于: 2009-5-26 本贴只是重新copy过来重新发布的而已, 在HADOOP-0.21的trunk版本, hadoop已经对StreamFile类进行改造了. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-04
不错,回复内容太短
|
|
返回顶楼 | |