【问题标题】:hadoop cluster datanodes cannot be connected:all nodes has the same hostname is ok or not?hadoop集群数据节点无法连接:所有节点具有相同的主机名是否可以?
【发布时间】:2014-01-13 04:53:53
【问题描述】:

我现在正在建立一个hadoop集群(4台机器,其中1台master运行namenode和jobTracker,3台slave运行dataNode和TaskTraker)。但是很遗憾所有datanode都无法连接。我运行sudo netstat -ntlp on主机,结果为:

tcp        0      0 0.0.0.0:52193           0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:39267           0.0.0.0:*               LISTEN      7284/rpc.mountd 
tcp        0      0 0.0.0.0:33219           0.0.0.0:*               LISTEN      7284/rpc.mountd 
tcp        0      0 0.0.0.0:41000           0.0.0.0:*               LISTEN      1539/mongos     
tcp6       0      0 :::50030                :::*                    LISTEN      604/java        
tcp6       0      0 :::57134                :::*                    LISTEN      32646/java      
tcp6       0      0 :::111                  :::*                    LISTEN      13786/rpcbind   
tcp6       0      0 :::57428                :::*                    LISTEN      -               
tcp6       0      0 :::57173                :::*                    LISTEN      7284/rpc.mountd 
tcp6       0      0 :::50070                :::*                    LISTEN      32646/java      
tcp6       0      0 :::5910                 :::*                    LISTEN      2452/Xvnc       
tcp6       0      0 :::22                   :::*                    LISTEN      32473/sshd      
tcp6       0      0 :::50744                :::*                    LISTEN      7284/rpc.mountd 
tcp6       0      0 :::55036                :::*                    LISTEN      14031/rpc.statd 
tcp6       0      0 :::42205                :::*                    LISTEN      7284/rpc.mountd 
tcp6       0      0 :::44289                :::*                    LISTEN      504/java        
tcp6       0      0 :::2049                 :::*                    LISTEN      -               
tcp6       0      0 :::38950                :::*                    LISTEN      604/java        
tcp6       0      0 192.168.10.10:9000      :::*                    LISTEN      32646/java      
tcp6       0      0 192.168.10.10:9001      :::*                    LISTEN      604/java        
tcp6       0      0 :::50090                :::*                    LISTEN      504/java

我的 3 台 datanodes 机器的异常消息是相同的(当然它们有不同的 ips): datanode 192.168.10.12的错误日志:

2014-01-13 12:41:02,332 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source ugi registered.
2014-01-13 12:41:02,334 WARN org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Source name ugi already exists!
2014-01-13 12:41:03,427 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: mongodb/192.168.10.12:9000. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS)
2014-01-13 12:41:04,427 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: mongodb/192.168.10.12:9000. Already tried 1 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS)
2014-01-13 12:41:05,428 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: mongodb/192.168.10.12:9000. Already tried 2 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS)
2014-01-13 12:41:06,428 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: mongodb/192.168.10.12:9000. Already tried 3 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS)

那么,让我困惑的是,为什么每个datanode都在尝试连接自己?例如,datanode 192.168.10.12的错误日志显示它正在尝试在端口9000上连接192.168.10.12,并且有12 上没有这样的监听端口。

我所有集群节点的主机名相同但ips不同(master:192.168.10.10 slaves:192.168.10.11,192.168.10.12,192.168.10.13),我所有的配置文件,包括core-site.xml,hdfs-site.xml和@ 987654326@直接用ip地址,我用sudo ufw status,显示所有机器的防火墙都是**inactive**

这4台机器的配置文件是一样的(当然ip不一样):

核心站点.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://192.168.10.12:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/hadoop/tmp</value>
    </property>
</configuration>

hdfs-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
     <property>
            <name>dfs.replication</name>
                <value>3</value>
         </property>
         <property>
        <name>dfs.name.dir</name>
        <value>/var/hadoop/name</value>
    </property>
        <property>
        <name>dfs.data.dir</name>
        <value>/var/hadoop/data</value>
    </property>
</configuration>

mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
     <property>
                  <name>mapred.job.tracker</name>
                  <value>http://192.168.10.12:9001</value>
     </property>
</configuration>

/etc/hosts 在我的主人::

127.0.0.1       localhost
192.168.10.12   mongodb
192.168.10.12   localhost
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

文件/etc/hosts的第2行,mongodb是集群的主机名,其他三个slave的主机名也是mongodb(因为这些机器是用来做mongodb集群的)。

我强烈怀疑是 tcp6 引起了问题。那么,如何使用tcp网络而不是tcp6来启动hadoop呢?

所以,我的问题是:

1.hadoop是在tcp6而不是tcp下启动的好吗?

2.所有集群机器的主机名相同但局域网ip不同的hadoop可以吗?

那么,有什么建议吗?

【问题讨论】:

  • 你检查你的防火墙设置了吗?
  • 我使用 sudo ufw 状态,它显示:inactive,适用于所有机器。
  • 重启所有四个服务(namenode、datanode、jobtracker和tasktrakcer)然后检查。你在namenode机器的主机文件中设置了什么IP?
  • @Sudz,你说的主机文件是什么意思?我已经编辑了我的问题并粘贴了我的主人的 /etc/hosts 文件。
  • 主机文件的含义与您的 /etc/hosts 相同。您需要评论第一行。 localhost 已经多了一个条目

标签: hadoop


【解决方案1】:

两个不同的错误导致我的问题: 1:对于3个slave的每个core-site.xml文件,the value of fs.default.name means the namenode's ip address,所以都应该是master的ip地址,但我写的是每个slave的ip地址。因此,当我在 master 中使用 start-all.sh 时,每个 slave 都试图连接到自己的端口 9000,而不是 master 的。由于 slave 是作为 datanode 运行,而不是 namenode,所以连接被拒绝。

2:我为3个slave修改core-site.xml的ip地址后,虽然每个slave都尝试连接到master的9000端口,但连接仍然被拒绝。我在master上运行sudo netstat -ntlp,它显示:

tcp6       0      0 127.0.0.1:9000      :::*                    LISTEN      32646/java 

这个 127.0.0.1 表示它只监听来自 lcoalhost 的 9000 上的连接,无法接收到来自外部的 9000 上的所有连接。所以,问题出在文件 /etc/hosts.My /ect/hosts 文件如下:

192.168.10.12   localhost
192.168.10.12   mongodb
127.0.0.1       localhost

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

由于我在配置文件中使用了ip地址,所以在这样的配置文件中,ip地址192.168.10.12将被翻译成主机名localhost,我运行host localhost,它显示:localhost has address 127.0.0.1.So,这样一个配置会导致hadoop只会监听127.0.0.1:9000。所以,我修改了这个文件(切换第 1 行和第 2 行):

    192.168.10.12   mongodb
    192.168.10.12   localhost
    127.0.0.1       localhost

    # The following lines are desirable for IPv6 capable hosts

::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

我重新启动 hadoop 和 sudo netstat -ntlp ,它显示:

tcp6       0      0 192.168.10.10:9000      :::*                    LISTEN      32646/java 

一切正常。因为master正在监听它的局域网IP地址,而不是仅仅环回本地主机。

【讨论】:

    【解决方案2】:

    您的 core-site.xml 必须有 namenode Ip 地址,并且您的从属服务器必须在 /etc/hosts 中有不同的主机名。

    它应该像这样工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 2017-01-09
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多