自己搭建一个Hadoop集群,小型的。我在台式机上新建了3台虚拟机,一台用于Master,两台用于Slave。系统用的Ubuntu14.04.系统准备好之后。
一、在UBuntu下创建hadoop用户和用户组
1. 首先新建hadoop用户组
sudo addgroup hadoop
2. 创建hadoop用户
sudo adduser -ingroup hadoop hadoop
3. 给hadoop用户添加权限,打开/etc/sudoers文件。
sudo vim /etc/sudoers
按下回车,打开/etc/sudoers文件,给hadoop用户赋予与root用户同样的权限。在root ALL=(ALL:ALL) ALL下添加hadoop ALL=(ALL:ALL) ALL。
这里不写了
三、 修改机器名字
每当ubuntu安装成功时,我们的及其名字都是默认:ubuntu,但是为了以后集群中能够容易分辨各台服务器,需要给每台机器取一个不同的名字。机器名字由/etc/hostname文件决定。
1. 打开/etc/hostname
sudo vim /etc/hostname
重启系统后才会生效。
四、安装ssh服务
1. 安装openssh_server
sudo apt-get install openssh-server
ssh生成密钥有rsa和dsa两种生成方式,默认情况下采用rsa方式。
1、 创建ssh-key,这里我们采用rsa方式,如图
首先把用户切换到hadoop用户下。
ssh-keygen -t rsa -P ""
2、进入~/.ssh/目录下,将id_rsa.pub追加到authorized_keys授权文件中,开始是没有authorized_keys授权文件的。
cat id_rsa.pub >> authorized_keys
(完成后就可以无密码登录本机了)
3、登录localhost试试
ssh localhost
4. 执行退出命令
exit
5. 由于我有3台虚拟机,一个作为master,两台作为slave,master需要免密登录slave,所以需要把master生成的公钥复制到两台slave中,
scp id_rsa.pub hadoop@Slave_01:/home/hadoop/
cat ../id_rsa.pub >> ./authorized_keys
小结: 登录的机子需要有私钥,被登录的机子需要登录机子的公钥.
六、 安装hadoop
我们采用的hadoop版本是:hadoop2.7.2 .
网址是:http://www-us.apache.org/dist/hadoop/common/
1. 假设hadoop在桌面,将它复制到目录下/usr/local下。
sudo cp ~/hadoop-2.6.4.tar.gz ./
2. 解压hadoop-2.6.4.tar.gz
sudo tar zxvf hadoop-2.6.4.tar.gz
3. 将解压出来的文件夹改名为hadoop
4. 将该hadoop文件夹的属主用户设为hadoop,如下图
sudo chown -R hadoop:hadoop hadoop
vim hadoop-env.sh
6. 配置hadoop-env.sh(找打#export JAVA_HOME=……,去掉#。然后加上本机jdk路劲)
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文件夹中。
cd /usr/local/hadoop
mkdir ./input
cp ./etc/hadoop/*.xml ./input/
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep ./input ./output 'dfs[a-z.]+'
cat ./output/*
执行结束后,输出了作业的相关信息,输出结果是符合正则的单词dfsadmin出现了一次
注意:hadoop默认不会覆盖结果文件,因此在此运行上面的实例会提示出错,需要先将./output删除。
rm -rf ./output
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。将当中的
hadoop.tmp.dir
file:/usr/local/hadoop/tmp
Abase for other temporary directories.
fs.defaultFS
hdfs://localhost:9000
配置文件hdfs-site.xml修改为:
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
./bin/hdfs namenode -format
接着开启NameNode和DataNode守护进程。
./sbin/start-dfs.sh
hadoop@Master_00:/usr/local/hadoop$ jps
Hadoop伪分布式实例-WordCount
上面的单机模式,WordCount读取的是本地数据,伪分布式读取的是HDFS上的数据.要使用HDFS,首先需要创建用户目录
./bin/hdfs dfs -mkdir -p /usr/local/hadoop/input
-p表示如果会逐级新建目录.
接着将/etc/hadoop中的文件作为输入文件复制到分布式文件系统中,即将/usr/local/hadoop/etc/hadoop中的xml文件复制到分布式文件系统中的/usr/local/hadoop/input中.上一步已经新建好了文件夹.
./bin/hdfs dfs -put ./etc/hadoop/*.xml input
复制完成后,可以通过如下命令查看文件列表:
./bin/hdfs dfs -ls input
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep input output 'dfs[a-z.]+'
./bin/hdfs dfs -cat output/*
./bin/hdfs dfs -rm -r output
伪分布式的文件是以HDFS的格式存储在本机上,但是具体存储位置是哪,存储格式是啥.现在还不知道,这部分以后有待补充,to be continued......
完全分布式搭建
以上Hadoop搭建是单机模式和伪分布式模式,下面介绍完全分布式搭建.前面我们的虚拟机有3个,分别是Master和两个slave.
主要涉及的配置文件有7个:都在/usr/local/hadoop/etc/hadoop文件夹下
hadoop-env.sh
yarn-env.sh
slaves
core-site.xml
hdfs-site.xml
mapred-site.xml.template
yarn-site.xml
1. 配置core-site.xml
hadoop.tmp.dir
file:/usr/local/hadoop/tmp
Abase for other temporary directories.
fs.defaultFS
hdfs://Master00:9000
hadoop.tmp.dir:Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录即可.不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令.
2. 配置mapred-site.xml
mapreduce.framework.name
yarn
mapreduce.jobhistory.address
Master00:10020
mapreduce.jobhistory.webapp.address
Master00:19888
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.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错.
此处的name和data等目录不能提前创建,如果提前创建会出问题.
4. 配置master和slaves主从节点
vim masters
修改为
Master00
vim slaves
修改为
Slave00
Slave01
5. 配置 yarn-site.xml
yarn.resourcemanager.hostname
Master00
yarn.nodemanager.aux-services
mapreduce_shuffle
hdfs namenode -format
然后
./sbin/start-all.sh
通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 进程
在 Slave 节点可以看到 DataNode 和 NodeManager 进程
缺少任一进程都表示出错。另外还需要在 Master 节点上通过命令
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 上的用户目录:
hdfs dfs -mkdir -p /user/hadoop
将 /usr/local/hadoop/etc/hadoop 中的配置文件作为输入文件复制到分布式文件系统中:
hdfs dfs -mkdir input
hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
接着就可以运行 MapReduce 作业了:
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
同样可以通过 Web 界面查看任务进度 http://Master00:8088/cluster,在 Web 界面点击 “Tracking UI” 这一列的 History 连接,可以看到任务的运行信息,如下图所示:
执行完毕后的输出结果:
关闭 Hadoop 集群也是在 Master 节点上执行的:
stop-all.sh
./mr-jobhistory-daemon.sh stop historyserver
停止JobHistoryServer服务
./mr-jobhistory-daemon.sh start historyserver附带一个拷贝文件的脚本:
scp -r /usr/local/hadoop/etc/hadoop/core-site.xml Slave00:/usr/local/hadoop/etc/hadoop/core-site.xml
scp -r /usr/local/hadoop/etc/hadoop/slaves Slave00:/usr/local/hadoop/etc/hadoop/slaves
scp -r /usr/local/hadoop/etc/hadoop/hdfs-site.xml Slave00:/usr/local/hadoop/etc/hadoop/hdfs-site.xml
scp -r /usr/local/hadoop/etc/hadoop/mapred-site.xml Slave00:/usr/local/hadoop/etc/hadoop/mapred-site.xml
scp -r /usr/local/hadoop/etc/hadoop/yarn-site.xml Slave00:/usr/local/hadoop/etc/hadoop/yarn-site.xml
scp -r /usr/local/hadoop/etc/hadoop/masters Slave00:/usr/local/hadoop/etc/hadoop/masters
scp -r /usr/local/hadoop/etc/hadoop/core-site.xml Slave01:/usr/local/hadoop/etc/hadoop/core-site.xml
scp -r /usr/local/hadoop/etc/hadoop/slaves Slave01:/usr/local/hadoop/etc/hadoop/slaves
scp -r /usr/local/hadoop/etc/hadoop/hdfs-site.xml Slave01:/usr/local/hadoop/etc/hadoop/hdfs-site.xml
scp -r /usr/local/hadoop/etc/hadoop/mapred-site.xml Slave01:/usr/local/hadoop/etc/hadoop/mapred-site.xml
scp -r /usr/local/hadoop/etc/hadoop/yarn-site.xml Slave01:/usr/local/hadoop/etc/hadoop/yarn-site.xml
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