首先献上Hadoop下载地址:
http://apache.fayea.com/hadoop/core/
选择相应版本,点一下,直接进行http下载了。
对原来写的一篇文章,相当不满意,过于粗糙了,于是删除重新再来。言归正传:
题前说明:
我一共三台机器,机器名分别是:
master
slave1
slave2
登录名统一是:master
我先在master机器上执行以下操作:
一、解压缩
这里需要说明下,根据网上的教程,解压缩后,把文件copy到/usr/目录下。在master机器启动的时候,一直提示,对于slave1和slave2机器操作无权限,类似于下面的提示:
slave2: /usr/hadoop/sbin/hadoop-daemon.sh: line 178: /usr/hadoop/logs/hadoop-master-datanode-slave2.out: Permission denied
个人分析,/usr目录的所有者是root,而我安装hadoop的账户是master(ps:这个名字起的有点糟糕,和主机器名重了),这样,尽管里面的hadoop目录的所有者是master,也访问失败。于是我把hadoop目录整个移到了~/work文件夹下(work是自己建的目录)。所以,个人建议,还是把工作目录建在个人目录下,比较不容易出现权限类的问题,当然,仅仅针对我这种linux新手来说的。
tip:
解压缩命令:tar -zxvf hadoop-2.7.0.tar.gz
解压出来的文件是hadoop-2.7.0
copy命令:cp -r hadoop-2.7.0 ~/work/hadoop 这里直接重命名为hadoop
二、创建工作文件夹
一共三个,我建在了~/hadoop/这个文件夹下,便于管理:
附命令:
cd ~/hadoop
mkdir tmp
mkdir -p dfs/name
cd dfs
mkdir data
三、重头戏,配置
从教程里看到一共有以下7个文件,目前还不了解他们的作用,后续补充:
2、vi ~/work/hadoop/etc/hadoop/yarn-env.sh
配置内容同1,略。
3、vi ~/work/hadoop/etc/hadoop/slaves
把作为datanode的机器名加上,我这里是两台机器:
slave1
slave2
4、vi ~/work/hadoop/etc/hadoop/core-site.xml
这里要吐槽一下,gedit命令不能用,这个vi编辑好累。
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value></value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/master/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>hadoop.proxyuser.master.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.master.groups</name>
<value>*</value>
</property>
</configuration>
tip:
1)第三个节点value,是我在上面步骤二创建的目录之一,/home/master/hadoop/tmp
2)第四、五节点,name里,有我登录用户名master,你使用自己的名字替换即可。
5、vi ~/work/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/master/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/master/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value></value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
tip:
1)第二、三个节点里的value值,是在步骤二创建的另外两个工作目录
2)还有个节点value值是3,代表目前我搭建的是由三台机器组成的集群。
6、vi ~/work/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property> <name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:</value>
</property>
</configuration>
没有什么可说的,copy自网络,且不需要修改。
7、vi ~/work/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:</value>
</property>
</configuration>
Ctrl+C+V即可。
至此,主要配置工作已经完成,如果说,其他机器还要重复步骤一到步骤三,相信会直接崩溃,想想吧,大公司那几千台的机器。
幸好,咱们有跨机器拷贝方案:
scp ~/work/hadoop master@slave1:~/work/
scp ~/work/hadoop master@slave2:~/work/
两个命令搞定,是不是很简单?
后续我们在修改各种配置文件的时候,都可以考虑使用这个命令。
四、接下来要逐台机器配置环境变量,也就是PATH
vi /etc/enviroment (这个单词太长,记不住,只要输入到en的时候按Tab,就会自动补全了)
在打开的编辑器中,PATH值结尾处,加上如下内容:
/home/master/work/hadoop/bin:/home/master/work/hadoop/sbin
再提醒一句,是每台机器都执行,貌似还可以用这个方式来做这个工作:
PATH=“$PATH”:/home/master/work/hadoop/bin:/home/master/work/hadoop/sbin
五、收获的季节来了,开始验证:
tip:以下步骤只需要在mater机器执行。
1、格式化文件系统hdfs:这个相信Hadoop实战这本书误导了每一个新手:
原命令是:bin/Hadoop NameNode -format
执行直接报错:
Error: Could not find or load main class NameNode
其实就是大小写没处理好,如下命令正确:
bin/hadoop namenode -format
2、启动:/bin/start-all.sh
如果你真按这个命令来,那就中招了。
吐槽一下,是我买的这本书太老呢还是Hadoop变化太快?
现在,大部分命令都在/sbin里面,崩溃不?
所以,要在这个目录下执行启动命令:
sbin/star-all.sh
执行这个命令,会提醒过时还是什么的,那么也可以按他建议的来执行,无伤大雅:
sbin/start-dfs.sh
3、检查是否成功
看着是都起来了,不过在验证的时候,出现了问题:
http://localhost:50030打不开,目前没找到原因,有人说是不使用这个端口了,但是现在尚未看到官方的东西,不能下结论。
http://localhost:50070可以打开页面
4、看来靠这种方式验证不是很靠谱,于是查到用下列方式:jps命令(建议启动后执行一次这个检查)
如果你执行jps提示没有,那是因为你的jdk替换了系统原有的jdk,路径变了,而这个变化没在PATH里维护,所以,不是想在哪都能执行成功的,两种使用方式:
1)、进到jdk安装目录下执行:jps
2)、配置PATH:PATH=“$PATH”/usr/lib/jvm/jdk1.8.0_60/bin
推荐这个,会麻烦一次,以后各种方便,其中$PATH 后的内容是我的jdk安装路径。
共有6个服务。
再次在master执行jps,得到以下结果:
3937 NameNode
4778 NodeManager
4300 SecondaryNameNode
5119 Jps
在slave1,和slave2分别执行jps,得到以下结果:
5158 DataNode
5243 Jps
至此,折腾了好久好久的安装学习,终于大功告成,必须庆祝下,晚上去小酌一杯!
以下是安装过程验证中遇到的一个问题,仅作参考,不一定每个人都能遇到:
排查解决步骤:
1)http://localhost:50070 可以看到一些状态、日志
a.Overview:是dfs的健康状态。
b.Utilities下的Logs:查看Hadoop启动及运行的日志
2015-09-02 01:17:37,962 WARN org.apache.hadoop.hdfs.server.common.Storage: java.io.IOException: Incompatible clusterIDs in /usr/local/hadoop/data1: namenode clusterID = CID-c7970b3b-e127-4054-ba7b-7736183904d2; datanode clusterID = CID-4b42cd9e-35ec-4194-b516-d4de4055c35b
2015-09-02 01:17:37,977 INFO org.apache.hadoop.hdfs.server.common.Storage: Lock on /usr/local/hadoop/data2/in_use.lock acquired by nodename 6889@ubuntu
2015-09-02 01:17:37,978 WARN org.apache.hadoop.hdfs.server.common.Storage: org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /usr/local/hadoop/data2 is in an inconsistent state: cluster Id is incompatible with others.
2015-09-02 01:17:37,980 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to localhost/127.0.0.1:9000. Exiting.
java.io.IOException: All specified directories are failed to load.
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:477)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:1387)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:1352)
at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:316)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:228)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:852)
at java.lang.Thread.run(Thread.java:745)
提醒连个cid不一致,原因是Hadoop启动后,在使用格式化namenode,会导致datanode和namenode的clusterID不一致
这个ID的位置这么找:
先找到/etc/hadoop/hdfs-site.xml
里面有datanode的路径,在那个路径下找:/current/VERSION文件,即可修改clusterID
我是这样处理的,我把配置文件改为完全按教程的要求,如下,也消除了上面的错误:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
执行jps
显示正常了:
root@ubuntu:/usr/lib/jvm/jdk1.8.0_60/bin# jps
8736 NameNode
9141 ResourceManager
9926 DataNode
8983 SecondaryNameNode
10156 Jps
10125 GetConf
更详细的验证当前的各个服务的状态方法:
http://www.aboutyun.com/thread-7712-1-1.html
tip:
重新格式化重启后,发现namenode启动失败
再次格式化,再次重启,发现所有datanode启动失败
解决办法:
1、删除了步骤二创建的文件夹里产生的内容,具体是dfs/data里的内容
2、删除了日志文件
不清楚原因,初步估计是第1步起了作用,后续继续观察。