赞
踩
在IT行业中,所谓大数据是指那些无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合。比如说我们要存储一个非常大的文件。
对于大数据而言,我们主要考虑两大问题,一个是数据的存储文件,另一个是数据的处理问题。那么在大数据中如何解决这两大问题。
1)对于文件存储问题,我们可以把一个大的文件分割成许多小的文件,然后存放在不同的机器上,即分布式存储;
2)对于文件数据的计算问题,如果数据量特别大,我们可以将一个大的任务拆分成许多小的任务,然后把这些任务放在集群上的各个主机中运行,最后把各个主机的运行结果进行汇总,得到最终结果,即分布式计算。
为了解决上面问题,我们可以使用Hadoop来实现大数据中的分布式存储和分布式计算问题。Hadoop其实是一个分布式的基础框架,它允许使用简单的编程模型跨大型计算机的大型数据集进行分布式处理。
Hadoop框架主要由以下几部分组成:
从广义上看,Hadoop是一个大的生态圈,它包含了许多其他软件,如hadoop、hive、hbase、flume、storm、kaflka、spark等等。但是从狭义上看,Hadoop就是指Hadoop这个软件。
我本地的Hadoop是在centos7操作系统上安装。这里我准备了三台虚拟主机。
主机名 | IP |
---|---|
node1 | 192.168.31.7 |
node2 | 192.168.31.8 |
node3 | 192.168.31.9 |
每一台主机都需要进行hosts映射和时钟同步操作。在安装Hadoop之前,还需要在每台主机上安装其他一些辅助软件:JDK,ZooKeeper。
# 修改主机名
vi /etc/hostname
node01
# 设置ip和域名的映射
vi /etc/hosts
之所以需要同步时钟,是因为许多分布式系统是有状态的, 比如说存储一个数据, A节点 记录的时间是111, B节点 记录的时间是 222,就会出问题。
同步时钟的指令:
# 安装ntp
yum install -y ntp
# 定义定时器
crontab -e
*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com;
之所以设置免密登录,是因为Hadoop主节点启动时候回自动登录到其他从节点。假设node01是主节点,具体的配置步骤如下:
# 在每个节点上执行下面命令生成秘钥对
ssh-keygen -t rsa
# 在每个节点上执行下面命令拷贝公钥到node01节点上
ssh-copy-id node01
/root/.ssh/authorized_keys
文件拷贝到node02和node03节点上;scp /root/.ssh/authorized_keys node02:/root/.ssh
scp /root/.ssh/authorized_keys node03:/root/.ssh
# 新建目录,存放上传的软件包 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
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进程。
1.x版本系列是hadoop版本当中的第二代开源版本,主要修复0.x版本的一些bug等。
文件系统核心模块:
数据计算核心模块:
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高可用架构模型。
这里按照第一种架构模型进行Hadoop环境部署。这里有三台主机,分别是node1、node2和node3,每台主机的配置情况如下:
主机 | node01 | node02 | node03 |
---|---|---|---|
NameNode | 是 | 否 | 否 |
SecondaryNameNode | 是 | 否 | 否 |
dataNode | 是 | 是 | 是 |
ResourceManager | 是 | 否 | 否 |
NodeManager | 是 | 是 | 是 |
cd /export/software
tar -zxvf hadoop-3.1.1.tar.gz -C ../servers
下面配置文件保存在/export/servers/hadoop-3.1.1/etc/hadoop目录下。
<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>
export JAVA_HOME=/export/servers/jdk1.8.0_141
<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>
<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>
<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>
node01
node02
node03
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"
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
vi /etc/profile
export HADOOP_HOME=/export/servers/hadoop-3.1.1/
export PATH=:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
之所以要格式化HDFS,是因为HDFS需要一个格式化的过程来创建存放元数据(image, editlog)的目录。
cd /export/servers/hadoop-3.1.1/
bin/hdfs namenode -format
/export/servers/hadoop-3.1.1/sbin/start-dfs.sh
/export/servers/hadoop-3.1.1/sbin/start-yarn.sh
启动成功后,可以通过如下两个URL访问Hadoop的hdfs和yarn集群。
http://192.168.31.7:50070/dfshealth.html#tab-overview
http://192.168.31.7:8088/cluster
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。