案例概述
大数据时代,数以万计用户的互联网服务时时刻刻都在产生着大量交互,以传统的数据技术等其他手段应对数据处理的实时性,有效性的需求
HDFS顺应时代出现,在解决大数据存储和计算方面有很多的优势
大数据定义:
- 指无法在一定时间范围内用常规的软件工具进行捕捉,管理和处理的巨量数据集合
- 需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产数据
大数据的特点:
- 数据体量巨大。按目前的发展趋势看,大数据的体量已经达到PB甚至EB级
- 大数据的数据类型多样,以非结构化数据为主。如:网络日志、音频、视频、图片、地理位置信息、交易数据、社交数据等。
- 价值密度低。有价值的数据仅占到数据总量相当小的一部分。比如一段监控视频中真正有价值的画面可能只有几秒钟。由于价值密度低,所以迅速地完成数据的价值提纯是目前大数据汹涌背景下亟待解决的难题。
- 产生和要求处理速度快。这是大数据区分于传统数据挖掘最显著的特征。
常见的大数据处理系统
名称 | 类型 | 说明 |
---|---|---|
Hadoop | 开源 | Apache 基金会所开发的分布式系统基础架构。 用户可以在不了解分布式底层细节的情况下,开发分布式程序 |
Spark | 开源 | 类似 Hadoop MapReduce 的并行框架 |
Stom | 开源 | 实时的、分布式以及具备高容错的计算系统 |
MongoDB | 开源 | 面向文档的 NoSql 数据库 |
IBM PureData | 商用 | 基于 Hadoop,属于IBM 专家集成系统 PureSystem 家族中的组成部分,主要面向大数据应用 |
Oracle ExaData | 商用 | Oracle 的新一代数据库云服务器 |
SAP Hana | 商用 | 提供高性能的数据查询功能,用户可以直接对大量实 时业务数据进行查询和分析 |
Teradata AsterData | 商用 | 非结构化数据解决方案 |
EMC GreenPlum | 商用 | 采用了大规模并行处理,支持50PB级海量存储与管理 |
HP Vertica | 商用 | 列式大数据分析数据库 |
Hadoop简介
- Hadoop是Apache基金会旗下的分布式系统基础架构
- 用户可以在不了解分布式底层细节的情况下,开发分布式程序
- 充分利用集群的为例进行高速运算和存储
特点
- 高可靠性
- 高拓展性
- 高效性
- 高容错性
- 低成本
- 可构建在廉价机器上
运行模式
- 单机模式(开发场景下)
- 伪分布模式
- 完全分布式模式
框架的核心构成
- 分布式文件系统(HDFS)
- 分布式计算系统(MapReduce)
- 分布式资源管理系统(YARN)
生态圈
分布式文件系统(HDFS)
-
HDFS定义
-
是一个主/从体系架构,以分布式进行存储的分布式文件系统
-
主要负责群集数据的存储与读取
-
-
优缺点
优点 缺点 存储超大文件 不适合低延迟数据访问 标准流式访问 不适合小文件存储 可构建在廉价机器上 不适合并发写入,文件随机修改 -
群集组成
- 一个NameNode节点
- 过个DateNode节点
-
数据写流程
- 客户端向NameNode发出文件写请求,NameNode告诉客户该向哪个DataNode写入文件
- 客户将文件写入该DataNode节点
- DataNode将自动复制数据到其它DataNode节点上,默认3份拷贝
-
数据块(Block)
- HDFS默认最基本的存储单位是数据块
- 默认大小为64MB(有些发行版本为128MB)
-
元数据节点(NameNode)
- 负责管理文件系统的命名空间
- 将所有文件和万恶年假的元数据保存至一个文件系统树中
-
元数据存放目录
- NameNode节点的hadoop/dfs/name/current目录中
- 由hdfs-site.xml中的dfs.namenode.name.dir属性指定
-
包含的文件类型
- fsimage_*、edits_ *、VERSION、…
-
数据节点
- 文件系统中真正存储数据的地方
- 一个文件被拆分成多个数据块后,分别存储至对应的数据节点上
-
数据存储目录
- DateNode节点的hadoop/dfs/data目录中
- 由hdfs-site.xml中的dfs.datanode.data.dir属性指定
-
包含的文件类型
- blk _<id>、blk_ <id>.meta.、…
-
从元数据节点(Secondary NameNode)
- 用于周期性备份NameNode节点上的元数据
- 可以用来恢复NameNode节点,但不能作为备用节点
- 为了防止宕机,通常是将Secondary NameNode和NameNode设置为不同的主机
- 使用hdfs-site.xml中配置的dfs.namenode.secondary.httpaddress属性值可以通过浏览器查看SecondaryNameNode运行状态
分布式计算系统(MapReduce)
-
MapReduce是一个实现了并行计算变成模型,用以进行大数据的计算
-
MapReduce包括
- map(映射):map负责把任务分解成多个任务
- reduce(规约):负责分解后多任务的处理结果进行汇总
-
框架包括
- JopTracke
- 是一个Master 服务,用于作业(Job)的管理和调度工作。个 Hadoop 集群中只有一台 JobTracker。一般情况下,应该把它部署在单独的机器上。JobTracker负责创建、调度作业中的每一个子任务(MapTask或 ReduceTask)运行于 TaskTracker上,并监控它们。如果发现有失败的任务就重新运行它。
- 执行由JobTracker分配的map或reduce任务
- 定期执行Jop Tracker发送的心跳信号,报告自己的状态正在执行的任务进度
- 接受Jop Tracker发送的新任务或种植任务的指令
- 存储中间数据结果,并在必要时进行数据的本地化读取以提高效率
- TaskTracker
- 是运行于多个节点上的 Slave 服务,用于执行任务。TaskTracker 需要运行在 HDFS 的 DataNode 上。
- JopTracke
分布式资源管理系统(YARN)
产生背景
本章实战
IP | 作用 |
---|---|
192.168.10.101 | node1 |
192.168.10.102 | node2 |
192.168.10.103 | node3 |
-
关闭防火墙
setenforce 0 sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config systemctl stop firewalld systemctl disable firewalld
-
为各个节点设置主机名
hostnamectl set-hostname node1 bash hostnamectl set-hostname node2 bash hostnamectl set-hostname node3 bash
-
修改每台主机的hosts文件
vim /etc/hosts 192.168.10.101 node1 192.168.10.102 node2 192.168.10.103 node3
-
创建hdoop用户组和hduser用户
[root@node1 ~]# groupadd hadoop [root@node1 ~]# useradd -g hadoop hduser [root@node1 ~]# passwd hduser
-
为hduser用户授权
gpasswd -a hduser wheel [root@node1 ~]# visudo ##在末尾添加: hduser ALL=(ALL) ALL
-
安装JDK
rpm -ivh jdk-8u171-linux-x64.rpm ##安装完成之后查看 java --version [root@node1 ~]# vim /etc/profile 在末尾添加: export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64 export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$PATH [root@node1 ~]# source /etc/profile
-
配置免密码登录(在node1上配置)
[root@node1 ~]# su - hduser [hduser@node1 ~]$ ssh-keygen -t rsa //一路回车键即可 [hduser@node1 ~]$ ssh-copy-id hduser@node1 [hduser@node1 ~]$ ssh-copy-id hduser@node2 [hduser@node1 ~]$ ssh-copy-id hduser@node3
-
安装Hadoop
-
将hadoop包拷贝到hduser的家目录并解压
##在node1上操作 [hduser@node1 ~]$ tar zxvf hadoop-2.6.5.tar.gz [hduser@node1 ~]$ mv hadoop-2.6.5 hadoop
-
配置hadoop的环境变量
[hduser@node1 ~]$ sudo vim /etc/profile ##在末尾添加: export HADOOP_HOME=/home/hduser/hadoop export PATH=$HADOOP_HOME/bin:$PATH [hduser@node1 ~]$ source /etc/profile
-
配置hadoop-env.sh****文件
[hduser@node1 ~]$ cd ~/hadoop/etc/hadoop/ [hduser@node1 hadoop]$ vim hadoop-env.sh 在末尾添加: export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
-
修改yarn-env.sh文件
[hduser@node1 hadoop]$ vim yarn-env.sh 在末尾添加 export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
-
修改slaves文件
[hduser@node1 hadoop]$ vim slaves ##清空文件中原有的内容 node2 node3
-
编辑core-site.xml文件
[hduser@node1 hadoop]$ vim core-site.xml ##在末尾找到<configuration>模块 ##在里面添加配置: <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://node1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/home/hduser/hadoop/tmp</value> </property> </configuration>
-
编辑hdfs-site.xml文件
[hduser@node1 hadoop]$ vim hdfs-site.xml ##在末尾找到<configuration>模块 ##在里面添加: <configuration> <property><name>dfs.namenode.secondary.http-address</name><value>node1:50090</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/home/hduser/hadoop/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/home/hduser/hadoop/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>
备注:
名称节点和数据节点的存放位置,文件副本数和读取权限。
-
修改mapred-site.xml文件
[hduser@node1 hadoop]$ cp mapred-site.xml.template mapred-site.xml [hduser@node1 hadoop]$ vim mapred-site.xml ##在末尾找到<configuration>模块,在里面添加: <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>node1:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>node1:19888</value> </property> </configuration>
备注:Mapreduce作业记录的web地址和端口
-
修改yarn-site.xml文件
[hduser@node1 hadoop]$ vim yarn-site.xml <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> </property> <property> <name>yarn.resourcemanager.address</name> <value>node1:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>node1:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>node1:8035</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>node1:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>node1:8088</value> </property> </configuration>
备注:
resourcemanager、nodemanager的通信端口,web端口等信息
-
将hadoop目录拷贝到其他节点上
[root@node1 ~]#scp -r /home/hduser/hadoop node2:/home/hduser [root@node1 ~]#scp -r /home/hduser/hadoop node3:/home/hduser
-
-
验证安装配置
-
在 Master 主机(node1)上格式化 NameNode
[hduser@node1 ~]$ cd hadoop/ [hduser@node1 hadoop]$ bin/hdfs namenode -format [hduser@node1 hadoop]$ sbin/start-dfs.sh
-
查看进程
[hduser@node1 hadoop]$ jps ##16721 Jps ##15687 NameNode ##15866 SecondaryNameNode
-
启动yarn
[hduser@node1 hadoop]$ sbin/start-yarn.sh
-
查看集群环境
[hduser@node1 hadoop]$ bin/hdfs dfsadmin -report
-
浏览器查看 HDFS 运行状态:
http://192.168.10.101:50070
-
-
运行 Hadoop 的 WordCount 程序
-
创建测试文件的目录
[hduser@node1 ~]$ mkdir ~/file
-
编辑测试文件
[hduser@node1 ~]$ cd ~/file/ [hduser@node1 file]$ echo "ni hao hadoop">file1.txt [hduser@node1 file]$ echo "hello hadoop hi china">file2.txt
-
启动hadoop并 创建hdfs目录
[hduser@node1 file]$ cd ~/hadoop/ [hduser@node1 hadoop]$ sbin/start-all.sh [hduser@node1 hadoop]$ bin/hadoop fs -mkdir /input2
-
将file1和file2拷贝到hdfs存储目录中
[hduser@node1 hadoop]$ bin/hadoop fs -put ~/file/file* /input2/ [hduser@node1 hadoop]$ bin/hadoop fs -ls /input2/
-
执行WordCount程序,对文件进行统计
[hduser@node1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar wordcount /input2/ /output2/wordcount1
注意:输出目录不能已存在,否则不会输出
-
查看执行结果
[hduser@node1 hadoop]$ bin/hadoop fs -cat /output2/wordcount1/*
如果看到输出结果证明hadoop安装成功
-