Hadoop学习4--安装Hadoop

首先献上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编辑好累。

 <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

Hadoop学习4--安装Hadoop

再提醒一句,是每台机器都执行,貌似还可以用这个方式来做这个工作:

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步起了作用,后续继续观察。

上一篇:mysql之select(一)


下一篇:哈尔滨理工大学第七届程序设计竞赛初赛(BFS多队列顺序)