最近在物理机上部署hadoop集群,部署之前学习了很多理论知识,实际部署的时候还是遇到了很多问题。
在安装目录下有个logs/文件夹,查看WARN,Error,Exception关键字,几乎所有的问题都会得到解决
1.hadoop基础视频
这个视频讲解得很通透,易懂。HDFS API部分。
2.大前提是jdk和hadoop版本要选对,不然会很麻烦。
3.然后eclipse最好也是安装到linux上,且安装eclipse的这台服务器的jdk版本要和hadoop集群的jdk为一个版本。
4.eclipse这台服务器要安装图形界面,且要和集群能进行通信。
5.启动进程时 start-dfs.sh时候要以一个用户执行,不要中途换来换去,或者是换成root,一次以root用户启动后,部分文件会改变属主,就会产生很多问题。
1.Exception in thread “main” java.lang.UnsupportedClassVersionError:,org/apache/hadoop/hdfs/server/datanode/DataNode : Unsupported major.minor version 51.0
这个问题是在启动时候发生的,主要是由于jdk版本和hadoop版本不匹配造成的。
我之前没有意识到,又重新换了新版本部署。
通过指令java -version查看java版本
hadoop version查看hadoop版本
hadoop版本>=2.7:要求Java 7(openjdk/oracle)
hadoop版本<=2.6:要求Java 6(openjdk/oracle)
2.Caused by: java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: Illegal to have multiple roots (start tag in epilog?). at [row,col,system-id]: [26,2,“file:/usr/lib/hadoop-3.1.0/etc/hadoop/mapred-site.xml”
configuration配对出现并且只能有一对
3.重新格式化之后导致的命名空间ID不匹配问题
WARN org.apache.hadoop.hdfs.server.common.Storage: Failed to add storage directory [DISK]file:/home/hadoop/dfs/data/
java.io.IOException: Incompatible namespaceIDs in /home/hadoop/dfs/data: namenode namespaceID = 1624888432; datanode namespaceID = 1261599561
在出问题的datanode节点上删除data目录,data目录即是在hdfs-site.xml文件中配置的dfs.data.dir目录,再重新格式化
参考FSNamesystem: FSNamesystem initialization failed
4.org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.RPC$VersionMismatch): Server IPC version 5 cannot communicate with client version 9
这个问题是我在部署好了集群,然后用另外一台机器的eclipse上写好了JAVA 客户端访问hdfs时候出现的问题,应该是eclipse上的JDK版本和集群的jdk版本不一致造成的。
然而当时没意识到是这个问题。。
5.home/hadoop/hadoop-0.22.0/bin/hdfs: line 319: /usr/lib/java/jdk1.6.0_45**/bin/java: No such file or directory**
这个在很多时候都会发生,主要就是配置环境变量的问题。我是在/etc/profile里配置的,也可在用户目录~/.bashrc里配置,这两个文件一个是全局配置,一个是当前用户有效。还有login_shell和非login_shell的区别。
export JAVA_HOME=/home/hadoop/jdk1.8.0_131//这里换成自己安装jdk的路径
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar:.
export PATH=${JAVA_HOME}/bin:$PATH
export HADOOP_HOME=/home/hadoop/hadoop-2.10.0//这里换成安装hadoop的路径
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
hadoop-env.sh 这个文件里面的jdk版本要与上面的版本一致,不然报1的错误,版本不一致,不能正确识别hadoop版本
export JAVA_HOME=/home/hadoop/jdk1.8.0_131
6.java.lang.NoClassDefFoundError: org/apache/hadoop/crypto/key/KeyProviderTokenIssuer
这个问题是在编译eclipse端程序的时候出现的,是导入包的问题,还有一个包冲突的问题。我开始从hadoop上导入到eclipse里的包与集群的hadoop版本不一致,就出现了这个报错。换成一致的版本后,就没有问题了。具体导入方法
java外包导入eclipse
这是简单粗暴的方法,可以更灵活的选add extra jar导入,但是一直报no handler的错误,暂时没有得到解决。可以网上多查查资料。
7.org.apache.hadoop.hdfs.server.namenode.FSNamesystem: FSNamesystem initialization failed.
初始化失败有很多原因,查看日志文件具体分析是什么问题,哪个节点哪个进程没有正常启动就去哪个节点上面看。然后上网查,都能得到解决。
eclipse那台物理机也要安装集群一样的jdk版本,而且要与集群所在网络能通信,因为要安装图形界面写JAVA客户端,我是在虚拟机中配置桥接网卡做的。
多上网查资料,多思考。