零基础小白大数据平台入门,搭建大数据平台

155 阅读6分钟

基础知识

Hadoop是典型的分布式软件框架,用以提供:

  • 分布式数据存储
  • 分布式数据计算
  • 分布式资源调度

内部三大功能组件

  • HDFS --> HDFS是Hadoop内的分布式存储组件,可以构建分布式文件系统用于数据存储
  • MapReduce --> MapReduce是Hadoop内的分布式数据计算组件,提供编程接口供用户开发分布式计算程序
  • YARN --> YARN是Hadoop内分布式资源调度组件,可供用户整体调度大规模集群的资源使用

分布式存储的优缺点

1. 高可用性和高可靠性(优)
分布式存储通过将数据分散在各个节点上,实现了数据的冗余备份和容错能力。

2. 高扩展性(优)
分布式存储具有良好的可扩展性,可以根据业务需求增加或减少节点,实现无缝扩容或缩容。

3. 高效性(优)
数量的提升带来的是网络传输、磁盘读写、CPU内存等各方面的综合提升。

4.数据一致性问题(劣)
在分布式存储中,由于数据分散存储在多个节点上,难以保证数据的一致性。需要通过一系列的算法和机制来解决数据的一致性问题,如采用分布式事务、一致性哈希等方案。这些方案实现复杂,且可能影响系统的性能和稳定性。

5. 复杂性增加(劣)
分布式存储的系统架构更为复杂。需要解决节点间的通信、数据同步、负载均衡等一系列问题,对技术要求较高。同时,分布式存储的管理和维护也相对复杂,需要专业的技术团队进行支持。

6. 对网络依赖性强(劣)
分布式存储对网络的依赖性较强,如果网络发生故障或不稳定,可能会影响数据的可用性和可靠性。因此,需要保证网络的稳定性和可靠性,以确保分布式存储的正常运行。

Hadoop轻量化部署

部署环境:Linux3.10 X86_64 GUN/Linux
bigdata001主节点:1核4G内存 20G存储容量
bigdata002从节点:1核2G内存 20G存储容量
bigdata003从节点:1核2G内存 20G存储容量

HDFS集群

主角色:NameNode 是HDFS系统的主角色,独立的进程,负责管理HDFS整个文件系统;负责管理DataNode
从角色:DataNode 是HDFS系统的从角色,独立的进程,负责数据的存储,即存入取出数据
主角色辅助角色:SecondaryNameNode 是NameNode的辅助,独立进程,帮助NameNode完成元数据整理工作

配置文件设置

  • 配置workers文件
## 集群记录了三个从节点
bigdata001
bigdata002
bigdata003
  • 配置hadoop-env文件
export JAVA_HOME=/export/server/jdk //指定JDK环境位置
export HADOOP_HOME=/export/server/hadoop //指明Hadoop环境安装位置
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop //指明Hadoop配置文件目录位置
export HADOOP_LOG_DIR=$HADOOP_HOME/logs //指明Hadoop运行日志目录位置
  • 配置core-site.xml文件
<configuration>
 <property>
  <name>fs.defaultFS</name> //HDFS文件系统的网络通讯路径
  <value>hdfs://bigdata001:8020</value> 
 </property>
  <property>
  <name>io.file.buffer.size</name> //io操作文件缓冲区大小
  <value>131072</value> //bit
 </property>

 <property>
  <name>hadoop.proxyuser.hadoop.groups</name>
  <value>*</value>
 </property>

 <property>
  <name>hadoop.proxyuser.hadoop.hosts</name>
  <value>*</value>
 </property>
</configuration>
  • 配置hdfs-site.xml文件
<configuration>
 <property>
  <name>dfs.datanode.data.dir.perm</name> //hdfs文件系统,默认创建的文件权限设置
  <value>700</value> //700即:rwx------
 </property>
 <property>
  <name>dfs.namenode.name.dir</name> //NameNode元数据的存储位置
  <value>/data/nn</value> //存在bigdata001节点的/data/nn目录下
 </property>
 <property>
  <name>dfs.namenode.hosts</name> //NameNode允许哪几个节点的DataNode连接(即允许加入集群)
 <value>bigdata001,bigdata002,bigdata003</value>
 </property>

 <property>
  <name>dfs.blocksize</name> //hdfs默认块大小
  <value>268435456</value> //256MB
 </property>
 <property>
  <name>dfs.namenode.handler.count</name> //namenode处理的并发线程数
  <value>100</value> //以100个并行度处理文件系统的管理任务
 </property>
 <property>
  <name>dfs.namenode.data.dir</name> //从节点DataNode的数据存储目录
  <value>/data/dn</value> 数据存放在bigdata001-003三台机器的/data/dn内
 </property>

 <property>
  <name>nfs.superuser</name>
  <value>hadoop</value>
 </property>
 <property>
  <name>dfs.dump.dir</name>
  <value>/tmp/.hdfs-nfs</value>
 </property>
 <property>
  <name>nfs.exports.allowed.hosts</name>
  <value>192.168.137.1 rw</value>
 </property>
</configuration>
  • 配置环境变量
## 创建hadoop软链接
ln -s /export/server/hadoop-3.34 /export/server/hadoop

## 配置hadoop内sbin和bin的环境变量,方便执行内部脚本
export HADOOP_HOME=/export/server/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

创建Hadoop用户并授权

## 创建hadoop用户组
sudo groupadd hadoop

## 创建用户hadoop并加入hadoop用户组
sudo adduser hadoop
sudo passwd hadoop
usermod -a -G hadoop hadoop

## 确保hadoop系统只以hadoop用户启动
chown -R hadoop:hadoop /data
chown -R hadoop:hadoop /export

格式化整个文件系统

  • 格式化namenode
## 以Hadoop用户执行
su - hadoop

## 格式化namenode
hadoop namenode -format
  • 启动停止脚本
## 一键启动hdfs集群
start-dfs.sh

## 一键停止hdfs集群
stop-dfs.sh

启动后可通过 http://bigdata001:9870 查看hdfs文件系统的管理页面

  • 单独控制所有机器的进程的启停
## 用法1:
hadoop-daemon.sh (start|status|stop) (namenode|secondarynamenode|datanode)
## 用法2:
hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)

## 查看机器的进程
jps

hdfs文件系统的操作命令

  • hadoop命令(老版本用法)
hadoop fs [generic options]

## 创建文件夹 
hadoop fs -mkdir [-p] <path> ...  //-p 选项会沿路径创建父目录

## 查看指定目录下的文件
hadoop fs -ls [-h] [-R] <path>... //-h 人性化显示文件size -R 递归查看指定目录及其子目录

## 上传文件到HDFS指定目录下
hadoop fs -put [-f] [-p] <localsrc> ... <dst> //-f 覆盖目标文件 -p 保留访问和修改时间,所有权和权限 localsrc 本地文件系统 dst 目标文件系统(hdfs)

## 查看HDFS文件内容
hadoop fs -cat <src> ... //src 指hdfs文件路径

## 下载HDFS文件
hadoop fs -get [-f] [-p] <src> ... <localdst> //-f 覆盖目标文件 -p 保留访问和修改时间,所有权和权限 下载文件是指hdfs文件下载到本地目录

## 拷贝HDFS文件
hadoop fs -cp [-f] <src> ... <dst> //-f 覆盖目标文件 拷贝只能从hdfs文件目录拷贝到hdfs文件目录

## 删除HDFS文件
hadoop fs -rm -f [URI]
  • hdfs命令(新版本用法)
hdfs dfs [generic options]

## 创建文件夹
hdfs dfs -mkdir [-p] <path> ...  //-p 选项会沿路径创建父目录

## 查看指定目录下的文件
hdfs dfs -ls [-h] [-R] <path>... //-h 人性化显示文件size -R 递归查看指定目录及其子目录

## 上传文件到HDFS指定目录下
hdfs dfs -put [-f] [-p] <localsrc> ... <dst> //-f 覆盖目标文件 -p 保留访问和修改时间,所有权和权限 localsrc 本地文件系统 dst 目标文件系统(hdfs)

## 查看HDFS文件内容
hdfs dfs -cat <src> ... //src 指hdfs文件路径

## 下载HDFS文件
hdfs dfs -get [-f] [-p] <src> ... <localdst> //-f 覆盖目标文件 -p 保留访问和修改时间,所有权和权限 下载文件是指hdfs文件下载到本地目录

## 拷贝HDFS文件
hdfs dfs -cp [-f] <src> ... <dst> //-f 覆盖目标文件 拷贝只能从hdfs文件目录拷贝到hdfs文件目录

## 删除HDFS文件
hdfs dfs -rm -f [URI]

HDFS副本块数量配置

HDFS文件系统的数据安全是依靠多个副本来确保的。可以在hdfs-site.xml中配置如下属性:

 <property>
  <name>dfs.replication</name>
  <value>3</value>
 </property>

一般默认属性是3,无需主动配置,如需自定义这个属性,需要修改每一台的hdfs-site.xml文件,并设置此属性。

  • 除了配置文件外,还可以在上传文件的时候,临时决定上传文件以多少副本存储
hadoop fs -D dfs.replication=2 -put test.txt /tmp
  • 对于已经上传的文件,修改dfs.replication属性不会生效,通过如下命令生效:
hadoop fs -setrep [-R] 2 path  //-R 表示对子目录也生效
  • fsck命令检查文件的副本数
hdfs fsck path [-files [-blocks [-locations]]]
//fsck可以检查指定路径是否正常
//-files可以列出路径内的文件状态
//-files -blocks 输出文件块报告(有几个块,多少副本)
//-files -blocks -locations 输出每一个block的详情

HDFS数据读写流程

写入流程

image.png

  1. 客户端(hadoop fs\hdfs dfs\bigdata tools)向NameNode发起请求
  2. NameNode审核权限,剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址
  3. 客户端向指定的DataNode发送数据包
  4. 被写入数据的DataNode同时完成数据副本的复制工作,将其接收的数据分发给其他DataNode
  5. 如上图,DataNode1复制给DataNode2,然后基于DataNode2复制给DataNode3和DataNode4
  6. 写入完成客户端通知NameNode,NameNode做元数据记录工作

读取流程

image.png

  1. 客户端向NameNode申请读取某文件
  2. NameNode判断客户端权限等细节后,允许读取,并返回此文件的block列表
  3. 客户端拿到block列表后自行寻找DataNode读取即可

分布式计算和调度

数据计算处理逻辑:

  1. 分散->汇总模式 (MapReduce)
    (1)将数据进行分片,多台服务器各负责各自的数据进行处理
    (2)将各自的结果汇总在一起得到结果数据
    2.中心调度->步骤执行模式(Spark、Flink)
    (1)由一个节点作为中心调度管理者
    (2)将任务划分为几个具体步骤
    (3)管理者安排每个机器执行任务
    (4)最终得到结果数据

分布式调度

YARN是Hadoop的一个组件,用来做集群资源(内存、cpu)调度,给MapReduce分配和管理运行资源,所以,MapReduce需要YARN才能执行(普遍情况)
YARN架构:主节点Master(ResourceManager)从节点Slave(NodeManager)
ResourceManager:整个集群的资源调度者,负责协调调度各个程序所需要的资源。 NodeManager:单个服务器的资源调度者,负责调度单个服务器上的资源提供给应用程序使用。

Hadoop YARN分布式资源调度的部署

1. HDFS与YARN调度区别

Hadoop HDFS分布式文件系统

  • NameNode进程作为管理节点
  • DataNode进程作为工作节点
  • SecondaryNamenode作为辅助

Hadoop YARN分布式资源调度

  • ResourceManager进程作为管理节点
  • NodeManager进程作为工作节点
  • ProxyServer、JobHistoryServer这两个作为辅助

而MapReduce分布式计算运行在YARN容器内,无需启动独立进程

2. 集群规划:

主机角色
node1ResourceManager
NodeManager
ProxyServer
JobHistoryServer
node2NodeManager
node3NodeManager

3. 配置文件
(1)MapReduce配置文件
在$HADOOP_HOME/etc/hadoop文件夹内,修改:

  • mapred-env.sh文件,添加如下环境变量
# 设置JDK路径
export JAVA_HOME=/export/server/jdk
# 设置JobHistoryServer进程内存为1G
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000
# 设置日志级别为INFO
export HADOOP_MAPRED_ROOT_LOGGER=INFO,RFA

  • mapred-site.xml文件,添加如下配置文件
<configuration>
 <property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
  <description>MapReduce的运行框架设置为YARN</description>
 </property>

 <property>
  <name>mapreduce.jobhistory.address</name>
  <value>bigdata001:10020</value>
  <description>历史服务器通讯端口为bigdata001:10020</description>
 </property>

 <property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>bigdata001:19888</value>
  <description>历史服务器web端口为bigdata001:19888</description>
 </property>

 <property>
  <name>mapreduce.jobhistory.intermediate.done.dir</name>
  <value>/data/mr-history/tmp</value>
  <description>历史信息在HDFS的记录临时路径</description>
 </property>

 <property>
  <name>mapreduce.jobhistory.done.dir</name>
  <value>/data/mr-history/done</value>
  <description>历史信息在HDFS的记录路径</description>
 </property>

 <property>
  <name>yarn.app.mapreduce.am.env</name>
  <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
  <description>MapReduce HOME设置为HADOOP_HOME</description>
 </property>

 <property>
  <name>mapreduce.map.env</name>
  <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
  <description>MapReduce HOME设置为HADOOP_HOME</description>
 </property>

 <property>
  <name>mapreduce.reduce.env</name>
  <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
  <description>MapReduce HOME设置为HADOOP_HOME</description>
 </property>

</configuration>

(2)YARN配置文件
在$HADOOP_HOME/etc/hadoop文件夹内,修改:

  • yarn-env.sh文件,添加如下环境变量:
# 设置jdk路径
export JAVA_HOME=/export/server/jdk
# 设置Hadoop路径
export HADOOP_HOME=/export/server/hadoop
# 设置配置文件路径
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
# 设置日志文件路径
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
  • yarn-site.xml文件,配置如下:
<configuration>
 <property>
  <name>yarn.resourcemanager.hostname</name>
  <value>bigdata001</value>
  <description>ResourceManager设置在bigdata001节点</description>
 </property>

 <property>
  <name>yarn.nodemanager.local-dirs</name>
  <value>/data/nm-local</value>
  <description>NodeManager中间数据本地存储路径</description>
 </property>

 <property>
  <name>yarn.nodemanager.log-dirs</name>
  <value>/data/nm-log</value>
  <description>NodeManager数据日志本地存储路径</description>
 </property>

 <property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
  <description>MapReduce程序开启Shuffle服务</description>
 </property>

 <property>
  <name>yarn.log.server.url</name>
  <value>http://bigdata001:19888/jobhistory/logs</value>
  <description>历史服务器URL</description>
 </property>

 <property>
  <name>yarn.web-proxy.address</name>
  <value>bigdata001:8090</value>
  <description>代理服务器主机和端口</description>
 </property>

 <property>
  <name>yarn.log.aggregation.enable</name>
  <value>true</value>
  <description>开启日志聚合</description>
 </property>

 <property>
  <name>yarn.nodemanager.remote-app-log-dir</name>
  <value>/tmp/logs</value>
  <description>程序日志HDFS的存储路径</description>
 </property>

 <property>
  <name>yarn.resourcemanager.scheduler.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
  <description>选择公共调度器</description>
 </property>

</configuration>

(3)MapReduce和YARN的配置文件修改好后,分发给其他节点

scp mapred-env.sh mapred-site.xml yarn-env.sh yarn.site.xml bigdata002:`pwd`/
scp mapred-env.sh mapred-site.xml yarn-env.sh yarn.site.xml bigdata003:`pwd`/

4. 启动命令

(1)一键启动或停止YARN集群

$HADOOP_HOME/sbin/start-yarn.sh || $HADOOP_HOME/sbin/stop-yarn.sh<br>
# 会基于yarn-site.xml中配置的yarn.resourcemanager.hostname来决定在哪台机器上启动resourceManager
# 会基于workers文件配置的主机启动NodeManager

(2)在当前机器,单独启动或停止进程

$HADOOP_HOME/bin/yarn --daemon start|stop resourceManager|nodeManager|proxyserver<br>
# start和stop决定启动和停止resourceManager、nodeManager、proxyserver三种进程

(3)历史服务器启动和停止

$HADOOP_HOME/bin/mapred --daemon start|stop historyserver

5. 启动命令

查看YARN的WEB UI界面

6. 模拟执行MapReduce程序到YARN执行

  1. MapReduce示例的代码jar包
$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar
  1. 使用命令提交MapReduce到YARN执行
#hadoop jar 程序文件 java类名 【程序参数】 ... 【程序参数】
例子:
#计算圆周率
hadoop jar hadoop-mapreduce-examples-3.3.4.jar pi 3 10000

#单词计数器
jar hadoop-mapreduce-examples-3.3.4.jar wordcount hdfs://bigdata001:8020/input/wordcount/ hdfs://bigdata001:8020/output/wc1