更改 dfs 文件的块大小
Posted
技术标签:
【中文标题】更改 dfs 文件的块大小【英文标题】:Change block size of dfs file 【发布时间】:2010-04-19 18:18:19 【问题描述】:在解析一组特定文件(总共 2 TB)时,我的地图目前效率低下。我想更改 Hadoop dfs 中文件的块大小(从 64MB 到 128MB)。我无法在文档中找到仅针对一组文件而不是整个集群的操作方法。
上传时哪个命令会更改块大小? (比如从local复制到dfs。)
【问题讨论】:
不确定参数是否/何时更改,但现在称为“dfs.block.size”。 你为什么不改变你的地图缩小作业的分割大小? @ozw1z5rd AFAIK 您无法更改拆分大小或拆分数量。对于 MR2,它取决于您的块大小,并且在作业提交时会自动计算拆分的数量。 【参考方案1】:对我来说,我不得不稍微更改 Bkkbrad 的答案以使其与我的设置一起使用,以防其他人稍后发现此问题。我在 Ubuntu 10.10 上运行了 Hadoop 0.20:hadoop fs -D dfs.block.size=134217728 -put local_name remote_location
我的设置不是fs.local.block.size
,而是dfs.block.size
【讨论】:
注意 hadoop 2.0.4 的新变化:dfs.blocksize (hadoop.apache.org/docs/r2.0.4-alpha/hadoop-project-dist/…) dfs.blocksize: hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/…【参考方案2】:我改变我的答案!您只需要在使用命令行时适当地设置fs.local.block.size
配置设置即可。
hadoop fs -D fs.local.block.size=134217728 -put local_name remote_location
原答案
您可以在使用 Hadoop API 创建文件时以编程方式指定块大小。不幸的是,您不能在命令行中使用hadoop fs -put
命令执行此操作。要做你想做的事,你必须编写自己的代码来将本地文件复制到远程位置;这并不难,只需为本地文件打开一个FileInputStream
,使用FileSystem.create
创建远程OutputStream
,然后使用Apache Commons IO 中的IOUtils.copy
之类的东西在两个流之间进行复制。
【讨论】:
使用上述命令后,我尝试检查文件中的块。 hdfs fsck hvr.out1 -files -blocks -locations。 hvr.out1 是我的文件。看起来它没有使用我指定的块大小进行拆分。相反,它使用了默认的块大小【参考方案3】:你也可以像这样在你的程序中修改你的块大小
Configuration conf = new Configuration() ;
conf.set( "dfs.block.size", 128*1024*1024) ;
【讨论】:
此配置设置将如何影响已经以特定默认块大小存储的数据? Hadoop 2.5.2 128MB?【参考方案4】:我们可以使用 hdfs-site.xml 文件中名为 dfs.block.size 的属性更改块大小。 笔记: 我们应该提到比特的大小。 例如 : 134217728 位 = 128 MB。
【讨论】:
你确定大小是位吗?在您的示例中,值 134217728 以字节为单位,而不是以位为单位。【参考方案5】:在conf/文件夹中,我们可以更改配置文件hdfs-site.xml中dfs.block.size
的值。
在 hadoop 1.0 版中,默认大小为 64MB,在 2.0 版中,默认大小为 128MB。
<property>
<name>dfs.block.size<name>
<value>134217728<value>
<description>Block size<description>
<property>
【讨论】:
以上是关于更改 dfs 文件的块大小的主要内容,如果未能解决你的问题,请参考以下文章