hadoop配置及无法移动文件到hdfs故障解析

首先博主用的64位ubuntu,hadoop官方只提供32位版本,这样的话启动本地库无法兼容,需要自己编译为64位版本,或下载别人编译好的64位版本。

下载好需要在etc/hadoop目录下改动以下几个配置

其中hadoop-env.sh中需要指定JAVA_HOME

export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_75

core-site.xml配置

<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://xiao:9000/</value>
</property>
<property>
<name>hadoop.native.lib</name>
<value>true</value>
<description>Should native hadoop libraries, if present, be used.</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/xiao/download/hadoop-2.4.0/tmp/</value>
</property>
</configuration>

hdfs-site.xml配置

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

mapred-site.xml配置

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

yarn-site.xml配置

<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>xiao</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>

配置好后启动需要关闭防火墙以及安装好ssh

sudo apt-get update

sudo apt-get install openssh-server

然后格式化namenode

hadoop namenode -format

然后切换到sbin目录下启动

start-dfs.sh

start-yarn.sh

查看目录下文件

hadoop fs -ls hdfs://xiao:9000/

拷贝本地文件到hdfs下

hadoop fs -put a.txt hdfs://xiao:9000/

这一步楼主遇到一个故障

尝试了网上各种办法无效。

看了下logs里面的日志其中datanode日志无错误,namenode日志报上述错误,可见跟datanode无关,用命令查看datanode状态

按照report的数据DFS还剩下(541.63 MB)的大小,应该是可以创建的,但是抛出了这个异常,肯定是对DATANODE的剩余最小容量做了限制。

查了一下HADOOP 2.2.0的源码,org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault的方法isGoodTarget中,会对DATANODE的剩余容量进行判断:

long remaining = node.getRemaining() - 
                     (node.getBlocksScheduled() * blockSize); 
    // check the remaining capacity of the target machine
    if (blockSize* HdfsConstants.MIN_BLOCKS_FOR_WRITE>remaining) {
      if(LOG.isDebugEnabled()) {
        threadLocalBuilder.get().append(node.toString()).append(": ")
          .append("Node ").append(NodeBase.getPath(node))
          .append(" is not chosen because the node does not have enough space ");
      }
      return false;
    }

然后博主清空了下目录里面的文件,剩余大小为900多M,再执行下命令,成功。

posted on 2015-09-19 11:03  颓废的悠然  阅读(1067)  评论(0编辑  收藏  举报

导航