Hadoop2.6.4搭建笔记

来源:互联网 发布:python 不显示warning 编辑:程序博客网 时间:2024/06/05 00:24

自己搭建一个Hadoop集群,小型的。我在台式机上新建了3台虚拟机,一台用于Master,两台用于Slave。系统用的Ubuntu14.04.系统准备好之后。

一、在UBuntu下创建hadoop用户和用户组

1. 首先新建hadoop用户组

[cpp] view plain copy
  1. sudo addgroup hadoop  


2. 创建hadoop用户

[cpp] view plain copy
  1. sudo adduser -ingroup hadoop hadoop  


3. 给hadoop用户添加权限,打开/etc/sudoers文件。

[cpp] view plain copy
  1. sudo vim /etc/sudoers  
按下回车,打开/etc/sudoers文件,给hadoop用户赋予与root用户同样的权限。在root    ALL=(ALL:ALL) ALL下添加hadoop  ALL=(ALL:ALL) ALL。


二、安装JDK

这里不写了

三、 修改机器名字

每当ubuntu安装成功时,我们的及其名字都是默认:ubuntu,但是为了以后集群中能够容易分辨各台服务器,需要给每台机器取一个不同的名字。机器名字由/etc/hostname文件决定。

1. 打开/etc/hostname

[cpp] view plain copy
  1. sudo vim /etc/hostname  

由于有3台机器,我们分别把机器名字修改为Master_00,Slave_00,Slave_01.

重启系统后才会生效。

四、安装ssh服务

1. 安装openssh_server

[cpp] view plain copy
  1. sudo apt-get install openssh-server  

五、 建立ssh无密码登录本机

ssh生成密钥有rsa和dsa两种生成方式,默认情况下采用rsa方式。

1、 创建ssh-key,这里我们采用rsa方式,如图

首先把用户切换到hadoop用户下。

[cpp] view plain copy
  1. ssh-keygen -t rsa -P ""  

回车后,会在当前用户目录下~/.ssh/下生成两个文件:id_rsa和id_rsa.pub这两个文件是成对出现的

2、进入~/.ssh/目录下,将id_rsa.pub追加到authorized_keys授权文件中,开始是没有authorized_keys授权文件的。

[cpp] view plain copy
  1. cat id_rsa.pub >> authorized_keys  


(完成后就可以无密码登录本机了)

3、登录localhost试试

[cpp] view plain copy
  1. ssh localhost  

第一次登录的时候需要输入yes.(注:当ssh远程登录到其他机器后,现在你控制的是远程的机器,需要执行退出命令才能重新控制本机器)

4. 执行退出命令

[cpp] view plain copy
  1. exit  


5. 由于我有3台虚拟机,一个作为master,两台作为slave,master需要免密登录slave,所以需要把master生成的公钥复制到两台slave中,

[cpp] view plain copy
  1. scp id_rsa.pub hadoop@Slave_01:/home/hadoop/  

期间可能需要输入密码,然后在slave机器上,把id_rsa.pub文件追加到authorized_keys授权文件
[cpp] view plain copy
  1. cat ../id_rsa.pub >> ./authorized_keys  

这样,master就可以免密登录slave了,你可以尝试以下。

小结: 登录的机子需要有私钥,被登录的机子需要登录机子的公钥.


六、 安装hadoop

我们采用的hadoop版本是:hadoop2.7.2 .

网址是:http://www-us.apache.org/dist/hadoop/common/

1. 假设hadoop在桌面,将它复制到目录下/usr/local下。

[cpp] view plain copy
  1. sudo cp ~/hadoop-2.6.4.tar.gz ./  
2. 解压hadoop-2.6.4.tar.gz
[cpp] view plain copy
  1. sudo tar zxvf hadoop-2.6.4.tar.gz  
3. 将解压出来的文件夹改名为hadoop


4. 将该hadoop文件夹的属主用户设为hadoop,如下图

[cpp] view plain copy
  1. sudo chown -R hadoop:hadoop hadoop  

5.打开hadoop/etc/hadoop/hadoop-env.sh文件。
[cpp] view plain copy
  1. vim hadoop-env.sh  
6. 配置hadoop-env.sh(找打#export JAVA_HOME=……,去掉#。然后加上本机jdk路劲)


Hadoop单机模式

hadoop默认模式为非分布式,无须进行其他配置即可运行。非分布式的hadoop既单java进程,方便进行调试。现在已经配置完成了,现在我们可以执行例子来感受一下hadoop的运行。hadoop附带了很多例子(运行./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar可以看到所有例子)。包括wordcount、terasort、join、grep等。


在此,我们选择运行grep例子,我们将input文件夹中的所有文件作为输入,筛选当中符合正则表达式dfs[a-z.]+的单词并统计出现的次数,最后输出结果到out文件夹中。

[cpp] view plain copy
  1. cd /usr/local/hadoop  
  2. mkdir ./input  
  3. cp ./etc/hadoop/*.xml ./input/  
  4. ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep ./input ./output 'dfs[a-z.]+'  
  5. cat ./output/*  
执行结束后,输出了作业的相关信息,输出结果是符合正则的单词dfsadmin出现了一次


注意:hadoop默认不会覆盖结果文件,因此在此运行上面的实例会提示出错,需要先将./output删除。

[cpp] view plain copy
  1. rm -rf ./output  

Hadoop伪分布式配置

Hadoop可以在单节点上以伪分布式的方式运行,Hadoop进程以分离的Java进程来运行。节点既作为Nameode也作为Datanode,同时,读取的是HDFS中的文件。

Hadoop的配置文件位于/usr/local/hadoop/etc/hadoop/中,伪分布式需要修改2和配置文件core-site.xml和hdfs-site.xml。Hadoop的配置文件是xml格式,每个配置以声明property的name和value的方式来实现。

修改配置文件core-site.xml。将当中的

[cpp] view plain copy
  1. <configuration>  
  2. </configuration>  

修改为以下配置:
[cpp] view plain copy
  1. <configuration>  
  2.         <property>  
  3.                 <name>hadoop.tmp.dir</name>  
  4.                 <value>file:/usr/local/hadoop/tmp</value>  
  5.                 <description>Abase for other temporary directories.</description>  
  6.         </property>  
  7.         <property>  
  8.                 <name>fs.defaultFS</name>  
  9.                 <value>hdfs://localhost:9000</value>  
  10.         </property>  
  11. </configuration>  
配置文件hdfs-site.xml修改为:
[cpp] view plain copy
  1. <configuration>  
  2.         <property>  
  3.                 <name>dfs.replication</name>  
  4.                 <value>1</value>  
  5.         </property>  
  6.         <property>  
  7.                 <name>dfs.namenode.name.dir</name>  
  8.                 <value>file:/usr/local/hadoop/tmp/dfs/</span>name</value>  
  9.         </property>  
  10.         <property>  
  11.                 <name>dfs.datanode.data.dir</name>  
  12.                 <value>file:/usr/local/hadoop/tmp/dfs/data</value>  
  13.         </property>  
  14. </configuration>  


配置完成后,执行namenode格式化
[cpp] view plain copy
  1. ./bin/hdfs namenode -format  

出现Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted和Exiting with status 0 说明成功。

接着开启NameNode和DataNode守护进程。

[cpp] view plain copy
  1. ./sbin/start-dfs.sh  

启动完成后,可以通过命令jps来判断是否成功启动,若成功启动则会列出如下进程:NameNode、DataNode和SecondaryNode。(如果SecondaryNode没有启动,请运行sbin/stop-dfs.sh关闭进程,然后再次尝试,如果NameNode和DataNode没有启动,请仔细检查之前的步骤)
[cpp] view plain copy
  1. hadoop@Master_00:/usr/local/hadoop$ jps  

成功启动后,可以访问Web界面http://localhost:50070来查看Hadoop的信息。由于我的Hadoop部署在一台虚拟机上,所以我的访问地址是http://92.168.76.130:50070

Hadoop伪分布式实例-WordCount

上面的单机模式,WordCount读取的是本地数据,伪分布式读取的是HDFS上的数据.要使用HDFS,首先需要创建用户目录

[cpp] view plain copy
  1. ./bin/hdfs dfs -mkdir -p /usr/local/hadoop/input  
-p表示如果会逐级新建目录.

接着将/etc/hadoop中的文件作为输入文件复制到分布式文件系统中,即将/usr/local/hadoop/etc/hadoop中的xml文件复制到分布式文件系统中的/usr/local/hadoop/input中.上一步已经新建好了文件夹.

[cpp] view plain copy
  1. ./bin/hdfs dfs -put ./etc/hadoop/*.xml input  
复制完成后,可以通过如下命令查看文件列表:
[cpp] view plain copy
  1. ./bin/hdfs dfs -ls input  

伪分布式运行MapReduce作业的方式跟单机模式相同,区别在于伪分布式读取的是DHFS中的文件(可以将单机步骤中创建的本地input文件夹删掉来验证这一点).
[cpp] view plain copy
  1. ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep input output 'dfs[a-z.]+'  

出现如上图结果.然后查看运行结果命令(查看的是位于HDFS中的输出结果)
[cpp] view plain copy
  1. ./bin/hdfs dfs -cat output/*  

Hadoop运行程序时,默认输出目录不能存在,因此再次运行需要执行如下命令删除output文件夹:
[cpp] view plain copy
  1. ./bin/hdfs dfs -rm -r output  

删除output文件夹.

伪分布式的文件是以HDFS的格式存储在本机上,但是具体存储位置是哪,存储格式是啥.现在还不知道,这部分以后有待补充,to be continued......


完全分布式搭建

以上Hadoop搭建是单机模式和伪分布式模式,下面介绍完全分布式搭建.前面我们的虚拟机有3个,分别是Master和两个slave.

主要涉及的配置文件有7个:都在/usr/local/hadoop/etc/hadoop文件夹下

[cpp] view plain copy
  1. hadoop-env.sh  
  2. yarn-env.sh  
  3. slaves  
  4. core-site.xml  
  5. hdfs-site.xml  
  6. mapred-site.xml.template  
  7. yarn-site.xml  


1. 配置core-site.xml

[cpp] view plain copy
  1. <configuration>  
  2.         <property>  
  3.                 <name>hadoop.tmp.dir</name>  
  4.                 <value>file:/usr/local/hadoop/tmp</value>  
  5.                 <description>Abase for other temporary directories.</description>  
  6.         </property>  
  7.         <property>  
  8.                 <name>fs.defaultFS</name>  
  9.                 <value>hdfs://Master00:9000</value>  
  10.         </property>  
  11. </configuration>  



fs.defaultFS是NameNode的URI.hdfs://主机名:端口/

hadoop.tmp.dir:Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录即可.不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令.

2. 配置mapred-site.xml

[cpp] view plain copy
  1. <configuration>  
  2.         <property>  
  3.                 <name>mapreduce.framework.name</name>  
  4.                 <value>yarn</value>  
  5.         </property>  
  6.         <property>  
  7.                 <name>mapreduce.jobhistory.address</name>  
  8.                 <value>Master00:10020</value>  
  9.         </property>  
  10.         <property>  
  11.                <name>mapreduce.jobhistory.webapp.address</name>  
  12.                <value>Master00:19888</value>  
  13.        </property>  
  14. </configuration>  


mapred.job.tracker是JobTracker的主机(或者IP)和端口.主机:端口.其中/usr/local/hadoop/tmp目录需要提前创建,并且注意用chown -R 命令来修改目录权限
3. 配置hdfs-site.xml
[cpp] view plain copy
  1. <configuration>  
  2.         <property>  
  3.                 <name>dfs.namenode.secondary.http-address</name>  
  4.                 <value>Master00:50090</value>  
  5.         </property>  
  6.         <property>  
  7.                 <name>dfs.replication</name>  
  8.                 <value>2</value>  
  9.         </property>  
  10.         <property>  
  11.                 <name>dfs.namenode.name.dir</name>  
  12.                 <value>file:/usr/local/hadoop/dfs/name</value>  
  13.         </property>  
  14.         <property>  
  15.                 <name>dfs.datanode.data.dir</name>  
  16.                 <value>file:/usr/local/hadoop/dfs/data</value>  
  17.         </property>  
  18.   
  19.   
  20.   
  21. </configuration>  




dfs.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径.当这个值是一个逗号分割的目录列表时,nametable数据将会复制到所有目录中作冗余备份.

dfs.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错.

此处的name和data等目录不能提前创建,如果提前创建会出问题.

4. 配置master和slaves主从节点

[cpp] view plain copy
  1. vim masters  
修改为

Master00

[cpp] view plain copy
  1. vim slaves  

修改为

Slave00
Slave01

5. 配置 yarn-site.xml

[cpp] view plain copy
  1. <configuration>  
  2.   
  3. <!-- Site specific YARN configuration properties -->  
  4.         <property>  
  5.                 <name>yarn.resourcemanager.hostname</name>  
  6.                 <value>Master00</value>  
  7.         </property>  
  8.         <property>  
  9.                 <name>yarn.nodemanager.aux-services</name>  
  10.                 <value>mapreduce_shuffle</value>  
  11.         </property>  
  12.   
  13. </configuration>  

然后在每台机器上执行格式化
[cpp] view plain copy
  1. hdfs namenode -format  
然后
[cpp] view plain copy
  1. ./sbin/start-all.sh   

启动服务.

通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 进程


在 Slave 节点可以看到 DataNode 和 NodeManager 进程



缺少任一进程都表示出错。另外还需要在 Master 节点上通过命令 

[cpp] view plain copy
  1. hdfs dfsadmin -report   

查看 DataNode 是否正常启动,如果 Live datanodes 不为 0 ,则说明集群启动成功


也可以通过 Web 页面看到查看 DataNode 和 NameNode 的状态:http://Master00:50070/。如果不成功,可以通过启动日志排查原因。


伪分布式、分布式配置切换时的注意事项

1. 从分布式切换到伪分布式时,不要忘记修改 slaves 配置文件;
2. 在两者之间切换时,若遇到无法正常启动的情况,可以删除所涉及节点的临时文件夹,这样虽然之前的数据会被删掉,但能保证集群正确启动。所以如果集群以前能启动,但后来启动不了,特别是 DataNode 无法启动,不妨试着删除所有节点(包括 Slave 节点)上的 /usr/local/hadoop/tmp 文件夹,再重新执行一次 hdfs namenode -format,再次启动试试。


执行分布式实例

执行分布式实例过程与伪分布式模式一样,首先创建 HDFS 上的用户目录:

[cpp] view plain copy
  1. hdfs dfs -mkdir -p /user/hadoop  
将 /usr/local/hadoop/etc/hadoop 中的配置文件作为输入文件复制到分布式文件系统中:
[cpp] view plain copy
  1. hdfs dfs -mkdir input  
  2. hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input  

通过查看 DataNode 的状态(占用大小有改变),输入文件确实复制到了 DataNode 中,如下图所示:


接着就可以运行 MapReduce 作业了:

[cpp] view plain copy
  1. hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'  

运行时的输出信息与伪分布式类似,会显示 Job 的进度。


可能会有点慢,但如果迟迟没有进度,比如 5 分钟都没看到进度,那不妨重启 Hadoop 再试试。若重启还不行,则很有可能是内存不足引起,建议增大虚拟机的内存,或者通过更改 YARN 的内存配置解决。



同样可以通过 Web 界面查看任务进度 http://Master00:8088/cluster,在 Web 界面点击 “Tracking UI” 这一列的 History 连接,可以看到任务的运行信息,如下图所示:



执行完毕后的输出结果:


关闭 Hadoop 集群也是在 Master 节点上执行的:

[cpp] view plain copy
  1. stop-all.sh  

此外,同伪分布式一样,也可以不启动 YARN,但要记得改掉 mapred-site.xml 的文件名。




./mr-jobhistory-daemon.sh stop historyserver

停止JobHistoryServer服务

./mr-jobhistory-daemon.sh start historyserver

附带一个拷贝文件的脚本:

[cpp] view plain copy
  1. scp -r /usr/local/hadoop/etc/hadoop/core-site.xml Slave00:/usr/local/hadoop/etc/hadoop/core-site.xml  
  2. scp -r /usr/local/hadoop/etc/hadoop/slaves Slave00:/usr/local/hadoop/etc/hadoop/slaves  
  3.   
  4. scp -r /usr/local/hadoop/etc/hadoop/hdfs-site.xml Slave00:/usr/local/hadoop/etc/hadoop/hdfs-site.xml  
  5.   
  6. scp -r /usr/local/hadoop/etc/hadoop/mapred-site.xml Slave00:/usr/local/hadoop/etc/hadoop/mapred-site.xml  
  7.   
  8. scp -r /usr/local/hadoop/etc/hadoop/yarn-site.xml Slave00:/usr/local/hadoop/etc/hadoop/yarn-site.xml  
  9.   
  10. scp -r /usr/local/hadoop/etc/hadoop/masters Slave00:/usr/local/hadoop/etc/hadoop/masters  
  11.   
  12.   
  13. scp -r /usr/local/hadoop/etc/hadoop/core-site.xml Slave01:/usr/local/hadoop/etc/hadoop/core-site.xml  
  14. scp -r /usr/local/hadoop/etc/hadoop/slaves Slave01:/usr/local/hadoop/etc/hadoop/slaves  
  15.   
  16. scp -r /usr/local/hadoop/etc/hadoop/hdfs-site.xml Slave01:/usr/local/hadoop/etc/hadoop/hdfs-site.xml  
  17.   
  18. scp -r /usr/local/hadoop/etc/hadoop/mapred-site.xml Slave01:/usr/local/hadoop/etc/hadoop/mapred-site.xml  
  19.   
  20. scp -r /usr/local/hadoop/etc/hadoop/yarn-site.xml Slave01:/usr/local/hadoop/etc/hadoop/yarn-site.xml  
  21.   
  22. scp -r /usr/local/hadoop/etc/hadoop/masters Slave01:/usr/local/hadoop/etc/hadoop/masters  





参考:

http://www.powerxing.com/install-hadoop-cluster/

http://www.cnblogs.com/syveen/archive/2013/05/08/3068044.html

http://blog.csdn.net/lichangzai/article/details/8206834