Hadoop大数据技术原理与应用
hadoop入门
概念
Hadoop是什么
- 分布式系统基础架构
- 主要解决海量数据的存储和海量数据的分析计算问题
Hadoop发展历史
Hadoop的三大发行版本
- Apache 对于入门学习最好
- Cloudera 内部集成了很多大数据框架 对应产品 CDH
- Hortonworks 文档较好, 对应产品 HDP
Hadoop的优势
- 高可靠性:Hadoop底层维护多个数据副本
- 高扩展性
- 高效性:Hadoop是并行工作的
- 高容错性:能够自动将失败的任务重新分配
Hadoop的组成
- Common(辅助工具)
- HDFS(数据存储)
- NameNode 数据存储在什么位置
- 2NN 辅助NameNode工作,每隔一段时间对NameNode元数据备份
- DataNode 具体存储数据
- YARN(资源调度)
- ResourceManager:整个集群资源(内存、cpu等)的管理者,老大
- NodeManager:单个节点服务器资源的管理者
- ApplicationMaster:单个任务运行的管理者
- Container:容器,相当于一台独立的服务器,里面封装了任务运行所需要的资源
- 客户端可以用多个 可以运行多个ApplicationMaster 每个NodeManager上可以有多个Container
- MapReduce(计算)
- Map阶段并行处理输入数据
- Reduce阶段对Map结果进行汇总
- 三者关系:
Hadoop大数据技术生态体系
- 数据库(结构化数据)Sqoop数据传递
- 文件日志(半结构化数据)Flume日志收集
- 视频、ppt等(非结构化数据)Kafka消息队列
推荐系统案例
环境准备
模板虚拟机的准备
克隆
安装JDK Hadoop
Hadoop生产集群搭建
本地模式
xsync集群分布脚本
需求:循环复制文件到所有节点的相同目录下
实现流程:
在bin 目录下 创建 mkdir bin
cd bin/
vim xsync
#!/bin/bash #1 获取输入参数个数,如果没有参数,直接退出 pcount=$# if [ $pcount -lt 1 ] then echo Not Enough Arguement! exit; fi #2. 遍历集群所有机器 # 也可以采用: # for host in hadoop{102..104}; for host in hadoop102 hadoop103 hadoop104 do echo ==================== $host ==================== #3. 遍历所有目录,挨个发送 for file in $@ do #4 判断文件是否存在 if [ -e $file ] then #5. 获取父目录 pdir=$(cd -P $(dirname $file); pwd) echo pdir=$pdir #6. 获取当前文件的名称 fname=$(basename $file) echo fname=$fname #7. 通过ssh执行命令:在$host主机上递归创建文件夹(如果存在该文件夹) ssh $host "mkdir -p $pdir" #8. 远程同步文件至$host主机的$USER用户的$pdir文件夹下 rsync -av $pdir/$fname $USER@$host:$pdir else echo $file does not exists! fi done done
2. HDFS配置文件 hdfs-site.xml
###### ssh免密登录配置
1. 在.ssh目录下运行 ssh-keygen -t rsa
2. 会产生两个文件一个公钥文件一个密钥文件
3. ssh-copy-id hadoop103..hadoop104 第一次输入密码后续就不需要输入密码
##### 完全分布式集群(开发和面试的重点)
###### 集群配置
1. 集群部署规划
NameNode和SecondaryNamNode不要安装在同一台服务器
ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上
| | Hadoop102 | Hadoop03 | Hadoop04 |
| ---- | ----------------------- | -------------------------------- | ------------------------------- |
| HDFS | NameNode <br />DataNode | DataNode | SecondaryNameNode<br />DataNode |
| YARN | NodeManager | ResourceManager<br />NodeManager | NoddeManager |
2. 配置文件说明
配置文件分为两大类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置时,才需要修改自定义配置文件,更改相应属性值
| 要获取的默认文件 | 文件存放在Hadoop的jar包中的位置 |
| :----------------: | :--------------------------------------------------------: |
| core-default.xml | Hadoop-common-版本号.jar/core-default.xml |
| hdfs-default.xml | Hadoop-hdfs-版本号.jar/hdfs-default.xml |
| yarn-default.xml | Hadoop-yarn-common-版本号.jar/yarn-default.xml |
| mapred-default.xml | Hadoop-mapreduce-client-core-版本号.jar/mapred-default.xml |
3. 配置集群
1. 核心配置文件 配置core-site.xml
```xml
<configuration>
<!-- 指定 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
</configuration>3. YARN配置文件 yarn-site.xml<configuration>
<!-- NameNode web 端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- SecondaryNameNode web 端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>4. MapReduce配置文件 mapred-site.xml<configuration>
<!-- 指定 MR 走 shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 ResourceManager 的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration><configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>在集群上分发配置好的Hadoop配置文件
xsync /opt/module/hadoop-3.1.3/etc/hadoop/
群起集群并测试
配置workers
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
在文件中加入以下配置
hadoop102
hadoop103
hadoop104启动集群
如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode(注意:格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。)
命令 hdfs namenode -format
配置历史服务器
- 配置 mapred-site.xml
只需在mapred-site.xml配置文件加两个参数:
[root@hadoop102 hadoop]$ vim mapred-site.xml
<!-- 历史服务器端地址 --> |
分发配置
[root@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml在 hadoop102 启动历史服务器
先重新启动一下集群,先stop后start
在启用历史服务器 [leokadia@hadoop102 hadoop]$ mapred –daemon start historyserver
配置日志的聚集
配置yarn-site.xml
vim yarm-site.xml
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>分发配置
[leokadia@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
关闭 NodeManager 、ResourceManager 和 HistoryServer
[leokadia@hadoop103 hadoop-3.1.3]$ mapred –daemon stop historyserver
- 启动 NodeManager 、ResourceManage 和 HistoryServer
hadoop集群启动脚本
!/bin/bash |