xiaolongwu1987 发表于 2013-10-25 10:43:49

在PUT命令中使用URI,报错

背景:暂时不考虑replication,已经把replication factor设成1. 我想从HDFS外的一个数据源(本身不是datanode)将一些数据用put传送到HDFS内的某一台指定datanode上(出于某些优化需要)。于是我用了如下命令:hadoop dfs -puthdfs://:50010/
但是hadoop client会报以下错误:
put: Call to /xxx.xxx.xxx.xxx(我的datanode的ip):50010 failed on local exception: java.io.EOFException
在Old Nabble上搜索了,没有找到解决方法。Google到的类似的有的是版本不同导致的,但我使用的是统一的版本,而且如果不使用具体一个datanode的URI,而是使用相对路径(由namenode决定第一个block的位置,则没有任何错误)
真的非常希望能得到大家的帮助,谢谢。

qcbb001 发表于 2013-10-25 10:43:49

hadoop dfs -puthdfs://:/

llike90 发表于 2013-10-25 10:43:49

回复 2# amuseme
   您给出的命令里写的是namenode ip or hostname,意思是不能指定文件的第一个block要存在哪一个datanode上吗吗?因为block placement policy实际上也是以一个block已经存在于某台datanode上为前提的,如果不能指定第一个传进HDFS的block的位置,那就无法控制这个文件的block位置了。

datong838 发表于 2013-10-25 10:43:49

刚才仔细看了一下blockPlacementPolicy的代码,看来是要把一个参数从FSShell传进去,一直传到修改过的BlockPlacementPolicy里,让它选择合适的Datanode。

arsenduan 发表于 2013-10-25 10:43:49

不好意思,没看清楚你的需求,你是想把数据放到特定的DataNode上是吧》
感觉你不能通过hadoop -put来做的,因为这种方法是要先去连接NameNode的,你要这样做的话要看NameNode有没有提供这种参数在动态选择存放Block的DataNode位置。我大概看了一下,在DFSClient没有提供相应的接口来对Block的存放位置进行设置。
如果没有的话你要扩展org.apache.hadoop.hdfs.server.namenode.BlockPlacementPolicy了。

qz2003 发表于 2013-10-25 10:43:49

回复 5# amuseme
   恩,你说的很对,我现在正在扩展blockplacementpolicy,但是我找了很久没有找到从FSShell那里一步步把参数传给namenode.create()或者是FSNamesytem.StartFile()的衔接点。因为blockplacementpolicy实际上是被ReplicationMonitor定期调用来一直控制block的情况,但是我需要一个方法从Shell把指定的datanode ip传到blockplacementpolicy里面(不打算用从文件读取之类的方法因为不方便配合其他人写的脚本)。请问有什么好的建议吗吗?或者说您知道怎么把相应的参数传过去吗吗?
谢谢。

wscl1213 发表于 2013-10-25 10:43:49

这个可能比较麻烦,因为你要自己写Client与NameNode的通讯协议,让FSClient来指定文件的存储位置,而且NameNode要提供相应的操作来完成这个请求,而且你这样让用户来指定数据存放的位置感觉 不是很安全。
页: [1]
查看完整版本: 在PUT命令中使用URI,报错