Hadoop大数据框架学习(配置启动篇)
大数据的特点:
- Volume(大量):数据量到达PB,EB级别
- Velocity(高速): 要求处理海量数据效率高速度快
- Variety(多样):数据的样化。(结构化数据,非结构化数据和半结构化数据)
- Value(低价值密度):价值密度低,难以提取出有价值的信息。
Hapood是什么
Hadoop是一个由Apache开发的分布式系统基础架构,主要解决,海量数据的存储和分析计算。Hadoop通常是说Hadoop生态圈。
Google的三论文
Google是Hadoop的思想之源,Hadoop的很多东西都是从Google泛生出来的,如:
- GFS-------->HDFS(分布式文件系统)
- Map-Reduce--------------->MR(分布式计算框架)
- BigTable-------->HBase(数据库管理系统)
Hadoop的优势
- 高可靠性:多个数据副本,计算或存储节点出故障也不会导致数据丢失。
- 高扩展性:在集群中分配任务数据,方便扩展节点数(横向扩展)
- 高效性:多个计算机节点并行工作,加快处理。
- 高容错性:自动将失败的任务重新分配。
Hadoop的组成
- Hadoop1.0版本的组成:Common(辅助工具),HDFS(数据存储),MapReduce(计算+资源调度)
- Hadoop2.0版本的组成:Common(辅助工具),HDFS(数据存储),MapReduce(计算),Yarn(资源调度)
可以看出Hadoop2.0版本比1.0多出了一个Yarn组件来分担了MapReduce的资源调度工作。
1.HDFS架构概述
NameNode:存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表和块所在的DateNode等。
SecondaryNameNode:用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。
DateNode:在本地文件系统存储文件块数据,以及块数据的校验和。
2.YARN架构概述
client:客户端,发送作业请求。(这个可以说是不算)
-
Resource Manager:处理客户端请求,监控NodeManager,启动或监控ApplicationMaster,资源的分配与调度。
-
NodeManager:管理单个节点上的资源,处理ResourceManager的命令,处理ApplicationMaster的命令。
-
ApplicationMaster:负责数据的切分,为应用程序申请资源并分配给内部的任务,任务的监控和容错。
-
Container:YARN中的资源抽象,封装某个节点上的资源,如内存,cpu,磁盘,网络等等。(虚拟化容器)
相关网络图片如下:
3.MapReduce架构概述
MapReduce分成:map和reduce。
- map:并行处理输入数据。
- reduce:处理map结果并进行汇总。
4.搭建Hadoop运行环境
4.1安装JDK
本地上传JDK压缩包到虚拟机上,并解压。然后配置环境变量。
4.2安装hadoop-2.7.3
本地上传hadoop-2.7.3压缩包到虚拟机上,并解压。然后配置环境变量。
4.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架包
4.4.Hadoop的安装模式
Hadoop安装模式分三种:单机模式,伪分布式模式,完全分布式模式。
4.4.1单机模式的配置
Hadoop 单机模式没有 HDFS,只能测试 MapReduce 程序。MapReduce 处理的是本地 Linux 的文件数据。因为HDFS是分布式文件系统,单机模式自然没有。
以下内容来自官方文档:https://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/SingleCluster.html,为了方便阅读,本人做了核心内容的提取和翻译。
Supported Platforms(支持的平台)
支持GNU/Linux和Windows系统。
Required Software(需要安装的软件)
JDK必须安装,如果你需要使用管理远程Hadoop守护进程的Hadoop脚本,就需要安装ssh.
Installing Software(安装软件)
例子适合Ubuntu Linux系统
$ sudo apt-get install ssh
$ sudo apt-get install rsync
下载Hadoop并配置环境变量
这步是安装Hadoop并配置环境变量。(跟JDK安装步骤一样,我就不重复了)
准备开启Hadoop
开启Hadoop单机模式之前,先配置一下脚本中的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的根目录下运行此命令
小实验
先在Hadoop的根目录下创建目录input,然后拷贝etc/hadoop下的.xml文件到input下,然后使用mapreduce的jar包去统计符合要求的字符串(统计那些.xml文件中的字符串)。
$ 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用来试验的例子jar包,这jar包功能是统计输入文件的字符串个数,这个只是用来示范的官方案例。
自己写个例子去试验官方的提供wordcount jar包
#第一步在input文件夹中创建txt文件(然后随便写点单词进去)
vim 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,会发现两个文件。
cd output/mywordcount01
#success文件是成功的标记(空文件),另一个文件是统计的数量的结果
cat * #查看所有文件信息(查看统计结果)
4.4.2伪分布式模式的配置
伪分布式是安装在一台电脑上的,只是模仿集群的方式进行配置,不是真正意义上的分布式。本质上还是一台电脑,只不过是在一台电脑中模仿完全分布式进行配置。安装 Hadoop 伪分布式模式,总共有 5 个文件需配置,它们分别是 hadoop-env.sh、core-site.xml、 hdfs-site.xml、mapred-site.xml、yarn-site.xml。
配置文件hadoop-env.sh和mapred-env.sh
步骤跟单机模式一样
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路径
配置core-site.xml
文件在etc/hadoop/core-site.xml
<configuration>
<!--配置NameNode地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!--Hadoop运行时产生文件的存储目录,根据实践情况,一般放在hadoop下-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop/tmp</value>
</property>
</configuration>
配置hdfs-site.xml
文件在etc/hadoop/hdfs-site.xml
<configuration>
<!--配置副本数,默认3-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
配置mapred-site.xml
这个是mapreduce的部分的配置,文件还是在etc/hadoop下
#复制mapred-site.xml.template,生成 mapred-site.xml。
cp mapred-site.xml.template mapred-site.xml
#编辑mapred-site.xml,并添加以下内容
<!-- 指定mapreduce运行在yarn上,默认值local,运行在本地上 -->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
如果要开启历史服务器格外添加如下配置信息:
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop101:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop101:19888</value>
</property>
配置yarn-site.xml
文件一样在etc/hadoop下
<configuration>
<property>
<!-- 指定YARN中的ResourceManager的地址 -->
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
<!-- 以上主机名或IP 地址按实际情况修改 -->
</property>
<!-- reduce获取数据方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
格式化NameNode
配置完就可以格式化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集群号不一致。
启动Hadoop
start-dfs.sh
也可以使用以下方法逐个启动,如果在配置Hadoop环境变量时有配置sbin的路径,就不用加sbin,这种方式是以守护进程的方式进行启动
sbin/hadoop-daemon.sh start modelname(要启动的模块)
验证启动
输入下面命令查看启动结果,如果没打印出已经启动的hadoop组件,应该到相应主机去找对应的 log 查看原因,log 存放在 ${HADOOP_HOME}/logs 目录下,或者刷新一下主机根目录下的/etc/profile文件。
jps
在web上访问HDFS
http://主机名:50070
http://主机IP:50070
网页访问HDFS的概述
Overview:概述集群的启动时间,版本号,集群ID等等信息,还有集群的容量和已经使用的容量。是集群的总体信息的概述。
Datanodes:节点上信息的概述。
Snapshot: 快照
Startup Progress:一些进程信息。
utilities:文件目录,在HDFS上创建的文件都会在这里显示。还能看到文件的块ID。
测试wordcount
跟单机那个测试架包一样,不过现在输入的路径不是本地路径了,是HDFS上的文件路径。
主要首先要在HDFS上上传文件input/myfile.txt,这里已经不是本地路径了,这里已变成了HDFS上的路径。
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount input/myfile.txt output/mywordcount01
观看结果可以直接从web端查看,也可以使用命令进行查看
hadoop dfs -cat output/mywordcount01/*
在web上访问YARN
http://主机名:8088
http://主机IP:8088
4.4.3.完全分布式的配置
准备工作
准备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
准备工作准备完了就可以配置相应的文件了
配置hadoop-env.sh,YARN-env.sh,mapred-env.sh
跟前面的一样写上JAVM_HOME的地址,凡是xxx-env.sh,都配置JAVA_HOME,
配置core-site.xml
文件在etc/hadoop/core-site.xml,这个文件配置的是HDFS的NameNode地址
<configuration>
<!--配置NameNode地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://Hadoop1:9000</value>
</property>
<!--Hadoop运行时产生文件的存储目录,根据实践情况,一般放在hadoop下-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop/tmp</value>
</property>
</configuration>
配置hdfs-site.xml
文件在etc/hadoop/hdfs-site.xml,这个配置副本数和SecondaryNameNode的位置
<configuration>
<!--配置副本数,默认3-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop2:50090</value>
</property>
</configuration>
配置mapred-site.xml
这个是mapreduce的部分的配置,文件还是在etc/hadoop下。
#复制mapred-site.xml.template,生成 mapred-site.xml。
cp mapred-site.xml.template mapred-site.xml
#编辑mapred-site.xml,并添加以下内容
然后进行编辑
<!-- 指定mapreduce运行在yarn上,默认值local,运行在本地上 -->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
配置yarn-site.xml
文件一样在etc/hadoop下,这个文件配置的是YARN中的ResourceManager的地址和一些其他的配置
<configuration>
<property>
<!-- 指定YARN中的ResourceManager的地址 -->
<name>yarn.resourcemanager.hostname</name>
<value>Hadoop2</value>
<!-- 以上主机名或IP 地址按实际情况修改 -->
</property>
<!-- reduce获取数据方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
集群分发脚本
我们通过前面准备的脚本进行集群的分发,把配置文件同步到每个节点上。这样我们就可以避免,每个节点一个一个自己进行配置了。
$xsync +Hadoop文件夹的路径
格式化NameNode
格式化之前先把日志和数据清除完,清除NameNode主机的就行了。
hdfs namenode -format
启动集群
启动集群需要批量操作,这时我们需要配置slaves文件,来进行集群启动的配置。文件位置在etc/hadoop/下。并在文件中添加以下内容:
hadoop1
hadoop2
hadoop3
需要注意的是:只能是每行一个主机名(IP),并且不能有其他字符(包括空格,包括空行)。否则会报错。
配置好文件后,通过以下命令进行集群启动,并且在启动yarn时,必须在resourcemanager下启动。
$start-dfs.sh
$start-yarn.sh
还有一个全部启动命令
$start-all.sh