1.数据分析价值和技术图谱
1.1 数据分析介绍
数据分析是指运用适当的统计分析方法或者工具对收集来的大量数据进行整理和归纳**,将它们加以汇总和理解并消化,提取有价值信息,从中发现因果关系、内部联系和业务规律,以求最大化地开发数据的功能,形成有效结论的过程,发挥数据的**作用
1.2 数据分析的流程
1、明确分析目的和思路/提出假设
2、数据收集
数据库业务数据 + 日志数据 + 公开出版物 + 互联网 + 市场调查
3、数据处理/整理
数据处理是指对收集到的大量数据进行加工、整理,把它变成适合数据分析的样式。
数据处理主要包括:数据清洗、数据转化、数据提取、数据计算等处理方法。
4、数据分析/验证假设
Python的Numpy/Pandas,SPSS/SAS,RDBMS/MySQL/Hive
5、数据展现/可视化图表
柱状图,折线图,散点图,饼图,条形图,雷达图,地图,热力图,气泡图,面积图...
6、报告撰写
三个要求:好的分析框架 + 明确的结论 + 建议/解决方案
1.3 数据分析技术图谱
2. Hadoop
2.1 hadoop介绍
Hadoop 是 Apache 旗下的一套开源软件平台
Hadoop 提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分 布式处理
2.2 hadoop产生背景
Hadoop 最早起源于 Nutch。 Nutch 的设计目标是构建一个大型的全网搜索引擎,包括网 页抓取、索引、查询等功能,但随着抓取网页数量的增加, 遇到了严重的可扩展性问题 ——如何解决数十亿网页的存储和索引问题
2003 年、 2004 年谷歌发表的两篇论文为该问题提供了可行的解决方案 1、 分布式文件系统 GFS,可用于处理海量网页的存储 2、 分布式计算框架 MapReduce,可用于处理海量网页的索引计算问题 3、 分布式数据库 BigTable, 每一张表可以存储上 billions 行和 millions 列
Nutch 的开发人员完成了相应的开源实现 HDFS 和 MapReduce,并从 Nutch 中剥离成为 独立项目 Hadoop,到 2008 年 1 月, Hadoop 成为 Apache 顶级项目,迎来了它的快速发 展期
2.2 hadoop组成(2.x)
- Common(基础功能组件)(工具包, RPC 框架) JNDI 和 RPC
- HDFS(Hadoop Distributed File System 分布式文件系统)
- YARN(Yet Another Resources Negotiator 运算资源调度系统)
- MapReduce(Map 和 Reduce 分布式运算编程框架)
3. HDFS
3.1 hdfs介绍
HDFS: Hadoop Distributed File System Hadoop 分布式文件系统,主要用来解决海量数据的存 储问题
3.2 hdfs核心设计思想
分而治之:将大文件,大批量文件,分布式的存放于大量服务器上。以便于采取分而治 之的方式对海量数据进行运算分析
1、 大文件被切割成小文件,使用分而治之的思想让很多服务器对同一个文件进行联合管理 2、 每个小文件做冗余备份,并且分散存到不同的服务器,做到高可靠不丢失
3.3 hdfs架构
- 主节点 Namenode: 集群老大,掌管文件系统目录树,处理客户端读且请求
- SecondaryNamenode: 严格说并不是 namenode 备份节点,主要给 namenode 分担压力之用
- 从节点 Datanode: 存储整个集群所有数据块,处理真正数据读写
3.4 hdfs实现shell操作
HDFS 支持的其他命令行参数如下:
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] <localsrc> ... <dst>]
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] <path> ...]
[-cp [-f] [-p] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] <path> ...]
[-expunge]
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getmerge [-nl] <src> <localdst>]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touchz <path> ...]
[-usage [cmd ...]]
常用命令参数介绍:
-help
功能:输出这个命令参数手册
[hadoop@hadoop02 ~]$ hadoop -help
[hadoop@hadoop02 ~]$ hadoop fs -help
[hadoop@hadoop02 ~]$ hadoop fs -help ls
-ls
功能:显示目录信息
示例: hadoop fs -ls hdfs://hadoop02:9000/
备注:这些参数中,所有的 hdfs 路径都可以简写成 hadoop fs -ls / 等同上条命令的效果
-mkdir
功能:在 hdfs 上创建目录
示例: hadoop fs -mkdir -p /aa/bb/cc/dd
-put
功能:等同于 copyFromLocal,进行文件上传
示例: hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-get
功能:等同于 copyToLocal,就是从 hdfs 下载文件到本地
示例: hadoop fs -get /aaa/jdk.tar.gz
-getmerge
功能:合并下载多个文件
示例: 比 getmerge 如 hdfs 的目录 /aaa/下有多个文件:log.1, log.2,log.3,...
hadoop fs -getmerge /aaa/log.* ./log.sum
-cp
功能:从 hdfs 的一个路径拷贝 hdfs 的另一个路径
示例: hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-mv
功能:在 hdfs 目录中移动文件
示例: hadoop fs -mv /aaa/jdk.tar.gz /
-rm
功能:删除文件或文件夹
示例: hadoop fs -rm -r /aaa/bbb/
-rmdir
功能:删除空目录
示例: hadoop fs -rmdir /aaa/bbb/ccc
-moveFromLocal
功能:从本地剪切到 hdfs
示例: hadoop fs - moveFromLocal /home/hadoop/a.txt /aa/bb/cc/dd
-moveToLocal
功能:从 hdfs 剪切到本地
示例: hadoop fs - moveToLocal /aa/bb/cc/dd /home/hadoop/a.txt
-copyFromLocal
功能:从本地文件系统中拷贝文件到 hdfs 文件系统去
示例: hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/
-copyToLocal
功能:从 hdfs 拷贝到本地
示例: hadoop fs -copyToLocal /aaa/jdk.tar.gz
-appendToFile
功能:追加一个文件到已经存在的文件末尾
示例: hadoop fs -appendToFile ./hello.txt hdfs://hadoop-server01:9000/hello.txt
可以简写为:
hadoop fs -appendToFile ./hello.txt /hello.txt
-cat
功能:显示文件内容
hadoop fs -cat /hello.txt
-tail
功能:显示一个文件的末尾
示例: hadoop fs -tail /weblog/access_log.1
-text
功能:以字符形式打印一个文件的内容
示例: hadoop fs -text /weblog/access_log.1
-chgrp
-chmod
-chown
功能: linux 文件系统中的用法一样,对文件所属权限
示例:
hadoop fs -chmod 666 /hello.txt
hadoop fs -chown someuser:somegrp /hello.txt
-df
功能:统计文件系统的可用空间信息
示例: hadoop fs -df -h /
-du
功能:统计文件夹的大小信息
示例: hadoop fs -du -s -h /aaa/*
-count
功能:统计一个指定目录下的文件节点数量
示例: hadoop fs -count /aaa/
-setrep
功能:设置 hdfs 中文件的副本数量
示例: hadoop fs -setrep 3 /aaa/jdk.tar.gz
补充:查看 dfs 集群工作状态的命令
hdfs dfsadmin -report
4.HDFS核心设计
4.1 心跳机制
Hadoop 是 Master/Slave 结构,NameNode是Master, DataNode是Slave。
Master 启动的时候会启动一个 IPC(Inter-Process Comunication,进程间通信) server 服 务,等待 slave 的链接。
Slave 启动时,会主动链接 master 的 ipc server 服务,并且每隔 3 秒链接一次 master,这 个间隔时间是可以调整的,参数为 dfs.heartbeat.interval,这个每隔一段时间去连接一次 的机制,我们形象的称为心跳。 Slave 通过心跳汇报自己的信息给 master, master 也通 过心跳给 slave 下达命令。
NameNode 通过心跳得知 Datanode 的状态。
-
如果 master 长时间都没有收到 slave 的心跳,就认为该 slave 挂掉了。
Namenode 感知到 Datanode 掉线死亡的时长计算: HDFS 默认的超时时间为 10 分钟+30 秒。 计算公式为: timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval, 默认的 heartbeat.recheck.interval 大小为 5 分钟,dfs.heartbeat.interval 默认的大小为 3 秒。 需要注意的是 hdfs-site.xml 配置文件中的heartbeat.recheck-interval的单位为毫秒, dfs.heartbeat.interval 的单位为秒 所以,举个例子,如果heartbeat.recheck-interval 设置为 5000(毫秒), dfs.heartbeat.interval 设置为 3(秒,默认),则总的超时时间为 40 秒 <property> <name>heartbeat.recheck-interval</name> <value>5000</value> </property> <property> <name>dfs.heartbeat.interval</name> <value>3</value> </property>
4.2 安全模式
safemode 是 namenode 的一种状态(active/standby/safemode 安全模式)
-
namenode 进入安全模式的原理: namenode 发现集群中的 block 丢失率达到一定比例时(0.1%), namenode 就会进入安全模式,在安全模式下,客户端不能对任何数据进行操作,只能查看元数据信息如 ls/mkdir) 这个丢失率是可以手动配置的,默认是 dfs.namenode.safemode.threshold-pct=0.999f
-
如何退出安全模式? 1、 找到问题所在,进行修复(比如修复宕机的 datanode) 2、 或者可以手动强行退出安全模式(但是并没有真正解决问题)
-
在 hdfs 集群正常冷启动时, namenode 也会在 safemode 状态下维持相当长的一段时间,此 时你不需要去理会,等待它自动退出安全模式即可 正常启动的时候进入安全的原理:
namenode 的内存元数据中,包含文件路径、副本数、 blockid,及每一个 block 所在 datanode 的信息,而 fsimage 中,不包含 block 所在的 datanode 信息,那么,当 namenode 冷启动时,此时内存中的元数据只能从 fsimage 中加载而来,从而就没有 block 所在的 datanode 信息——>就会导致 namenode 认为所有的 block 都已经丢失——>进入安全模式— —>datanode 启动后,会定期向 namenode 汇报自身所持有的 blockid 信息, ——>随着 datanode 陆续启动,从而陆续汇报 block 信息, namenode 就会将内存元数据中的 block 所 在 datanode 信息补全更新——>找到了所有 block 的位置,从而自动退出安全模式 -
安全模式常用操作命令:
hdfs dfsadmin -safemode leave //强制 NameNode 退出安全模式 hdfs dfsadmin -safemode enter //进入安全模式 hdfs dfsadmin -safemode get //查看安全模式状态 hdfs dfsadmin -safemode wait //等待,一直到安全模式结束
4.3 副本存放策略
-
作用 数据分块存储和副本的存放,是保证可靠性和高性能的关键
-
方法 将每个文件的数据进行分块存储, 每一个数据块又保存有多个副本, 这些数据块副本分 布在不同的机器节点上
-
存放说明 在多数情况下, 默认副本的存放策略如下:
- 第一个 副本放在和 所在的 里(如果 不在集群范围内,则这第一个 是随机选取的,系统会尝试不选择哪些太满或者太忙的 )。
- 第二个副本放置在与第一个节点不同的机架中的 中(近乎随机选择,系统会尝试不选 择哪些太满或者太忙的 )。
- 第三个副本和第二个在同一个机架,随机放在不同的 中。
-
修改副本数
-
修改集群文件
<property> <name>dfs.replication</name> <value>1</value> </property> -
命令设置
bin/hadoop fs -setrep -R 1 /
-
4.4 负载均衡
机器与机器之间磁盘利用率不平衡是 HDFS 集群非常容易出现的情况 尤其是在 DataNode 节点出现故障或在现有的集群上增添新的 DataNode 的时候分析数据块 分布和重新均衡 DataNode 上的数据分布的工具
-
命令
sbin/start-balancer.sh sbin/start-balancer.sh -threshold 5 sbin/start-balancer.sh -t 10% 机器容量最高的那个值 和 最低的那个值得差距 不能超过 10% -
自动进行均衡非常慢, 一天能移动的数据量在 10G-10T 的级别,很难满足超大集群的需求 原因: HDFS 集群默认不允许 balance 操作占用很大的网络带宽,这个带宽是可以调整的
hdfs dfsadmin -setBalanacerBandwidth 10485760 该数值的单位是字节,上面的配置是10M/s,默认是1M/s。 -
hdfs-site.xml 配置文件中进行设置
<property> <name>dfs.balance.bandwidthPerSec</name> <value>10485760</value> <description> Specifies the maximum bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second. </description> </property>