第2章 大数据处理架构Hadoop
Hadoop这个名字不是一个缩写,它是一个虚构的名字。该项目的创建者,Doug Cutting解释Hadoop的得名 :“这个名字是我孩子给一个棕黄色的大象玩具命名的。我的命名标准就是简短,容易发音和拼写,没有太多的意义,并且不会被用于别处。小孩子恰恰是这方面的高手”。Hadoop的logo如下。
目前,Hadoop是Apache软件基金会旗下的一个开源分布式存储与计算平台。用户利用Hadoop可以轻松的组织计算机资源,搭建自己的分布式计算平台,充分利用集群的计算和存储能力,完成海量数据的处理。该平台使用Java实现,具有良好的可移植性。Hadoop的核心包含两个部分:
HDFS的高容错性、高伸缩性等优点允许用户将Hadoop部署在低廉的硬件上,形成分布式系统。MapReduce分布式编程模型允许用户在不了解分布式系统底层细节的情况下开发并行应用程序。简单的说,Hadoop是一个能够对大量数据进行分布式处理的软件框架,并且是以一种可靠、高效、可伸缩的方式进行处理的,那它具有哪些特性呢?
Hadoop除了其核心的MapReduce和HDFS之外,还包含了很多不可或缺的周边项目。具体介绍如下:
运行在YARN之上的下一代Hadoop查询处理框架 |
Hadoop上的非关系型的分布式数据库 |
一个基于Hadoop的大规模数据分析平台,提供类似SQL的查询语言Pig Latin |
用于在Hadoop与传统数据库之间进行数据传递 |
Hadoop上的工作流管理系统 |
提供分布式协调一致性服务 |
一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统 |
Hadoop快速部署工具,支持Apache Hadoop集群的供应、管理和监控 |
一种高吞吐量的分布式发布订阅消息系统,可以处理消费者规模的网站中的所有动作流数据 |
从前面的内容我们了解到Hadoop是使用计算机集群进行分布式大数据处理的框架,那么这些众多的计算机应该要怎么管理呢?Hadoop使用主从结构,来了解两个概念:
NameNode,主节点,只有一个,负责:
DataNodes,从节点,有很多个,负责:
3) 为保证数据安全,文件会有多个副本
下面将分别介绍两个核心项目MapReduce和HDFS的体系架构。
在Hadoop中,一个文件会被划分成大小固定的多个文件块,分布的存储在集群中的节点中,比如文件a.txt大小600G要存入到HDFS,当前HDFS具有一个NameNode和多个DataNodes,如下图所示。
同一个文件块在不同的节点中有多个副本。
而此时我们需要一个集中的地方保存文件的分块信息,这个地方就是NameNode。如下。
MapReduce是一种编程模型,用于大规模数据集的并行计算,同样也分为主节点和从节点。
JobTracker,主节点,只有一个,负责:
TaskTrackers,从节点,只有一个,负责:
求出以下数组当中最大的数
如果使用MapReduce进行上述计算:将数组分为四个小数组,每个数组里面包含三个数,分别对这四个数组进行比较计算,求取每个数组的最大值,对得到的最大值再次进行比较计算,最终得出原来数组的最大值。
Hadoop集群具体来说包含两个集群:HDFS集群和Yarn集群,两者逻辑上分离,但物理上常在一起。
Yarn集群负责海量数据运算时的资源调度,集群中的角色主要有:
那MapReduce是什么呢?它其实是一个分布式运算编程框架,是应用程序开发包,由用户按照编程规范进行程序开发,然后打包运行在HDFS集群上,并且受到Yarn集群的资源调度管理。
(1)单机模式:仅一个机器运行一个Java进程,主要用于调试。
(2)伪分布式:主节点和从节点都运行在同一台机器上,主要用于调试
(3)完全分布式:也称集群模式,主要用于生产环境部署。会使用N台主机组成一个Hadoop集群。这种部署模式下,主节点和从节点会分开部署在不同的机器上。
在本案例中,我们将以3节点为例进行完全分布式搭建,角色分配如下:
1. 创建新的虚拟机并配置
由于部署的过程中IP的变动会导致部署过程变得很麻烦,所以在这里我们进行IP地址的手动设置。
设置里面网络连接更改为vmnet8
如果可以点击更改设置,一定要先点击,否则改不了。
从该窗口可以获得本电脑虚拟机的子网ip段,与子网掩码。点击NAT设置,查看网关
电脑网关为192.168.32.2 (通常第三组 每台电脑不同,第四组都是2)
点击取消,关闭虚拟网络编辑器。
进入后 出现 配置页面
命令模式 (在非插入模式输入:)
- 在最后添加 (//后的内容为注释)
命令行修改固定IP完成。
更改jdk目录名,方便后续使用
在主机关闭的情况下选择克隆,如下图。
另外两台主机进行同样的设置,注意修改主机名。
免密登陆主要用于主节点免密访问从节点。
首先生成公私钥,在01node窗口输入:
执行完这个命令后,会生成id_rsa(私钥)、id_rsa.pub(公钥)
将公钥拷贝到要免密登陆的目标机器上,以03node为例。在01node命令窗口输入以下命令:
注意:要给本机拷贝一份,即要使01node能免密登录01node
验证是否设置成功,在01node访问03node:
#ssh 03node 若无需输入密码可直接登录则设置成功
如下所示表示03node登录成功,要想退出登录输入exit即可。
修改hadoop目录名称:
添加内容如下:
9. 使用scp命令同步到其他节点(同步后如果修改一个配置文件,记得修改其他配置文件)
-r:递归,表示文件夹下所有文件
同样拷贝jdk到其他节点
注:关于hadoop的配置文件
如果用户没有更改 那么这里面的选项将会生效
site中配置选项优先级>default中的,如果有配置的话就会覆盖默认的配置选项
注意:首次启动hdfs时,必须对其进行格式化操作。本质上是一些清理和准备工作,因为此时的hdfs在物理上还是不存在的。
关于hdfs的格式化:
首次启动需要进行格式化
格式化本质是进行文件系统的初始化操作 创建一些自己所需要的文件
格式化之后 集群启动成功 后续再也不要进行格式化
格式化的操作在hdfs集群的主角色(NameNode)所在的机器上操作
从usr/local/hadoop/hadoop_tmp/dfs/name/current/下面的version文件中可以查看集群id,格式化时生产的,并且再次格式化会重新生产一个id,所以格式化一次就好,多次格式化会造成启动不成功。
使用jps命令查看节点java进程,判断是否启动成功
一旦hadoop集群启动并运行,可以通过web-ui进行集群查看,如下所述:
访问不到的可以把主机名换成对应IP地址,如在本案例中是:
本文致力于从架构原理、集群部署、性能优化与使用技巧等方面,阐述在如何基于HBase构建 容纳大规模数据、支撑高并发、毫秒响应、稳定高效的OLTP实时系统 。
scan请求,rowkey前缀维度散列后,后续维度依照查询顺序或者权重拼接(视具体情况决定是否散列处理)。
预分区需要通过评估整体表数据量来确认,当前hbase集群region块大小为30G。
服务端配置完成之后,如何更好的使用HBase集群也需要花点心思测试与调整。
以Spark作为HBase读写客户端为例。
Spark有对应的API可以批量读取HBase数据,但是使用过程比较繁琐,这里安利一个小组件,批量读取HBase的代码可以这么简单:
那么HBase Connection每条数据创建一次肯定是不允许的,效率太低,对服务压力比较大,并且ZK的连接数会暴增影响服务。
比较可行的方案是每个批次创建一个链接(类似foreachPartiton中每个分区创建一个链接,分区中数据共享链接)。但是这种方案也会造成部分连接浪费、效率低下等。
如果可以做到一个Streaming中所有批次、所有数据始终复用一个连接池是最理想的状态。
Spark中提供了Broadcast这个重要工具可以帮我们实现这个想法,只要将创建的HBase Connection广播出去所有节点就都能复用,但是真实运行代码时你会发现HBase Connection是不可序列化的对象,无法广播。。。
其实利用scala的lazy关键字可以绕个弯子来实现:
在Driver程序中实例化该对象并广播,在各个节点中取广播变量的value进行使用。
广播变量只在具体调用value的时候才会去创建对象并copy到各个节点,而这个时候被序列化的对象其实是外层的HBaseSink,当在各个节点上具体调用connection进行操作的时候,Connection才会被真正创建(在当前节点上),从而绕过了HBase Connection无法序列化的情况(同理也可以推导RedisSink、MySQLSink等)。
这里边其实对HBase Client的Put接口包装了一层,但是当线上有大量实时请求,同时线下又有大量数据需要更新时,直接这么写会对线上的服务造成冲击,具体表现可能为持续一段时间的短暂延迟,严重的甚至可能会把RS节点整挂。
大量写入的数据带来具体大GC开销,整个RS的活动都被阻塞了,当ZK来监测心跳时发现无响应就将该节点列入宕机名单,而GC完成后RS发现自己“被死亡”了,那么就干脆自杀,这就是HBase的“朱丽叶死亡”。
这种场景下,使用bulkload是最安全、快速的,唯一的缺点是带来的IO比较高。
大批量写入更新的操作,建议使用bulkload工具来实现。
理同实时查询,可以使用创建的Connection做任何操作。
我们从HBase的架构原理出发,接触了HBase大部分的核心知识点。
理论基础决定上层建筑,有了对HBase的总体认知,在后续的集群部署、性能优化以及实际应用中都能够比较游刃有余。
知其然而之所以然,保持对技术原理的探索,不仅能学习到其中许多令人惊叹的设计与操作,最重要的是能够真正在业务应用中充分发挥其应有的性能。
用Python做数据分析光是掌握numpy和matplotlib可不够,Pandas是必须要掌握的一个重点,numpy虽然能够帮我们处理处理数值型数据,但是这还不够,很多时候,我们的数据除了数值之外,还有字符串,还有时间序列等,比如:我们通过爬虫获取到了存储在数据库中的数据。
今天来分享一些Pandas必会的用法,让你的数据分析水平更上一层楼。
查看数据的信息,包括每个字段的名称、非空数量、字段的数据类型 |
返回一个同样长度的值为布尔型的对象(Series或DataFrame),表示哪些值是缺失的 |
举例:查看数据表基本信息(维度、列名称、数据格式等等)
用新的数据替换老的数据,如果希望一次性替换多个值,old和new可以是列表。默认会返回一个新的对象,传入inplace=True可以对现有对象进行就地修改。 |
判断各行是否是重复行,返回一个布尔型Series。 |
删除重复行,返回删除后的DataFrame对象。 |
举例:删除后出现的重复值:
文章中总结的是都是一些Pandas常用的方法,至于一些基础的概念还需要你学到Pandas的时候去理解,例如Series是什么?DataFrame是什么?如果你已经清楚了Pandas的这些基础东西之后,搭配上文章中的这些方法,那你用Pandas去做数据处理和分析必然会游刃有余。