设为首页 收藏本站
查看: 1104|回复: 0

[经验分享] HADOOP-HDFS DataNode变身为存储/下载服务器

[复制链接]

尚未签到

发表于 2016-12-10 08:17:42 | 显示全部楼层 |阅读模式
Hadoop默认采用返回host的手段,给予客户端响应。在FSNamesystem端,实现了以jetty为容器的web服务,在集群中,通过HTTP可以很轻松的下载文件系统当中的某文件。不过在此,记录的不是如何下载文件,而是Hadoop未实现的几个下载功能的实现方法。
假使我们现在需要让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类进行改造了.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-312098-1-1.html 上篇帖子: 《Hadoop开发者》第一期入门专刊 下篇帖子: 我遇到的hadoop错误和解决方法汇总
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表