首先献上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个文件,目前还不了解他们的作用,后续补充:
~/work/hadoop/etc/hadoop/hadoop-env.sh
~/work/hadoop/etc/hadoop/yarn-env.sh
~/work/hadoop/etc/hadoop/slaves
~/work/hadoop/etc/hadoop/core-site.xml
~/work/hadoop/etc/hadoop/hdfs-site.xml
~/work/hadoop/etc/hadoop/mapred-site.xml
~/work/hadoop/etc/hadoop/yarn-site.xml
逐个解决:
1、vi ~/work/hadoop/etc/hadoop/hadoop-env.sh
查找JAVA_HOME,命令是 /export JAVA_HOME和?export JAVA_HOME一个向下查找,一个向上查找。
找到后,把值改为你的jdk的安装目录,我的在系列文章第二篇里讲过。路径是:/usr/lib/jvm/jdk1.8.0_60
需要注意的是,这个配置不用加引号,完整状态是这样:export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_60
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编辑好累。
1 <configuration>
2 <property>
3 <name>fs.defaultFS</name>
4 <value>hdfs://master:8020</value>
5 </property>
6 <property>
7 <name>io.file.buffer.size</name>
8 <value>131072</value>
9 </property>
10 <property>
11 <name>hadoop.tmp.dir</name>
12 <value>file:/home/master/hadoop/tmp</value>
13 <description>Abase for other temporary directories.</description>
14 </property>
15 <property>
16 <name>hadoop.proxyuser.master.hosts</name>
17 <value>*</value>
18 </property>
19 <property>
20 <name>hadoop.proxyuser.master.groups</name>
21 <value>*</value>
22 </property>
23 </configuration>
tip:
1)第三个节点value,是我在上面步骤二创建的目录之一,/home/master/hadoop/tmp
2)第四、五节点,name里,有我登录用户名master,你使用自己的名字替换即可。
5、vi ~/work/hadoop/etc/hadoop/hdfs-site.xml
1 <configuration>
2 <property>
3 <name>dfs.namenode.secondary.http-address</name>
4 <value>master:9001</value>
5 </property>
6 <property>
7 <name>dfs.namenode.name.dir</name>
8 <value>file:/home/master/hadoop/dfs/name</value>
9 </property>
10 <property>
11 <name>dfs.datanode.data.dir</name>
12 <value>file:/home/master/hadoop/dfs/data</value>
13 </property>
14 <property>
15 <name>dfs.replication</name>
16 <value>3</value>
17 </property>
18 <property>
19 <name>dfs.webhdfs.enabled</name>
20 <value>true</value>
21 </property>
22 </configuration>
tip:
1)第二、三个节点里的value值,是在步骤二创建的另外两个工作目录
2)还有个节点value值是3,代表目前我搭建的是由三台机器组成的集群。
6、vi ~/work/hadoop/etc/hadoop/mapred-site.xml
1 <configuration>
2 <property> <name>mapreduce.framework.name</name>
3 <value>yarn</value>
4 </property>
5 <property>
6 <name>mapreduce.jobhistory.address</name>
7 <value>master:10020</value>
8 </property>
9 <property>
10 <name>mapreduce.jobhistory.webapp.address</name>
11 <value>master:19888</value>
12 </property>
13 </configuration>
没有什么可说的,copy自网络,且不需要修改。
7、vi ~/work/hadoop/etc/hadoop/yarn-site.xml
1 <configuration>
2 <property>
3 <name>yarn.nodemanager.aux-services</name>
4 <value>mapreduce_shuffle</value>
5 </property>
6 <property>
7 <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
8 <value>org.apache.hadoop.mapred.ShuffleHandler</value>
9 </property>
10 <property>
11 <name>yarn.resourcemanager.address</name>
12 <value>master:8032</value>
13 </property>
14 <property>
15 <name>yarn.resourcemanager.scheduler.address</name>
16 <value>master:8030</value>
17 </property>
18 <property>
19 <name>yarn.resourcemanager.resource-tracker.address</name>
20 <value>master:8031</value>
21 </property>
22 <property>
23 <name>yarn.resourcemanager.admin.address</name>
24 <value>master:8033</value>
25 </property>
26 <property>
27 <name>yarn.resourcemanager.webapp.address</name>
28 <value>master:8088</value>
29 </property>
30 </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步起了作用,后续继续观察。