linux下安装hadoop伪分布式集群参考博客:https://blog.csdn.net/huiweizuotiandeni/article/details/59632613
上述博客内容其实和官网上讲的差不多,跟着做理论上是不会出现问题的,但是实际中自己操作总会出现一些不应该出现的bug。
而我在配置该环境的时候便出现了很多本不应该出现的问题,在此做一个总结,以防再犯。
我的系统是Ubuntu18.0,和Ubuntu16.0基本一致。
JAVA安装只需要下载安装包,解压之后配置环境变量,执行source 命令使环境变量生效即可。
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
export JAVA_HOME=/home/meng/app/jdk1.8.0
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=$HOME/app/hadoop-2.6.0-cdh5.7.0
export PATH=$HADOOP_HOME/bin:$PATH
而Hadoop安装不仅需要这些工作(解压加配置环境变量),而且还需要修改一部分配置文件,才可以使其正常运行。
而所需要配置的文件基本都在解压缩后的hadoop目录下的/etc/hadoop文件夹
这些文件分别是:hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、slaves、master
hadoop-env.sh是hadoop环境配置的文件,需要添加JAVA_HOME变量
# The java implementation to use.
export JAVA_HOME=/home/meng/app/jdk1.8.0
core-site.xml文件的作用:定义hdfs中namenode的地址,还有tmp文件的地址
<configuration> <!-- 指定HADOOP所使用的文件系统schema(URI),HDFS的老大(NAMENODE)的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://192.168.72.128:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/home/meng/app/tmp</value> </property> <property> <name>io.file.buffer.size</name> <value>131702</value> </property> </configuration>
hdfs-site.xml文件
<configuration> <!-- 指定namenode路径 --> <property> <name>dfs.namenode.name.dir</name> <value>/home/meng/app/hadoop/namenode</value> </property> <!-- 指定datanode路径 --> <property> <name>dfs.datanode.name.dir</name> <value>/home/meng/app/hadoop/datanode</value> </property> <!-- 指定hdfs副本的数量 --> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop:9001</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>
mapred-site.xml文件(若文件夹下没有该文件,可将mapred-site.xml.template重命名为mapred-site.xml)
<configuration> <!-- 指定mapreduce 运行在yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> <final>true</final> </property> </configuration>
yarn-site.xml:这里的localhost只是在本机测试而使用的,实际中最好使用自己的本机IP地址替换。
<configuration> <!-- Site specific YARN configuration properties --> <!-- 设置yarn的主机地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>localhost</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property </configuration>
更改master文件,加入自己的IP地址或者主机名。
更改slaves文件,slaves加入自己的ip地址,这是由于伪分布式master和slaves都是本机。
所有配置文件修改完后,还有一个关键步骤:配置SSH免密钥登录
该配置可参考博客:https://blog.csdn.net/u011414200/article/details/47681675
之后便是启动hadoop
首次启动,需要格式化namenode
hdfs namenode -format
在hadoop安装目录下有一个sbin文件夹
derby.log hdfs-config.sh metastore_db start-all.sh start-yarn.sh stop-secure-dns.sh distribute-exclude.sh httpfs.sh mr-jobhistory-daemon.sh start-balancer.sh stop-all.sh stop-yarn.sh hadoop-daemon.sh kms.sh refresh-namenodes.sh start-dfs.sh stop-balancer.sh yarn-daemon.sh hadoop-daemons.sh Linux slaves.sh start-secure-dns.sh stop-dfs.sh yarn-daemons.sh
执行start-all.sh文件即可。
在完成上述设置后,笔者的datanode始终运行不了,后来几经修改尝试,根据core-site.xml中配置的tmp路径,找到对应的tmp文件夹,将其清空之后,便可运行成功。
而在这些节点报错时,我们需要如何看错误日志呢?当我们执行start-all.sh文件文件时,控制台会打印这些信息,而下划线标注的路径即时log日志保存的路径。
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh 18/12/06 21:27:37 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Starting namenodes on [192.168.72.128] 192.168.72.128: starting namenode, logging to /home/meng/app/hadoop-2.6.0-cdh5.7.0/logs/hadoop-meng-namenode-hadoop.out 192.168.72.128: starting datanode, logging to /home/meng/app/hadoop-2.6.0-cdh5.7.0/logs/hadoop-meng-datanode-hadoop.out Starting secondary namenodes [hadoop] hadoop: starting secondarynamenode, logging to /home/meng/app/hadoop-2.6.0-cdh5.7.0/logs/hadoop-meng-secondarynamenode-hadoop.out 18/12/06 21:27:55 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable starting yarn daemons starting resourcemanager, logging to /home/meng/app/hadoop-2.6.0-cdh5.7.0/logs/yarn-meng-resourcemanager-hadoop.out 192.168.72.128: starting nodemanager, logging to /home/meng/app/hadoop-2.6.0-cdh5.7.0/logs/yarn-meng-nodemanager-hadoop.out
datanode的日志文件报错如下:
192.168.72.128:9000 starting to offer service 2018-12-06 04:49:08,925 INFO org.apache.hadoop.ipc.Server: IPC Server Responder: starting 2018-12-06 04:49:08,925 INFO org.apache.hadoop.ipc.Server: IPC Server listener on 50020: starting 2018-12-06 04:49:09,530 INFO org.apache.hadoop.hdfs.server.common.Storage: Lock on /home/meng/app/tmp/dfs/data/in_use.lock acquired by nodename 21391@localhost 2018-12-06 04:49:09,541 WARN org.apache.hadoop.hdfs.server.common.Storage: java.io.IOException: Incompatible clusterIDs in /home/meng/app/tmp/dfs/data: namenode clusterID = CID-c050c6d2-b27f-4db1-acfc-cfde956261a2; datanode clusterID = CID-0a0802fc-33a1-4cb0-b179-04c30ec901a5 2018-12-06 04:49:09,542 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to /192.168.72.128:9000. Exiting. java.io.IOException: All specified directories are failed to load. at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:478) at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:1394) at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:1355) at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:317) at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:228) at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:829) at java.lang.Thread.run(Thread.java:748) 2018-12-06 04:49:09,543 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Ending block pool service for: Block pool <registering> (Datanode Uuid unassigned) service to /192.168.72.128:9000 2018-12-06 04:49:09,545 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Removed Block pool <registering> (Datanode Uuid unassigned) 2018-12-06 04:49:11,546 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Exiting Datanode 2018-12-06 04:49:11,548 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 0 2018-12-06 04:49:11,566 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down DataNode at localhost/127.0.0.1 ************************************************************/
通过阅读上述日志可了解大意:namenode和datanode的簇ID不相容,而这些簇ID是保存在tmp文件夹下的,想必是由于笔者多次修改配置文件导致的一些问题,并不是一定会出现的,虽然不了解簇ID的生成机制,但是通过情况tmp文件应该会使其重新生成,问题便可被解决。