跳转至

Hadoop on Linux

概览

记录Hadoop安装使用过程遇到的问题与解决方案。因为在公司都是使用搭建好的集群,所以一般没有什么配置上的问题.这里主要记录在自己搭建的伪分布式集群中遇到的问题.

报错:Connection refused

运行hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'报的错。

注意执行操作之前要先启动Hadoop,可以通过start-dfs.sh或者start-all.sh1。原因就是Hadoop未启动成功,通过jps看到namenode并未启动。比较奇怪的是安装的时候测试还是可以的,而且是完全按照官方文档来的。

问题就在官方文档...林子雨老师的Hadoop3.1.3安装教程提到了这点:

Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。

此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行(官方教程如此),不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。所以我们进行了设置,同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。

也就是说我们按照官网的方法配置core-site.xmlhdfs-site.xml的话,重启的时候必须重新format,否则就无法启动namenode!谁没事每次启动都去格式化依次,太坑了Orz

按照林子雨老师的方法配置就不会出现这个问题。对core-site.xml配置如下

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

hdfs-site.xml配置如下

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
</configuration>

因为林老师是将Hadoop放在/usr/local, 而我是在/home/shensir/Application,所以将上面的/usr/local部分替换为/home/shensir/Application即可。

另外一点就是HDFS网页的访问地址在Linux是http://localhost:9870,好像也有的是50070端口的。我这里测试是前者。

报错:Retrying connect to server: 0.0.0.0/0.0.0.0:8032

也是运行hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'时候出错。推测是YARN配置和上面的冲突了,把YARN的配置全部清空再重启就可以了。

伪分布式: YARN上显示的内存与核数与本机器不一致

用的是实验室的服务器,32核100G+,然后部署的伪分布式,起了YARN, 在8088端口看节点配置发现只有8G,核数也不对, 原来是因为这个要自己写配置文件设置的(之前还以为是自动检测Orz)...

参考Hadoop not utilizing available memory, 在Hadoop安装目录下找到etc/hadoop/yarn-site.xml, 添加如下内容,指定当前节点可供分配的内存为80G,可用核数为24个(注意内存单位默认是M, 所以这里写81920):

<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>81920</value>
</property>

<property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>24</value>
</property>

此外注意,我们必须重启YARN才可以使得配置生效,所以执行stop-yarn.shstart-yarn.sh,再到8088端口去看就可以看到可用内存已经设置成功.

伪分布式: Container is running beyond memory limits

报错类似Container [pid=28920,containerID=container_1389136889967_0001_01_000121] is running beyond virtual memory limits. Current usage: 1.2 GB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual memory used. Killing container.

参考标题链接给的解决方案,可以调整yarn.nodemanager.vmem-pmem-ratio或者关闭虚拟内存检查(不推荐).


  1. 注意这里在加入环境变量后调用的, 其位于sbin文件夹下。