1.大数据的由来
随着计算机技术的发展,互联网的普及,信息的积累已经到了一个非常庞大的地步,信息的增长也在不断的加快,随着互联网,物联网建设的加快,信息更是爆炸式增长,收集检索,统计这些信息越发困难,传统的数据库结构难以应对这种变化,必须使用新的技术来解决这些问题
2.什么是大数据
-大数据指无法在一定时间范围内用常规工具进行捕捉,管理和处理的数据集合
-大数据需要新处理模式才能具有更强的决策力,洞察发现力和流程优化能力的海量,高增长率和多样化的信息资产
-大数据是指从各种各样类型的数据中,快速获取有价值的信息
3.大数据能做什么
-企业组织利用相关数据分析帮助他们降低成本,提高效率,开发新产品,做出更明智的业务决策等
-把数据集合并进行分析得出的信息和数据关系性,用来察觉商业趋势,判定研究质量,避免疾病扩散,打击犯罪或测定即使交通路况等
-大规模并行处理数据库,数据挖掘电网,分布式文件系统或数据库,云计算平和可扩展的存储系统
4.大数据特性
-Volume大体量
可从数百TB到数十数百PB,甚至是EB的规模
-Variety多样性
大数据包括各种各样格式和形态的数据
-Velocity时效性
很多大数据需要在一定的时间限度下得到及时处理
-Veracity准确性
处理的结果要确保一定的准确性
-Value大价值
大数据包含很多深度的价值,大数据分析挖掘和利用将带来巨大的商业价值
5.大数据与Hadoop
hadoop是什么
-hadoop是一种分析和处理海量数据的软件平台
-Hadoop是一款开源软件,使用JAVA开发
-Hadoop可以提供一个分布式基础架构
-具有高可靠性,高扩展性,高效性,高容错性,低成本
6.Hadoop起源
2003年Google陆续发布了3篇论文,分别是GFS,MapReduce,BigTable.此三大技术被成为Google的三驾马车,虽然没有公布源码,但发布了这三个产品的详细设计论
GFS:
GFS是一个可扩展的分布式文件系统,用于大型的,分布式的,对大量数据进行访问的应用,可以运行与廉价的普通硬件上,提供容错功能
MapReduce:
MapReduce是针对分布式平行计算的一套编程模型,由Map和Reduce组成,Map是映射,把指令分发到多个worker上,Reduce是规约,把worker计算出的结果合并
BigTable:
Bigtable是存储结构化数据,建立与GFS,Scheduler,Lock Service和MapReduce上
7.Hadhoop和Google的关系
Hadoop是Yahoo公司资助开发的,基于Google的三篇论文,使用Java开发,但是在性能上要比Google差很多,但是开源啊,老百姓都可以用,所以渐渐的就成为一种大数据的主流工具,后来Google开发的大数据工具也妥协了,选择兼容Hadoop
Hadoop是基于Google的三篇论文开发出来的,也有三大支撑技术,HDFS,MapReduce,Hbase
Hadoop与Google三篇论文的关系:
GFS-->HDFS
MapReduce-->MapReduce
BigTable-->Hbase
7.Hadoop常用组件
HDFS:Hadoop分布式文件系统(核心)
MapReduce:分布式计算框架(核心)
Yarn:集群资源管理系统(核心)
Zookeeper:分布式协作服务
Hbase:分布式列存数据库
Hive:基于Hadoop的数据仓库
Sqoop:数据同步工具
Pig:基于Hadoop的数据流系统
Mahout:数据挖掘算法库
Flume:日志收集工具
8.再来看看MapReduce,Yarn,HDFS之间的关系
HDFS分布式文件系统作为存储节点,Yarn管理存储在HDFS文件系统上的数据资源,MapReduce是一套程序,用于计算并整合数据资源
9.细谈HDFS
Hadoop集群其实就是HDFS集群,说到HDFS,下面来谈谈什么是HDFS
HDFS:其实就是个文件系统,和fastDFS类似,像百度云,阿里云等就是个文件存储系统,当然一般如果仅仅是为了用来存储文件的话直接fastDFS这个就已经够了,HDFS目的不单单是用来存储文件这么简单,它还涉及分布式计算等。
HDFS分布式系统有NameNode和DataNode,NameNode是整个文件系统目录,基于内存存储,存储的是一些文件的详细信息,比如文件名、文件大小、创建时间、文件位置等。Datanode是文件的数据信息,也就是文件本身,不过是分割后的小文件。上面图已经有做了介绍了,这里就不再赘述了。
角色:
-Client
切分文件,访问HDFS,与Namenode交互,获取文件位置信息,与DataNode交互,读取和写入数据
-Namenode
Master节点管理HDFS的名称空间和数据块映射信息,配置副本策略,处理所有客户端请求
-Secondarynode
定期合并fsimage和fsedits,推送给NameNode,紧急情况下可以协助恢复NameNode
-Datanode
数据存储节点,存储实际的数据,汇报存储信息给NameNode
HDFS工作原理,用文字有点难以表达,那么我就直接画个图吧:
观看顺序:
1)看主节点Namenode
它的首要作用就是分割大文件,将分割后的文件放到子节点datanode(假设为小文件*n),且记录第n个小文件的block_id(用于确认存放在哪个子节点上.并且备份子节点数-1份数据到其他子节点上
可以将其看做书本的目录,把一篇文章分为n个小节,记录页码
核心作用:分割 备份 定位
2)再看子节点datanode
主机点通过与子节点建立心跳确认子节点状态,若子节点宕机,则将自身的数据复制到其他节点
10.细谈Yarn
Yarn是一种新的 Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
Yarn角色:
-ResourceManager
处理客户端请求,启动/监控ApplicationMaster,监控NodeManager,资源分配与调度
-NodeManager
单个节点上的资源管理,处理来自ResourceManager的命令,处理来自ApplicationMaster的命令
-ApplicationMaster
数据切分,为应用程序申请资源,并分配给内部任务,任务监控与容错
-Container
对任务运行环境的抽象,封装了CPU,内存等,多维资源以及环境变量,启动命令等任务运行相关的信息资源分配与调度
-Client
用户与Yarn交互的客户端程序,提交应用程序,监控应用程序的状态,杀死应用程序等
11.细谈MapReduce
MapReduce角色与结构:
-JobTracker
Master节点只有一个,管理所有作业/任务的监控,错误处理等,将任务分解成一系列任务,并派发给TaskTracker
-TaskTracker
Slave节点,一般是多台,运行Map Task和Reduce Task,与JobTracker交互,汇报任务状态
-Map Task
解析每条数据记录,传递给用户编写的map()并执行,将输出结构写入本地磁盘,如果map-only作业,直接写入HDFS
-Reducer Task
从Map Task的执行结果中,远程读取输入数据,对数据进行排序,将数据按照分组传递给用户编写的reduce函数执行
Mapreduce工作原理:
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
弄懂MarReduce的关键在与弄懂Map函数和Reduce函数
Map将会生成一组键值对,以单个字符串作为键名,以1作为值
Reduce会归约Map生成的键值对,将相同键名的key归约在一起,将值累加,最终的得出某个键的总个数
map函数和Reduce函数是需要手动干预编写的,自己定义规则,以何种形式统计出数据就是大数据的核心,下图是使用wordcount方式统计字符串出现的个数
Mapreduce工作原理如下图:
MapReduce所编写好的程序将跑在各个DataNode上,这里有个概念就是计算向数据移动,也就是DataNode的数据文件存储在这里,我的程序发送到DataNode节点上去读取数据和分析数据就好了。期间会有出现各个DataNode之间进行数据发送,比如说节点DataNode1进行这台机读取数据时进行shuffle时需要把相同的key作为一组调用一次reduce,那么如果这时当然会有一些同key的在其他节点DataNode上的,所以就需要进行数据传送。Input这里的wordcount.txt就是DataNode上的文件数据。Split阶段是MapReduce一定会执行的,这是它的规则,而map阶段就是我们必须进行手动干预的,也就是编码对数据进行分析,分析成map文件,然后再shuffle阶段中自发进行数据派送,规则是以同样的key为一组调用reduce阶段进行数据压缩,reduce也是进行手动干预的,我们编码进行数据计算,计算同key的个数,统计完后就可以输出一个文件出来了,这整个过程数据的传输都是放在context这个上下文中。下面是借鉴网上的一张图,HDFS与MapReduce之间的关系协助大概就是这么个意思。
12.Hadoop生态系统
1.hadoop的部署有三种模式
-单机
-伪分布式
-完全分布式
2.Hadoop单机模式安装与使用
需要安装JDK,并且配置Java环境
1)安装java环境
- [root@nn01 ~]# yum -y install java-1.8.0-openjdk-devel #安装1.8以上的都可以
- [root@nn01 ~]# java -version
- openjdk version "1.8.0_131"
- OpenJDK Runtime Environment (build 1.8.0_131-b12)
- OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
- [root@nn01 ~]# jps
- 1235 Jps
2)安装hadoop
安装hadoop需要用到几个包,可以到我的github上下载
[hadoop相关软件]https://github.com/ck784101777/hadoop
- [root@nn01 ~]# cd hadoop/
- [root@nn01 hadoop]# ls //本例需要hadoop-2.7.7.tar.gz
- hadoop-2.7.7.tar.gz kafka_2.12-2.1.0.tgz zookeeper-3.4.13.tar.gz
- [root@nn01 hadoop]# tar -xf hadoop-2.7.7.tar.gz
- [root@nn01 hadoop]# mv hadoop-2.7.7 /usr/local/hadoop #无需安装直接放到目录下
- [root@nn01 hadoop]# cd /usr/local/hadoop
- [root@nn01 hadoop]# ls
- bin include libexec NOTICE.txt sbin
- etc lib LICENSE.txt README.txt share
- [root@nn01 hadoop]# ./bin/hadoop //启动报错,JAVA_HOME没有找到
- Error: JAVA_HOME is not set and could not be found.
- [root@nn01 hadoop]#
3)解决报错问题
报错原因是没有配置好JAVA_HOME环境,默认是${JAVA....},修改如下
- [root@nn01 hadoop]# rpm -ql java-1.8.0-openjdk
- /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre/bin/policytool
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre/lib/amd64/libawt_xawt.so- [root@nn01 hadoop]# cd ./etc/hadoop/
- [root@nn01 hadoop]# vim hadoop-env.sh #25代表行数,set nu 查看行数
- 25 export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64 /jre"
- 33 export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"
4)初次使用hadoop
本例将使用hadoop的wordcount(统计词频)来统计单个文件中每个字符串出现的次数
格式:
./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount 被统计目录或文件 输出目录
- [root@nn01 ~]# cd /usr/local/hadoop/
- [root@nn01 hadoop]# ./bin/hadoop #再次执行不报错
- Usage: hadoop [--config confdir] [COMMAND | CLASSNAME]
- CLASSNAME run the class named CLASSNAME
- .......
- [root@nn01 hadoop]# mkdir /usr/local/hadoop/input #创建一个目录
- [root@nn01 hadoop]# ls
- bin etc include lib libexec LICENSE.txt NOTICE.txt input README.txt sbin share
- [root@nn01 hadoop]# cp *.txt /usr/local/hadoop/input
- [root@nn01 hadoop]# ./bin/hadoop jar \
- share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount input output
- //wordcount为参数 统计input这个文件夹,存到output这个文件里面(这个文件不能存在,要是存在会报错,是为了防止数据覆盖)
- [root@nn01 hadoop]# cat output/part-r-00000 //查看
- [root@nn01 output]# cat part-r-00000 #字符串 个数
""AS 2
"AS 17
"COPYRIGHTS 1
"Contribution" 2
"Contributor" 2
"Derivative 1
"GCC 1
"Legal 1
"License" 1
"License"); 2
"Licensed 1
"Licensor" 1
伪分布式的配置和完全分布式配置类似,区别在与所有角色安装在一台机器上(Client,NameNode,Secondary NameNode)使用本地磁盘,一般生产环境都会使用完全分布式,伪分布式用来学习和测试Hadoop的功能
根据HDFS分布式文件架构图,我们需要至少4台主机,一台NameNode(Secondary NameNode),3台DataNode
整个流程如下:
-配置运行环境,四台主机
-配置域名解析
-在所有主机上安装JDK,JAVA环境
-主节点生成秘钥并发送到各个节点机,可以免密访问四个节点
-安装部署Hadoop,NameNode与DataNode
-修改配置文件slave
-修改配置文件core-site.xml
-修改配置文件hdfs-site.xml
-格式化分区
-测试
1)三台机器配置主机名为node1、node2、node3,配置ip地址(ip如图-1所示),yum源(系统源)
2)编辑/etc/hosts(四台主机同样操作,以nn01为例)
配置hosts,使他们可以通过主机名通信
- [root@nn01 ~]# vim /etc/hosts
- 192.168.1.60 nn01
- 192.168.1.61 node1
- 192.168.1.62 node2
- 192.168.1.63 node3
3)安装java环境,在node1,node2,node3上面操作(以node1为例)
- [root@node1 ~]# yum -y install java-1.8.0-openjdk-devel
4)布置SSH信任关系
在DataNode上生成密钥对发送给各个节点
- [root@nn01 ~]# vim /etc/ssh/ssh_config //第一次登陆不需要输入yes
- Host *
- GSSAPIAuthentication yes
- StrictHostKeyChecking no
- [root@nn01 .ssh]# ssh-keygen
- [root@nn01 .ssh]# for i in 61 62 63 64 ; do ssh-copy-id 192.168.1.$i; done
- //部署公钥给nn01,node1,node2,node3
5)测试信任关系
无需密码登录证明建立了信任关系
- [root@nn01 .ssh]# ssh node1
- Last login: Fri Sep 7 16:52:00 2018 from 192.168.1.60
- [root@node1 ~]# exit
- logout
- Connection to node1 closed.
- [root@nn01 .ssh]# ssh node2
- Last login: Fri Sep 7 16:52:05 2018 from 192.168.1.60
- [root@node2 ~]# exit
- logout
- Connection to node2 closed.
- [root@nn01 .ssh]# ssh node3
环境配置文件:hadoop-env.sh
核心配置文件:core-site.xml
HDFS配置文件:hdfs-site.xml
节点配置文件:slaves
安装hadoop在第二节有介绍
1)修改slaves文件
在DataNode上修改
- [root@nn01 ~]# cd /usr/local/hadoop/etc/hadoop
- [root@nn01 hadoop]# vim slaves
- node1
- node2
- node3
2)hadoop的核心配置文件core-site
fs.defaultFS:文件系统配置参数
hadoop.tmp.dir:数据目录配置参数
- [root@nn01 hadoop]# vim core-site.xml
fs.defaultFS hdfs://nn01:9000 #hdfs://自定义命名hadoop.tmp.dir /var/hadoop #保存hadoop文件的目录- [root@nn01 hadoop]# mkdir /var/hadoop //hadoop的数据根目录
3)配置hdfs-site文件
定义NameNode和SecondNode,在一台主机上,从节点设置3台
- [root@nn01 hadoop]# vim hdfs-site.xml
dfs.namenode.http-address nn01:50070 dfs.namenode.secondary.http-address nn01:50090 dfs.replication 2
4)同步配置到node1,node2,node3
使用rsync命令将hadoop同步到节点机上
- [root@nn01 hadoop]# for i in 62 63 64 ; do rsync -aSH --delete /usr/local/hadoop/
- \ 192.168.1.$i:/usr/local/hadoop/ -e 'ssh' & done
- [1] 23260
- [2] 23261
- [3] 23262
5)查看是否同步成功
- [root@nn01 hadoop]# ssh node1 ls /usr/local/hadoop/
- .............
格式化namenode,验证是否存在角色,查看集群是否创建成功,有多少个节点
- [root@nn01 hadoop]# cd /usr/local/hadoop/
- [root@nn01 hadoop]# ./bin/hdfs namenode -format //格式化 namenode
- [root@nn01 hadoop]# ./sbin/start-dfs.sh //启动
- [root@nn01 hadoop]# jps //验证角色
- 23408 NameNode
- 23700 Jps
- 23591 SecondaryNameNode
- [root@nn01 hadoop]# ./bin/hdfs dfsadmin -report //查看集群是否组建成功
- Live datanodes (3): //有三个角色成功