Hadoop是一个由Apache开发的分布式系统基础架构,主要解决,海量数据的存储和分析计算。Hadoop通常是说Hadoop生态圈。
Google是Hadoop的思想之源,Hadoop的很多东西都是从Google泛生出来的,如:
Hadoop 三大发行版本:Apache,Cloudera,Hortonworks。
可以看出Hadoop2.0版本比1.0多出了一个Yarn组件来分担了MapReduce的资源调度工作。
NameNode:存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表和块所在的DateNode等。
SecondaryNameNode:用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。
DateNode:在本地文件系统存储文件块数据,以及块数据的校验和。
client:客户端,发送作业请求。(这个可以说是不算)
Resource Manager:处理客户端请求,监控NodeManager,启动或监控ApplicationMaster,资源的分配与调度。
NodeManager:管理单个节点上的资源,处理ResourceManager的命令,处理ApplicationMaster的命令。
ApplicationMaster:负责数据的切分,为应用程序申请资源并分配给内部的任务,任务的监控和容错。
Container:YARN中的资源抽象,封装某个节点上的资源,如内存,cpu,磁盘,网络等等。(虚拟化容器)
相关网络图片如下:
MapReduce分成:map和reduce。
本地上传JDK压缩包到虚拟机上,并解压。然后配置环境变量。
本地上传hadoop-2.7.3压缩包到虚拟机上,并解压。然后配置环境变量。
bin ---存放操作命令,hdfs/hadoop 在这里
etc/hadoop ---所有配置文件
include ---.h或.hh的头文件
lib ---本地库(native 库,一些.so)
libexec ---各个服务对应的shell配置文件所在的目录。配置日志输出目录、启动参数等基本信息。
sbin ---Hadoop管理脚本所在目录,主要包含HDFS和YARN中各类服务启动/关闭的脚本。
share ---Hadoop各个模块编译后的Jar包所在目录,这个目录中也包含了Hadoop文档。
share/doc ---文档
share/hadoop ---所有依赖的jar架包
Hadoop安装模式分三种:单机模式,伪分布式模式,完全分布式模式。
Hadoop 单机模式没有 HDFS,只能测试 MapReduce 程序。MapReduce 处理的是本地 Linux 的文件数据。因为HDFS是分布式文件系统,单机模式自然没有。
以下内容来自官方文档:https://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/SingleCluster.html,为了方便阅读,本人做了核心内容的提取和翻译。
这段话说:支持GNU/Linux和Windows系统。
- GNU/Linux is supported as a development and production platform. Hadoop has been demonstrated on GNU/Linux clusters with 2000 nodes.
- Windows is also a supported platform but the followings steps are for Linux only. To set up Hadoop on Windows, see wiki page
JDK必须安装,如果你需要使用管理远程Hadoop守护进程的Hadoop脚本,就需要安装ssh.
Required software for Linux include:
- Java™ must be installed. Recommended Java versions are described at HadoopJavaVersions.
- ssh must be installed and sshd must be running to use the Hadoop scripts that manage remote Hadoop daemons.
例子适合Ubuntu Linux系统
If your cluster doesn’t have the requisite software you will need to install it.
For example on Ubuntu Linux:
$ sudo apt-get install ssh $ sudo apt-get install rsync
这步是安装Hadoop并配置环境变量。(跟JDK安装步骤一样,我就不重复了)
这里是设置脚本中的JKD路径,告知Hadoop环境变量脚本JDK的路径。步骤是:编辑etc/hadoop/hadoop-env.sh
路径下的脚本文件,找到
# set to the root of your Java installation
export JAVA_HOME=/usr/java/latest #这里修改成自己的Java路径
编辑完成后,到Hadoop中的bin目录下启动Hadoop脚本(前面说过bin目录下是操作命令)
bin/hadoop #在Hadoop的根目录下运行此命令
Unpack the downloaded Hadoop distribution. In the distribution, edit the file
etc/hadoop/hadoop-env.sh
to define some parameters as follows:# set to the root of your Java installation export JAVA_HOME=/usr/java/latest
Try the following command:
$ bin/hadoop
我就不继续复制官方文档了,免得文章又长又烂。
先在Hadoop的根目录下创建目录input,然后拷贝etc/hadoop下的.xml文件到input下,然后使用mapreduce的架包统计符合要求的字符串。
$ mkdir input
$ cp etc/hadoop/*.xml input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'
$ cat output/*
其中’dfs[a-z.]+'为正则表达式。这里我解析一下,这里的input目录为输入文件的根目录,这里是统计标准文件中符合正则表达式的字符串个数,前面说过share/hadoop里面存的是jar包,而mapreduce/hadoop-mapreduce-examples-2.7.3.jar是mapreduce用来试验的例子架包,这架包功能是统计输入文件的字符串个数,这个只是用来示范的官方案例。
#第一步在input文件夹中创建txt文件
mkdir myfile.txt
#然后运行jar包(在Hadoop根目录下运行)
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount input/myfile.txt output/mywordcount01
#然后到output/mywordcount01目录下运行ls,会发现两个文件。
#success文件是成功的标记(空文件),另一个文件是统计的数量的结果
cat * #查看所有文件信息
伪分布式是安装在一台电脑上的,只是模仿集群的方式进行配置,不是真正意义上的分布式。本质上还是一台电脑,只不过是在一台电脑中模仿完全分布式进行配置。安装 Hadoop 伪分布式模式,总共有 5 个文件需配置,它们分别是 hadoop-env.sh、core-site.xml、 hdfs-site.xml、mapred-site.xml、yarn-site.xml。
步骤跟单机模式一样
vim etc/hadoop/hadoop-env.sh
# set to the root of your Java installation
export JAVA_HOME=/usr/java/latest #这里修改成自己的Java路径
#---------------------------------------------------
#同理改Javahome
vim etc/hadoop/mapred-env.sh
export JAVA_HOME=/usr/java/latest #这里修改成自己的Java路径
文件在etc/hadoop/core-site.xml
fs.defaultFS
hdfs://localhost:9000
hadoop.tmp.dir
/home/hadoop/hadoop/tmp
文件在etc/hadoop/hdfs-site.xml
dfs.replication
1
这个是mapreduce的部分的配置,文件还是在etc/hadoop下
#复制mapred-site.xml.template,生成 mapred-site.xml。
cp mapred-site.xml.template mapred-site.xml
#编辑mapred-site.xml,并添加以下内容
mapreduce.framework.name
yarn
如果要开启历史服务器格外添加如下配置信息:
mapreduce.jobhistory.address
hadoop101:10020
mapreduce.jobhistory.webapp.address
hadoop101:19888
文件一样在etc/hadoop下
yarn.resourcemanager.hostname
node1
yarn.nodemanager.aux-services
mapreduce_shuffle
配置完就可以格式化HDFS,格式一次就行了,格式化清除NameNode配置。
格式化NameNode会产生新的集群id,如果进行多次格式可能会导致NameNode和DataNode的集群ID不一致,导致datanode的消失。
如果需要多次格式化的话,请把Hadoop运行时产生文件的存储目录(保存了NameNode和DataNode的集群ID等信息)的文件夹和log日志删掉再格式化。这样能保证NameNode和DataNode获得新的一致的集群ID。Hadoop运行时产生文件的存储目录是在上面配置core-site.xml时的路径。如果没有配置默认是在系统跟根目录下的/tmp/hadoop文件夹下面
hdfs namenode -format
#多次格式化请删除Hadoop运行时产生文件夹和log文件,以防NameNode格式化后,导致NameNode和DataNode集群号不一致。
start-dfs.sh
也可以使用以下方法逐个启动,如果在配置Hadoop环境变量时有配置sbin的路径,就不用加sbin
sbin/hadoop-daemon.sh start 要启动的模块
如果没打印出模块,应该到相应主机去找对应的 log 查看原因,log 存放在 ${HADOOP_HOME}/logs 目录下,或者刷新一下主机根目录下的/etc/profile文件。
jps
http://主机名:50070
http://主机IP:50070
Overview:概述集群的启动时间,版本号,集群ID等等信息,还有集群的容量和已经使用的容量。是集群的总体信息的概述。
Datanodes:节点上信息的概述。
Snapshot: 快照
Startup Progress:一些进程信息。
utilities:文件目录,在HDFS上创建的文件都会在这里显示。还能看到文件的块ID。
跟单机那个测试架包一样,不过现在输入的路径不是本地路径了,是HDFS上的文件路径。
$hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount input/myfile.txt output/mywordcount01
/*
主要首先要在HDFS上上传文件input/myfile.txt,这里已经不是本地路径了,这里已变成了HDFS上的路径。
*/
观看结果可以直接从web端查看,也可以使用命令进行查看
hadoop dfs -cat output/mywordcount01/*
http://主机名:8088
http://主机IP:8088
准备3台虚拟机或者3台服务器,因为我们需要配置的是完全分布式。
如果使用本地虚拟机,所以通过克隆虚拟机来启动3台虚拟机。
我们还需要确定Hadoop组件的位置。
HDFS:NameNode,SecondaryNameNode,DateNode.
YARN:ResourceManager,NodeManager.
NameNode,SecondaryNameNode和ResourceManager尽量放在不同的主机上,这样虚拟机运行压力不会那么大,并且也可以防止一个虚拟机挂了这三个主节点同时收到影响。这些组件的位置我们是通过配置文件来确定定位的。前面伪分布也知道了那些文件是确定位置的。
这些搞定好了以后,我们还需要配置主机名,这里说一下,配置主机名的方法。
$ sudo vi /etc/hostname
Hadoop1 #在文本中添加自己的主机名(根据实际自己定)
//重启生效
$ sudo reboot
其他几台机子也一样。还要修改一下/etc/hosts 文件。这样我们就可以通过主机名来代替IP地址了。
$ sudo vi /etc/hosts
#根据实际自己定,格式是 IP 主机名
192.168.30.131 Hadoop1
192.168.30.132 Hadoop2
192.168.30.133 Hadoop3
为了方便集群的分发,我们需要一个集群分发脚本。这里给个网上找的,基本集群分发脚本都一样。脚本内容如下:
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=103; host<105; host++)); do
echo --------------------- hadoop$host ----------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
我们可以通过脚本xsync来实现文件的同步发放,发放个数在循环处修改,请根据自己实现修改。
这里再搞个免密登陆要不然整天输入密码有够你烦的。
$ ssh-keygen -t rsa #生成密钥
$ ls ~/.ssh #检查密钥
#复制公钥到相应主机
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop1
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop2
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop3
#验证一下(能登陆就行了,不必每个验证)
$ ssh hadoop1
$ ssh hadoop2
$ ssh hadoop3
准备工作准备完了就可以配置相应的文件了
跟前面的一样写上JAVM_HOME的地址,凡是xxx-env.sh,都配置JAVA_HOME,
文件在etc/hadoop/core-site.xml,这个文件配置的是HDFS的NameNode地址
fs.defaultFS
hdfs://Hadoop1:9000
hadoop.tmp.dir
/home/hadoop/hadoop/tmp
文件在etc/hadoop/hdfs-site.xml,这个配置副本数和SecondaryNameNode的位置
dfs.replication
3
dfs.namenode.secondary.http-address
hadoop2:50090
这个其实可以不用配置,因为默认就是3个副本数。
这个是mapreduce的部分的配置,文件还是在etc/hadoop下
#复制mapred-site.xml.template,生成 mapred-site.xml。
cp mapred-site.xml.template mapred-site.xml
#编辑mapred-site.xml,并添加以下内容
mapreduce.framework.name
yarn
文件一样在etc/hadoop下,这个文件配置的是YARN中的ResourceManager的地址和一些其他的配置
yarn.resourcemanager.hostname
Hadoop2
yarn.nodemanager.aux-services
mapreduce_shuffle
我们通过前面准备的脚本进行集群的分发,把配置文件同步到每个节点上。这样我们就可以避免,每个节点一个一个自己进行配置了。
$xsync +Hadoop文件夹的路径
格式化之前先把日志和数据清除完,清除NameNode主机的就行了。
hdfs namenode -format
启动集群需要批量操作,这时我们需要配置slaves文件,来进行集群启动的配置。文件位置在etc/hadoop/下。并在文件中添加以下内容:
hadoop1
hadoop2
hadoop3
需要注意的是:只能是每行一个主机名(IP),并且不能有其他字符(包括空格,包括空行)。否则会报错。
配置好文件后,通过以下命令进行集群启动,并且在启动yarn时,必须在resourcemanager下启动。
$start-dfs.sh
$start-yarn.sh
还有一个全部启动命令
$start-all.sh
下一章:源码编译篇.