UBUNTU虚拟机器上配置Hadoop时遇到的问题以及经验

来源:互联网 发布:新蛋现在怎么样 知乎 编辑:程序博客网 时间:2024/05/23 02:02

希望对大家有帮助(注意红字,这是本人遇到过的问题)


一、JAVA_HOME 不正确(WIN7)

是因为JAVA_HOME的路径上有空格引起的。

解决方案:

a:重新安装JDK

b:找到hadoop-2.7.1\etc\hadoop\路径下的hadoop-env.cmd

添加配置:set JAVA_HOME=D:\\PROGRA~1\Java64\jdk7

注意使用D:\\PROGRA~1\替换 D:\\ProgramFiles\

 

二、MyEclipse 配置Hadoop

 1. 打开一个View:

【Window】->【Show View】->【Other...】->【MapReduce Tools】->【Map/Reduce Locations】->【OK】

2. 添加Hadoop location:

 

location name: 我填写的是:localhost.
Map/Reduce Master 这个框里
Host:就是jobtracker 所在的集群机器,这里写localhost
Hort:就是jobtracker 的port,这里写的是9999
这两个参数就是mapred-site.xml里面mapred.job.tracker里面的ipport  
DFS Master 这个框里
Host:就是namenode所在的集群机器,这里写localhost
Port:就是namenode的port,这里写8888
这两个参数就是core-site.xml里面fs.default.name里面的ipport
(Use M/R master host,这个复选框如果选上,就默认和Map/Reduce Master这个框里的host一样,如果不选择,就可以自己定义输入,这里jobtracker 和namenode在一个机器上,所以是一样的,就勾选上)

 user name:这个是连接hadoop的用户名,因为我是用lsq用户安装的hadoop,而且没建立其他的用户,所以就用lsq。下面的不用填写。
然后点击finish按钮,此时,这个视图中就有多了一条记录。

 

三、hadoop Input path does not exist:

     user是固定不变的 需要自己创建

     zj:即hadoop的用户名,一般为电脑用户名

 

三、hadoop配置文件详解

core-site.xml是全局配置,hdfs-site.xml和mapred-site.xml分别是hdfs和mapred的局部配置。

四、2个Hadoop服务器启动结果

只启动Master服务器,Master服务器自动启动Slave服务器

 

五、关于 Warning: $HADOOP_HOME is deprecated.

hadoop安装完之后敲入hadoop命令时,老是提示这个警告:

    Warning:$HADOOP_HOME is deprecated.

经查hadoop-1.1.2/bin/hadoop脚本和"hadoop-config.sh"脚本,发现脚本中对HADOOP_HOME的环境变量设置做了判断,其实根本不需要设置HADOOP_HOME环境变量。

解决方案一:编辑"/etc/profile"文件,去掉HADOOP_HOME的变量设定,重新输入hadoop fs命令,警告消失。

解决方案二:编辑"/etc/profile"文件,添加一个环境变量,之后警告消失:

    exportHADOOP_HOME_WARN_SUPPRESS=1

六、解决"no datanode to stop"问题/Slave 机器的namenode启动(slave机器的namenode不应该启动的)

当我停止Hadoop时发现如下信息:

    nodatanode to stop

原因:每次namenode format会重新创建一个namenodeId,而tmp/dfs/data下包含了上次format下的id,namenode format清空了namenode下的数据,但是没有清空datanode下的数据,导致启动时失败,有两种解决方案:

第一种解决方案如下:

1)先删除"/usr/hadoop/tmp"

rm -rf/usr/hadoop/tmp

2)创建"/usr/hadoop/tmp"文件夹

mkdir/usr/hadoop/tmp

4)重新格式化hadoop

 

hadoop namenode-format

5)启动hadoop

start-all.sh

使用第一种方案,有种不好处就是原来集群上的重要数据全没有了。假如说Hadoop集群已经运行了一段时间。建议采用第二种。

第二种方案如下:

1)修改每个Slave的namespaceID使其与Master的namespaceID一致。

   或者

2)修改Master的namespaceID使其与Slave的namespaceID一致。

该"namespaceID"位于"/usr/hadoop/tmp/dfs/name/current/VERSION"文件中,前面蓝色的可能根据实际情况变化,但后面红色一般是不变的。

例如:查看"Master"下的"VERSION"文件

本人建议采用第二种,这样方便快捷,而且还能防止误删。

七、Slave服务器中datanode启动后又自动关闭

查看日志发下如下错误。

    ERROR org.apache.hadoop.hdfs.server.datanode.DataNode:java.io.IOException: Call to ... failed on local exception:java.net.NoRouteToHostException: Noroute to host

解决方案是:关闭防火墙

八、 从本地往hdfs文件系统上传文件

出现如下错误:

INFOhdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad connect ack with firstBadLink

INFOhdfs.DFSClient: Abandoning block blk_-1300529705803292651_37023

WARNhdfs.DFSClient: DataStreamer Exception: java.io.IOException: Unable to create new block.

解决方案是:

1)关闭防火墙

2)禁用selinux

    编辑 "/etc/selinux/config"文件,设置"SELINUX=disabled"

九、 安全模式导致的错误

出现如下错误:

org.apache.hadoop.dfs.SafeModeException: Cannot delete ..., Name node is in safe mode

在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。

解决方案是:关闭安全模式

hadoop dfsadmin-safemode leave

十、 解决Exceeded MAX_FAILED_UNIQUE_FETCHES

出现错误如下:

Shuffle Error:Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out

程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了。

解决方案是:修改2个文件。

1)"/etc/security/limits.conf"

    vi/etc/security/limits.conf

加上:

    softnofile 102400

    hardnofile 409600

2)"/etc/pam.d/login"

    vim/etc/pam.d/login

添加:

    sessionrequired /lib/security/pam_limits.so

针对第一个问题我纠正下答案:

这是reduce预处理阶段shuffle时获取已完成的map的输出失败次数超过上限造成的,上限默认为5。引起此问题的方式可能会有很多种,比如网络连接不正常,连接超时,带宽较差以及端口阻塞等。通常框架内网络情况较好是不会出现此错误的。

十一、 解决"Too many fetch-failures"

出现这个问题主要是结点间的连通不够全面。

解决方案是:

1)检查"/etc/hosts"

要求本机ip 对应服务器名

要求要包含所有的服务器ip +服务器名

2)检查".ssh/authorized_keys"

要求包含所有服务器(包括其自身)的public key

十二、处理速度特别的慢

出现map很快,但是reduce很慢,而且反复出现"reduce=0%"。

解决方案如下:

结合解决方案5.7,然后修改"conf/hadoop-env.sh"中的"export HADOOP_HEAPSIZE=4000"

十三、 解决hadoop OutOfMemoryError问题

出现这种异常,明显是jvm内存不够得原因。

解决方案如下:要修改所有的datanode的jvm内存大小。

    Java–Xms 1024m -Xmx 4096m

一般jvm的最大内存使用应该为总内存大小的一半,我们使用的8G内存,所以设置为4096m,这一值可能依旧不是最优的值。

十四、Could not find or load main class"-Djava.library.path=.home.hadoop.hadoop-2.5.2.lib"

exportHADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"(错误)

去掉引号

exportHADOOP_OPTS=-Djava.library.path=$HADOOP_HOME/lib(正确)

十五、dataNode日志出现:Problem connecting to server:Master.Hadoop

 SlavedataNodeMaster192.168.222.120:50070DataNodes中始终看不到

 

原因:

1.hadoop启动的时候只监听了127.0.0.1:9000一个端口,而不是192.168.222.120:9000

在etc/hosts中移除127.0.0.1  Master.Hadoop

 

2.检查 Master Slave两台机器的配置文件:

 

可以在Master机器上用:netstat -an | grep 9000  检测Master9000 端口的打开情况

可以在Slave 机器上用:telnet Master.Hadoop 9000  检测是否能连上Master机器的9000端口

fs.default.name 一定要配置MasterIP和端口

mapred.job.tracker一定要配置MasterIP和端口

 

十六、Slave机器(datanode机器)的tmp文件是可以清空的

十七、使用虚拟机的IP:50070 无法访问

虚拟机内部使用虚拟机的IP:50070无法访问:

1.浏览器代理没关

2.防火墙没关

3.Master,Slave 虚拟机中的hosts文件中有 127.0.0.1 XXX.Hadoop.

应该把这个删掉

真实主机 使用虚拟机的IP:50070无法访问

1.浏览器代理没关

2.防火墙没关

3.真实主机与虚拟机不在一个IP段

十八、JAVA 程序在HDFS中添加文件的时候出现:

Permission denied: user=zj,access=WRITE,inode="":root:supergroup:rwxr-xr-x

可以看出是权限不足的问题,通过网上翻阅资料,找到了一个经测试可行的办法;

解决方案:在Hadoop集群的hdfs-site.xml文件中添加以下节点

<property>

   <name>dfs.permissions</name>

   <value>false</value>

 </property>

 

重启hadoop集群即可

 

十九、HDFS可以配置多个dir

<property>

<name>dfs.datanode.data.dir</name>

<value>file:///home/hadoop2/dfs/data,/hdfs/data</value>

</property>

二十、显示socketdata.txt文件由哪些块构成

 

hdfs fsck  socketdata.txt   -files  -blocks

hadoop  fsck  myfile/126.zip   -files  -blocks

Hadoop fsck / -files -blocks

当集群中的datanode数小于3时,块的复制份数也不会超过3

分析结果是:文件不够一个块的大小时,也单独占用一个块。

查看map源码,map任务也不会跨文件处理

两个文件不会共用一个块

不同的是,在HDFS中,如果一个文件大小小于一个数据块的大小,它是不需要占用整个数据块的存储空间的。、

二十一、Hadoop-2.X中HDFS文件块大小默认为128M了

0 0
原创粉丝点击