一、Hadoop介绍
在IT行业中,所谓大数据是指那些无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合。比如说我们要存储一个非常大的文件。
对于大数据而言,我们主要考虑两大问题,一个是数据的存储文件,另一个是数据的处理问题。那么在大数据中如何解决这两大问题。
1)对于文件存储问题,我们可以把一个大的文件分割成许多小的文件,然后存放在不同的机器上,即分布式存储;
2)对于文件数据的计算问题,如果数据量特别大,我们可以将一个大的任务拆分成许多小的任务,然后把这些任务放在集群上的各个主机中运行,最后把各个主机的运行结果进行汇总,得到最终结果,即分布式计算。
为了解决上面问题,我们可以使用Hadoop来实现大数据中的分布式存储和分布式计算问题。Hadoop其实是一个分布式的基础框架,它允许使用简单的编程模型跨大型计算机的大型数据集进行分布式处理。
Hadoop框架主要由以下几部分组成:
- Hadoop HDFS:Hadoop分布式文件系统,提供对应用程序数据的高吞吐量的访问。
- Hadoop Common:其他Hadoop模块所需的Java库和应用程序,这些库提供文件系统和操作系统级抽象,并包含启动Hadoop所需的必要Java文件和脚本。
- Hadoop MapReduce:基于YARN的大型数据集并行处理系统。
- Hadoop YARN:作业调度和集群资源管理的框架。
从广义上看,Hadoop是一个大的生态圈,它包含了许多其他软件,如hadoop、hive、hbase、flume、storm、kaflka、spark等等。但是从狭义上看,Hadoop就是指Hadoop这个软件。
二、Hadoop环境搭建
我本地的Hadoop是在centos7操作系统上安装。这里我准备了三台虚拟主机。
主机名 | IP |
---|---|
node1 | 192.168.31.7 |
node2 | 192.168.31.8 |
node3 | 192.168.31.9 |
每一台主机都需要进行hosts映射和时钟同步操作。在安装Hadoop之前,还需要在每台主机上安装其他一些辅助软件:JDK,ZooKeeper。
2.1 配置Hosts映射
# 修改主机名
vi /etc/hostname
node01
# 设置ip和域名的映射
vi /etc/hosts
2.2 时钟同步
之所以需要同步时钟,是因为许多分布式系统是有状态的, 比如说存储一个数据, A节点 记录的时间是111, B节点 记录的时间是 222,就会出问题。
同步时钟的指令:
# 安装ntp
yum install -y ntp
# 定义定时器
crontab -e
*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com;
2.3 配置SSH免密登录
之所以设置免密登录,是因为Hadoop主节点启动时候回自动登录到其他从节点。假设node01是主节点,具体的配置步骤如下:
- 第一步:在node01、node02、node03节点所在主机生成公钥和私钥;
# 在每个节点上执行下面命令生成秘钥对
ssh-keygen -t rsa
- 第二步:将node01、node02、node03的公钥拷贝到node01节点上;
# 在每个节点上执行下面命令拷贝公钥到node01节点上
ssh-copy-id node01
- 第三步:在node01节点上将
/root/.ssh/authorized_keys
文件拷贝到node02和node03节点上;
scp /root/.ssh/authorized_keys node02:/root/.ssh
scp /root/.ssh/authorized_keys node03:/root/.ssh
2.3 安装辅助软件
2.3.1 安装jdk
# 新建目录,存放上传的软件包
mkdir -p /export/softwares
# 新建目录,存放解压的文件包
mkdir -p /export/servers
# 上传jdk到/export/softwares路径下去,并解压
tar -zxvf jdk-8u141-linux-x64.tar.gz -C ../servers/
# 配置JDK环境变量
vi /etc/profile
export JAVA_HOME=/export/servers/jdk1.8.0_141
export PATH=:$JAVA_HOME/bin:$PATH
# 让配置文件生效
source /etc/profile
2.3.2 安装zookeeper
Zookeeper是一个开源的分布式协调调度服务的框架,主要用来解决分布式集群中应用协调的一致性问题。Zookeeper 本质上是一个分布式文件系统,适合存放小文件,通过文件系统来实现分布式协调。Zookeeper的安装步骤如下:
第一步:下载zookeeeper的压缩包并解压;
cd /export/softwares
tar -zxvf zookeeper-3.4.9.tar.gz -C ../servers/
第二步:修改配置文件;
# 创建zkdatas文件目录
mkdir -p /export/servers/zookeeper-3.4.9/zkdatas/
# 修改配置文件
cd /export/servers/zookeeper-3.4.9/conf/
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改内容如下:
dataDir=/export/servers/zookeeper-3.4.9/zkdatas
# 保留多少个快照
autopurge.snapRetainCount=3
# 日志多少小时清理一次
autopurge.purgeInterval=1
# 集群中服务器地址
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
第三步:定义节点id,用来标识哪台zookeeper主机;
# 第一台主机的id
echo 1 > /export/servers/zookeeper-3.4.9/zkdatas/myid
# 第二主机的id
echo 2 > /export/servers/zookeeper-3.4.9/zkdatas/myid
# 第三台主机的id
echo 3 > /export/servers/zookeeper-3.4.9/zkdatas/myid
第四步:启动zookeeper服务;
# 启动zookeeper
/export/servers/zookeeper-3.4.9/bin/zkServer.sh start
# 查看启动状态
/export/servers/zookeeper-3.4.9/bin/zkServer.sh status
也可以通过jps
命令查看java进程。
2.4 安装Hadoop
2.4.1 Hadoop架构
2.4.1.1 1.x版本架构模型
1.x版本系列是hadoop版本当中的第二代开源版本,主要修复0.x版本的一些bug等。
文件系统核心模块:
- NameNode:集群当中的主节点,管理元数据(文件的大小,文件的位置,文件的权限),主要用于管理集群中的各种数据;
- secondaryNameNode:主要能用于hadoop中元数据的辅助管理;
- DataNode:集群中的从节点,主要用于存储集群中的数据;
数据计算核心模块:
- JobTracker:接收用户的计算请求任务,并分配任务给从节点;
- TaskTracker:负责执行主节点JobTracker分配的任务;
2.4.1.2 2.x版本架构模型
Hadoop 2.x版本系列的架构产生重大变化,引入了yarn平台等许多新特性。这里有4种架构模型:
第一种:NameNode与ResourceManager单节点架构模型。
这种架构模型将JobTracker和TaskTracker替换成ResourceManager和NodeManager。ResourceManager接收用户的计算请求任务,并负责集群的资源分配。NodeManager负责执行主节点分配的任务。
第二种:NameNode单节点与ResourceManager高可用架构模型。
在这种架构模型下,ResourceManager除了用于接收用户的计算请求任务和集群的资源分配以外,它还负责计算任务的划分,通过zookeeper实现ResourceManager的高可用。
第三种:NameNode高可用与ResourceManager单节点架构模型。
在这种架构模型下,在文件系统中部署了多个NameNode节点,形成高可用状态。而且NameNode不再负责文件系统元数据信息的管理,而且交给了JournalNode进程来管理。
第四种:NameNode与ResourceManager高可用架构模型。
2.4.2 安装和配置
这里按照第一种架构模型进行Hadoop环境部署。这里有三台主机,分别是node1、node2和node3,每台主机的配置情况如下:
主机 | node01 | node02 | node03 |
---|---|---|---|
NameNode | 是 | 否 | 否 |
SecondaryNameNode | 是 | 否 | 否 |
dataNode | 是 | 是 | 是 |
ResourceManager | 是 | 否 | 否 |
NodeManager | 是 | 是 | 是 |
2.4.2.1 上传压缩包
cd /export/software
tar -zxvf hadoop-3.1.1.tar.gz -C ../servers
2.4.2.2 修改配置文件
下面配置文件保存在/export/servers/hadoop-3.1.1/etc/hadoop目录下。
- 修改core-site.xml配置文件。
<configuration>
<!-- 文件系统所在节点的位置 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:8020</value>
</property>
<!-- 临时文件存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/servers/hadoop-3.1.1/datas/tmp</value>
</property>
<!-- 缓冲区大小,实际工作中根据服务器性能动态调整 -->
<property>
<name>io.file.buffer.size</name>
<value>8192</value>
</property>
<!-- 开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 -->
<property>
<name>fs.trash.interval</name>
<value>10080</value>
</property>
</configuration>
- 修改hadoop-env.sh配置文件。
export JAVA_HOME=/export/servers/jdk1.8.0_141
- 修改hdfs-site.xml配置文件。
<configuration>
<!-- namenode节点元数据信息存放目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///export/servers/hadoop-3.1.1/datas/namenode/namenodedatas</value>
</property>
<!-- 文件块大小,这里为128Mb -->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>10</value>
</property>
<!-- datanode节点数据存放位置 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///export/servers/hadoop-3.1.1/datas/datanode/datanodeDatas</value>
</property>
<!-- 外部访问端口 -->
<property>
<name>dfs.namenode.http-address</name>
<value>node01:50070</value>
</property>
<!-- 文件副本数 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- hdfs访问权限开关 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.checkpoint.edits.dir</name>
<value>file:///export/servers/hadoop-3.1.1/datas/dfs/nn/snn/edits</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node01.hadoop.com:50090</value>
</property>
<!-- hdfs日志文件存放目录 -->
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///export/servers/hadoop-3.1.1/datas/dfs/nn/edits</value>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:///export/servers/hadoop-3.1.1/datas/dfs/snn/name</value>
</property>
</configuration>
- 修改mapred-site.xml配置文件。
<configuration>
<!-- 指定mapreduce执行框架 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- mapreduce内存大小 -->
<property>
<name>mapreduce.map.memory.mb</name>
<value>1024</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx512M</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>1024</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx512M</value>
</property>
<property>
<name>mapreduce.task.io.sort.mb</name>
<value>256</value>
</property>
<property>
<name>mapreduce.task.io.sort.factor</name>
<value>100</value>
</property>
<property>
<name>mapreduce.reduce.shuffle.parallelcopies</name>
<value>25</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>node01.hadoop.com:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node01.hadoop.com:19888</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/export/servers/hadoop-3.1.1/datas/jobhsitory/intermediateDoneDatas</value>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/export/servers/hadoop-3.1.1/datas/jobhsitory/DoneDatas</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/export/servers/hadoop-3.1.1</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/export/servers/hadoop-3.1.1/</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/export/servers/hadoop-3.1.1</value>
</property>
</configuration>
- 修改yarn-site.xml配置文件。
<configuration>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>node01:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>node01:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>node01:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>node01:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>node01:8088</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node01</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<!-- 设置不检查虚拟内存的值,不然内存不够会报错 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
<value>true</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>file:///export/servers/hadoop-3.1.1/datas/nodemanager/nodemanagerDatas</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>file:///export/servers/hadoop-3.1.1/datas/nodemanager/nodemanagerLogs</value>
</property>
<property>
<name>yarn.nodemanager.log.retain-seconds</name>
<value>10800</value>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/export/servers/hadoop-3.1.1/datas/remoteAppLog/remoteAppLogs</value>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir-suffix</name>
<value>logs</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>18144000</value>
</property>
<property>
<name>yarn.log-aggregation.retain-check-interval-seconds</name>
<value>86400</value>
</property>
<!-- yarn上面运行一个任务,最少需要1.5G内存,虚拟机没有这么大的内存就调小这个值,不然会报错 -->
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>1024</value>
</property>
</configuration>
- 修改worker文件:
node01
node02
node03
- 修改hadoop-env.sh:
export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_SECONDARYNAMENODE_USER="root"
export YARN_RESOURCEMANAGER_USER="root"
export YARN_NODEMANAGER_USER="root"
2.4.2.3 创建临时文件目录
mkdir -p /export/servers/hadoop-3.1.1/datas/tmp
mkdir -p /export/servers/hadoop-3.1.1/datas/dfs/nn/snn/edits
mkdir -p /export/servers/hadoop-3.1.1/datas/namenode/namenodedatas
mkdir -p /export/servers/hadoop-3.1.1/datas/datanode/datanodeDatas
mkdir -p /export/servers/hadoop-3.1.1/datas/dfs/nn/edits
mkdir -p /export/servers/hadoop-3.1.1/datas/dfs/snn/name
mkdir -p /export/servers/hadoop-3.1.1/datas/jobhsitory/intermediateDoneDatas
mkdir -p /export/servers/hadoop-3.1.1/datas/jobhsitory/DoneDatas
mkdir -p /export/servers/hadoop-3.1.1/datas/nodemanager/nodemanagerDatas
mkdir -p /export/servers/hadoop-3.1.1/datas/nodemanager/nodemanagerLogs
mkdir -p /export/servers/hadoop-3.1.1/datas/remoteAppLog/remoteAppLogs
2.4.2.4 配置环境变量
vi /etc/profile
export HADOOP_HOME=/export/servers/hadoop-3.1.1/
export PATH=:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
2.4.2.5 格式化HDFS
之所以要格式化HDFS,是因为HDFS需要一个格式化的过程来创建存放元数据(image, editlog)的目录。
cd /export/servers/hadoop-3.1.1/
bin/hdfs namenode -format
2.4.2.6 启动集群
/export/servers/hadoop-3.1.1/sbin/start-dfs.sh
/export/servers/hadoop-3.1.1/sbin/start-yarn.sh
启动成功后,可以通过如下两个URL访问Hadoop的hdfs和yarn集群。
- HDFS:
http://192.168.31.7:50070/dfshealth.html#tab-overview
- Yarn:
http://192.168.31.7:8088/cluster