2013-09-23 74 views
0

时BLOCKSIZE默认为128 MB不知是以下现象是因为它应该是(hadoop的2.1.0-β):HDFS使用的Java API

我改变了dfs.blocksize为64M在HDFS现场。 XML。如果我通过hdfs dfs -put src dst上传文件,blocksize会正确显示为64mb(在web界面中)。但是,如果我使用java api(这里通过scala),该文件的块大小为128mb(默认值)。

我的应用程序的类路径中没有配置文件,因为我预计namenode应该知道它的块大小。下面是我如何使用Java API:

val hdfsConf = new Configuration() 
hdfsConf.set("fs.defaultFS", hdfsAddress) 
FileSystem.get(hdfsConf) 
... 
val delSource = false; val overWrite = false 
fs.copyFromLocalFile(delSource, overWrite, new Path(localPath), new Path(destinationPath)) 

是我的namenode配置错误,以便它不应用正确的块大小?或者这是预期的行为?

增加:这是我开始我的NameNode:

hadoop-2.1.0-beta/sbin/hadoop-daemon.sh --config /home/andre/experiments/suts/hadoop-2.1.0-beta/conf --script hdfs start namenod 

HDFS的-site.xml中是在指定的文件夹,并在它这个属性:

<property> 
    <name>dfs.blocksize</name> 
    <value>64m</value> 
</property> 

我没有指定$ HADOOP_CONF_DIR,因为我在这台机器上的多个hadoop安装之间切换(我希望也不要认为这是必要的)。

+1

块大小在客户端确定。当你创建一个文件时,客户端会计算块大小(如果你没有设置,它将是默认值),并告诉namenode。所以如果你在java应用程序中使用任何配置文件,它应该是默认值。 – zsxwing

+0

谢谢,这是有道理的,虽然我认为namenode决定blocksize也是直观的。所以如果我理解正确,命令“hdfs dfs -put ...”只能工作,因为这个客户端知道配置目录? –

+0

对不起,我的错字。正确的是“如果你没有在你的Java应用程序中使用任何配置文件,它应该是默认值。”如果你使用“hdfs dfs -put”,hadoop会自己找到配置目录。 – zsxwing

回答

0

第一负载HDFS通定制HDFS大小的数据(不是默认128MB),那么当你你会访问该通java的,那么你会得到正确的大小。

hadoop fs -D dfs.block.size = 16777216 -put。