hadoop遇到的一些问题

spark读取hdfs文件,连接拒绝

scala> val distFile = sc.textFile("hdfs://hadoop002:8020/ruozeinput.txt")
18/05/24 22:07:48 INFO MemoryStore: Block broadcast_8 stored as values in memory (estimated size 222.5 KB, free 412.5 MB)
18/05/24 22:07:48 INFO MemoryStore: Block broadcast_8_piece0 stored as bytes in memory (estimated size 21.1 KB, free 412.5 MB)
18/05/24 22:07:48 INFO BlockManagerInfo: Added broadcast_8_piece0 in memory on 192.168.137.201:41220 (size: 21.1 KB, free: 413.8 MB)
18/05/24 22:07:48 INFO SparkContext: Created broadcast 8 from textFile at :24
distFile: org.apache.spark.rdd.RDD[String] = hdfs://hadoop002:8020/ruozeinput.txt MapPartitionsRDD[13] at textFile at :24

scala> distFile.collect
java.net.ConnectException: Call From hadoop002/192.168.137.201 to hadoop002:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

当时按照案例上面的来写的端口,实际上这个端口应该是fs.defaultFS的端口,这个需要在编译hadoop后设置在Hadoop目录下etc/hadoop/core-site.xml里面,我设置的是9000(默认也是9000),使用9000这个端口就可以正常查看了。

Hadoop的namenode启动不了

使用./start-dfs.sh启动,再使用jps命令后发现没有namenode节点,上网上查资料发现如果不在core-site.xml里面指定tmp目录的地址,就会使用临时目录,我的是/tmp/hadoop-hadoop/(官网上面有默认的设置参数,hadoop.tmp.dir的路径以及命名规则)。最重要的是这个文件在重启时会删除,导致找不到文件,这样namenode的格式化信息就会丢失。
解决:
在core-site.xml指定目录地址:
如(写在configuration标签内):

    
         hadoop.tmp.dir
         /home/hadoop/logs/hadoop-${user.name}
    

然后格式化namenode:hadoop namenode -format
启动hdfs再jps一下就能看到namenode起来了。

另,http://blog.sina.com.cn/s/blog_ad795db30102w4a8.html,这篇讲的是pid的问题,在改这个问题的时候最好也把pid文件的目录改掉

DataNode启动不起来

是因为id和namenode不对,是多次格式化的结果。

当我们执行文件系统格式化时,会在namenode数据文件夹(即配置文件中dfs.name.dir在本地系统的路径)中保存一个current/VERSION文件,记录namespaceID,标识了所格式化的 namenode的版本。如果我们频繁的格式化namenode,那么datanode中保存(即配置文件中dfs.data.dir在本地系统的路径)的current/VERSION文件只是你第一次格式化时保存的namenode的ID,因此就会造成datanode与namenode之间的id不一致。
解决办法:把配置文件中dfs.data.dir在本地系统的路径下的current/VERSION中的namespaceID改为与namenode一样。
这个问题一般是由于两次或两次以上的格式化NameNode造成的,有两种方法可以解决,第一种方法是删除DataNode的所有资料(及将集群中每个datanode的/hdfs/data/current中的VERSION删掉,然后执行hadoop namenode -format重启集群,错误消失。<推荐>);第二种方法是修改每个DataNode的namespaceID(位于/hdfs/data/current/VERSION文件中)<优先>或修改NameNode的namespaceID(位于/hdfs/name/current/VERSION文件中),使其一致。

对于hadoop文件损坏

在使用hadoop fsck / -delete之前需要先把hadoop的安全模式退出,不然会fsck失败

使用 hadoop fsck / 检查系统状态
hdfs fsck -list-corruptfileblocks 列出损坏的块
如果损坏的块不需要:
hdfs fsck / -delete
如果损坏的块需要(就拿下来,如果不能拿下来,就无法修复了):一般是一个副本损坏或丢失的时候
hdfs dfs -get /xxx/xxx ./
hdfs haadmin

启动hadoop有个util警告(util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable)

网上说什么32位,64位,还有说修改配置文件,但是我觉得都不符合我的情况,因为我的hadoop的lib/native里面什么都没有,是个空文件夹,修改配置文件指向正确的文件夹有什么用,文件夹都是空的。
我之前安装过apache版本的hadoop(会不会是因为这个hadoop是我自己编译的,直接用官网编译好的不知道有没有),现在装的是cdh版本的,之前启动就没有报这个错,去老版本下看看,发现native文件夹下面是有东西的,打成tar包复制到现在版本的文件中。
(我直接打的native文件夹,因为里面的文件传到其他机器上的话会出现某些文件大小变成0的情况,打包就没问题了)
然后解压,在运行就不出现警告了。

不知道能不能在不同版本之间随便用,其实警告而已,还是不要随便用不同版本的文件了。

hadoop安全模式退出

hdfs dfsadmin -safemode leave
启动会进入,但是过会如果没有错误就会自动退出
其他情况一般是因为有block块坏了才进入

集群启动,总是有一个namenode启动不了(而且jobhistory也启动不了)

查看日志,出现:
java.io.EOFException: End of File Exception between local host is: “hadoop002/192.168.137.201”; destination host is: “hadoop002”:8020;

以及另一个:
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool BP-2104757036-192.168.137.200-1538194520748 (Datanode Uuid 80e961c8-add1-462a-aa87-1e5bf8b6984d) service to hadoop001/192.168.137.200:8020 Call From hadoop002/192.168.137.201 to hadoop001:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused

和这个(应该是关闭这个错误集群时出现的):
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: RECEIVED SIGNAL 15: SIGTERM

这三个错误看起来不搭,一个是主机目标不匹配,一个是连接错误,一个是信号什么东西。
上网搜EOFException,错误好像相同,说是重新格式化namenode,试过之后无效。
因为我用的是虚拟机,配置和这次启动集群的所处的网络不同,所以虚拟机的dns服务器的地址不同,虽然可以使用putty连上三台虚拟机,但是速度比原来的网络慢很多,而且不能连外网。我觉得可能是网络的问题,就把三台虚拟机的/etc/sysconfig/network-scripts/ifcfg-eth0文件修改之后,再次启动就没有这些错误了。注意vmnet8一定要启用

所以实际上这三个错误都是因为网络配置没有更新(https://blog.csdn.net/gavin_chun/article/details/77132162#commentBox)造成的。

你可能感兴趣的:(Hadoop,一些错误)