自己搭建一个Hadoop集群,小型的。我在台式机上新建了3台虚拟机,一台用于Master,两台用于Slave。系统用的Ubuntu14.04.系统准备好之后。
一、在UBuntu下创建hadoop用户和用户组
1. 首先新建hadoop用户组
[cpp] view plain copy
- sudoaddgrouphadoop
2. 创建hadoop用户
[cpp] view plain copy
- sudoadduser-ingrouphadoophadoop
3. 给hadoop用户添加权限,打开/etc/sudoers文件。
[cpp] view plain copy
- sudovim/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
- sudovim/etc/hostname
由于有3台机器,我们分别把机器名字修改为Master_00,Slave_00,Slave_01.
重启系统后才会生效。
四、安装ssh服务
1. 安装openssh_server
[cpp] view plain copy
- sudoapt-getinstallopenssh-server
五、 建立ssh无密码登录本机
ssh生成密钥有rsa和dsa两种生成方式,默认情况下采用rsa方式。
1、 创建ssh-key,这里我们采用rsa方式,如图
首先把用户切换到hadoop用户下。
[cpp] view plain copy
- ssh-keygen-trsa-P""
回车后,会在当前用户目录下~/.ssh/下生成两个文件:id_rsa和id_rsa.pub这两个文件是成对出现的
2、进入~/.ssh/目录下,将id_rsa.pub追加到authorized_keys授权文件中,开始是没有authorized_keys授权文件的。
[cpp] view plain copy
- catid_rsa.pub>>authorized_keys
(完成后就可以无密码登录本机了)
3、登录localhost试试
[cpp] view plain copy
- sshlocalhost
第一次登录的时候需要输入yes.(注:当ssh远程登录到其他机器后,现在你控制的是远程的机器,需要执行退出命令才能重新控制本机器)
4. 执行退出命令
[cpp] view plain copy
- exit
5. 由于我有3台虚拟机,一个作为master,两台作为slave,master需要免密登录slave,所以需要把master生成的公钥复制到两台slave中,
[cpp] view plain copy
- scpid_rsa.pubhadoop@Slave_01:/home/hadoop/
期间可能需要输入密码,然后在slave机器上,把id_rsa.pub文件追加到authorized_keys授权文件
[cpp] view plain copy
- 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
- sudocp~/hadoop-2.6.4.tar.gz./
2. 解压hadoop-2.6.4.tar.gz
[cpp] view plain copy
- sudotarzxvfhadoop-2.6.4.tar.gz
3. 将解压出来的文件夹改名为hadoop
4. 将该hadoop文件夹的属主用户设为hadoop,如下图
[cpp] view plain copy
- sudochown-Rhadoop:hadoophadoop
5.打开hadoop/etc/hadoop/hadoop-env.sh文件。
[cpp] view plain copy
- vimhadoop-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
- cd/usr/local/hadoop
- mkdir./input
- cp./etc/hadoop/*.xml./input/
- ./bin/hadoopjar./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jargrep./input./output’dfs[a-z.]+’
- cat./output/*
执行结束后,输出了作业的相关信息,输出结果是符合正则的单词dfsadmin出现了一次
注意:hadoop默认不会覆盖结果文件,因此在此运行上面的实例会提示出错,需要先将./output删除。
[cpp] view plain copy
- 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
修改为以下配置:
[cpp] view plain copy
- hadoop.tmp.dir
- file:/usr/local/hadoop/tmp
- Abaseforothertemporarydirectories.
- fs.defaultFS
- hdfs://localhost:9000
配置文件hdfs-site.xml修改为:
[cpp] view plain copy
- dfs.replication
- 1
- dfs.namenode.name.dir
- file:/usr/local/hadoop/tmp/dfs/name
- dfs.datanode.data.dir
- file:/usr/local/hadoop/tmp/dfs/data
配置完成后,执行namenode格式化
[cpp] view plain copy
- ./bin/hdfsnamenode-format
出现Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted和Exiting with status 0 说明成功。
接着开启NameNode和DataNode守护进程。
[cpp] view plain copy
- ./sbin/start-dfs.sh
启动完成后,可以通过命令jps来判断是否成功启动,若成功启动则会列出如下进程:NameNode、DataNode和SecondaryNode。(如果SecondaryNode没有启动,请运行sbin/stop-dfs.sh关闭进程,然后再次尝试,如果NameNode和DataNode没有启动,请仔细检查之前的步骤)
[cpp] view plain copy
- 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
- ./bin/hdfsdfs-mkdir-p/usr/local/hadoop/input
-p表示如果会逐级新建目录.
接着将/etc/hadoop中的文件作为输入文件复制到分布式文件系统中,即将/usr/local/hadoop/etc/hadoop中的xml文件复制到分布式文件系统中的/usr/local/hadoop/input中.上一步已经新建好了文件夹.
[cpp] view plain copy
- ./bin/hdfsdfs-put./etc/hadoop/*.xmlinput
复制完成后,可以通过如下命令查看文件列表:
[cpp] view plain copy
- ./bin/hdfsdfs-lsinput
伪分布式运行MapReduce作业的方式跟单机模式相同,区别在于伪分布式读取的是DHFS中的文件(可以将单机步骤中创建的本地input文件夹删掉来验证这一点).
[cpp] view plain copy
- ./bin/hadoopjar./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jargrepinputoutput’dfs[a-z.]+’
出现如上图结果.然后查看运行结果命令(查看的是位于HDFS中的输出结果)
[cpp] view plain copy
- ./bin/hdfsdfs-catoutput/*
Hadoop运行程序时,默认输出目录不能存在,因此再次运行需要执行如下命令删除output文件夹:
[cpp] view plain copy
- ./bin/hdfsdfs-rm-routput
删除output文件夹.
伪分布式的文件是以HDFS的格式存储在本机上,但是具体存储位置是哪,存储格式是啥.现在还不知道,这部分以后有待补充,to be continued…
完全分布式搭建
以上Hadoop搭建是单机模式和伪分布式模式,下面介绍完全分布式搭建.前面我们的虚拟机有3个,分别是Master和两个slave.
主要涉及的配置文件有7个:都在/usr/local/hadoop/etc/hadoop文件夹下
[cpp] view plain copy
- hadoop-env.sh
- yarn-env.sh
- slaves
- core-site.xml
- hdfs-site.xml
- mapred-site.xml.template
- yarn-site.xml
1. 配置core-site.xml
[cpp] view plain copy
- hadoop.tmp.dir
- file:/usr/local/hadoop/tmp
- Abaseforothertemporarydirectories.
- fs.defaultFS
- hdfs://Master00:9000
fs.defaultFS是NameNode的URI.hdfs://主机名:端口/
hadoop.tmp.dir:Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录即可.不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令.
2. 配置mapred-site.xml
[cpp] view plain copy
- mapreduce.framework.name
- yarn
- mapreduce.jobhistory.address
- Master00:10020
- mapreduce.jobhistory.webapp.address
- Master00:19888
mapred.job.tracker是JobTracker的主机(或者IP)和端口.主机:端口.其中/usr/local/hadoop/tmp目录需要提前创建,并且注意用chown -R 命令来修改目录权限
3. 配置hdfs-site.xml
[cpp] view plain copy
-
dfs.namenode.secondary.http-address
-
Master00:50090
-
dfs.replication
-
2
-
dfs.namenode.name.dir
-
file:/usr/local/hadoop/dfs/name
-
dfs.datanode.data.dir
-
file:/usr/local/hadoop/dfs/data
dfs.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径.当这个值是一个逗号分割的目录列表时,nametable数据将会复制到所有目录中作冗余备份.
dfs.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错.
此处的name和data等目录不能提前创建,如果提前创建会出问题.
4. 配置master和slaves主从节点
[cpp] view plain copy
- vimmasters
修改为
Master00
[cpp] view plain copy
- vimslaves
修改为
Slave00
Slave01
5. 配置yarn-site.xml
[cpp] view plain copy
-
yarn.resourcemanager.hostname
-
Master00
-
yarn.nodemanager.aux-services
-
mapreduce_shuffle
然后在每台机器上执行格式化
[cpp] view plain copy
- hdfsnamenode-format
然后
[cpp] view plain copy
- ./sbin/start-all.sh
启动服务.
通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 进程
在 Slave 节点可以看到 DataNode 和 NodeManager 进程
缺少任一进程都表示出错。另外还需要在 Master 节点上通过命令
[cpp] view plain copy
- hdfsdfsadmin-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
- hdfsdfs-mkdir-p/user/hadoop
将 /usr/local/hadoop/etc/hadoop 中的配置文件作为输入文件复制到分布式文件系统中:
[cpp] view plain copy
- hdfsdfs-mkdirinput
- hdfsdfs-put/usr/local/hadoop/etc/hadoop/*.xmlinput
通过查看 DataNode 的状态(占用大小有改变),输入文件确实复制到了 DataNode 中,如下图所示:
接着就可以运行 MapReduce 作业了:
[cpp] view plain copy
- hadoopjar/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jargrepinputoutput’dfs[a-z.]+’
运行时的输出信息与伪分布式类似,会显示 Job 的进度。
可能会有点慢,但如果迟迟没有进度,比如 5 分钟都没看到进度,那不妨重启 Hadoop 再试试。若重启还不行,则很有可能是内存不足引起,建议增大虚拟机的内存,或者通过更改 YARN 的内存配置解决。
同样可以通过 Web 界面查看任务进度 http://Master00:8088/cluster,在 Web 界面点击 “Tracking UI” 这一列的 History 连接,可以看到任务的运行信息,如下图所示:
执行完毕后的输出结果:
关闭 Hadoop 集群也是在 Master 节点上执行的:
[cpp] view plain copy
- stop-all.sh
此外,同伪分布式一样,也可以不启动 YARN,但要记得改掉 mapred-site.xml 的文件名。
./mr-jobhistory-daemon.sh stop historyserver
停止JobHistoryServer服务
./mr-jobhistory-daemon.sh start historyserver
附带一个拷贝文件的脚本:
[cpp] view plain copy
-
scp-r/usr/local/hadoop/etc/hadoop/core-site.xmlSlave00:/usr/local/hadoop/etc/hadoop/core-site.xml
-
scp-r/usr/local/hadoop/etc/hadoop/slavesSlave00:/usr/local/hadoop/etc/hadoop/slaves
-
scp-r/usr/local/hadoop/etc/hadoop/hdfs-site.xmlSlave00:/usr/local/hadoop/etc/hadoop/hdfs-site.xml
-
scp-r/usr/local/hadoop/etc/hadoop/mapred-site.xmlSlave00:/usr/local/hadoop/etc/hadoop/mapred-site.xml
-
scp-r/usr/local/hadoop/etc/hadoop/yarn-site.xmlSlave00:/usr/local/hadoop/etc/hadoop/yarn-site.xml
-
scp-r/usr/local/hadoop/etc/hadoop/mastersSlave00:/usr/local/hadoop/etc/hadoop/masters
-
scp-r/usr/local/hadoop/etc/hadoop/core-site.xmlSlave01:/usr/local/hadoop/etc/hadoop/core-site.xml
-
scp-r/usr/local/hadoop/etc/hadoop/slavesSlave01:/usr/local/hadoop/etc/hadoop/slaves
-
scp-r/usr/local/hadoop/etc/hadoop/hdfs-site.xmlSlave01:/usr/local/hadoop/etc/hadoop/hdfs-site.xml
-
scp-r/usr/local/hadoop/etc/hadoop/mapred-site.xmlSlave01:/usr/local/hadoop/etc/hadoop/mapred-site.xml
-
scp-r/usr/local/hadoop/etc/hadoop/yarn-site.xmlSlave01:/usr/local/hadoop/etc/hadoop/yarn-site.xml
-
scp-r/usr/local/hadoop/etc/hadoop/mastersSlave01:/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.youkuaiyun.com/lichangzai/article/details/8206834