hadoop生态圈
主要从hdfs底层存储,hbase数据库,hive数据仓库,flume收集,Kafka缓存,zookeeper分布式协调服务,spark大数据分析,sqoop数据互转
hdfs分布式文件系统,高容错的特点,可以部署在廉价的硬件上,设计目标:检查和快速修复硬件故障;流式访问;简化一致性模型,一次写入,多次读取;通信协议建立在TCP/IP协议之上
hive是基于hadoop的数据仓库,用于hadoop文件中的数据集整理,特殊查询,分析存储工具,查询语言是HQL.hive会将HQL语句编译成一组mapreduce任务。
hbase是分布式面向列的开源数据库。不同于一般的关系数据库:适合非结构化数据存储;基于列而不是基于行的模式。hbase表是输送的,用户可以定义各种不同的列。主要用于随机访问,实时读写的大数据。
pig 是一个对大型数据集进行分析评估的平台。
ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现。分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
hdfs和mapreduce是hadoop的两大核心
hdfs上传文件的流程
Client向NameNode发起文件写入的请求。
NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。
Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。
hdfs文件读取流程
Client向namenode发起文件读取请求
namenode返回文件存储的datanode信息
Client读取文件信息
HDFS
采用Master-Slaver模式:
NameNode中心服务器(Master):维护文件系统树、以及整棵树内的文件目录、负责整个数据集群的管理。
DataNode分布在不同的机架上(Slaver):在客户端或者NameNode的调度下,存储并检索数据块,并且定期向NameNode发送所存储的数据块的列表。
客户端与NameNode获取元数据;
与DataNode交互获取数据。
默认情况下,每个DataNode都保存了3个副本,其中两个保存在同一个机架的两个不同的节点上。另一个副本放在不同机架上的节点上。
基本概念
机架:HDFS集群,由分布在多个机架上的大量DataNode组成,不同机架之间节点通过交换机通信,HDFS通过机架感知策略,使NameNode能够确定每个DataNode所属的机架ID,使用副本存放策略,来改进数据的可靠性、可用性和网络带宽的利用率。
数据块(block):HDFS最基本的存储单元,默认为64M,用户可以自行设置大小。
元数据:指HDFS文件系统中,文件和目录的属性信息。HDFS实现时,采用了 镜像文件(Fsimage) + 日志文件(EditLog)的备份机制。文件的镜像文件中内容包括:修改时间、访问时间、数据块大小、组成文件的数据块的存储位置信息。目录的镜像文件内容包括:修改时间、访问控制权限等信息。日志文件记录的是:HDFS的更新操作。
NameNode启动的时候,会将镜像文件和日志文件的内容在内存中合并。把内存中的元数据更新到最新状态。
用户数据:HDFS存储的大部分都是用户数据,以数据块的形式存放在DataNode上。
在HDFS中,NameNode 和 DataNode之间使用TCP协议进行通信。DataNode每3s向NameNode发送一个心跳。每10次心跳后,向NameNode发送一个数据块报告自己的信息,通过这些信息,NameNode能够重建元数据,并确保每个数据块有足够的副本。
NameNode 不需要从磁盘读取 metadata,所有数据都在内存中,硬盘上的只是序列化的结果,只有每次 namenode 启动的时候才会读取。
检查hdfs指定目录下的区块是否正常
hdfs fsck / -locations -blocks -files
dfsadmin 命令用于管理HDFS集群,这些命令常用于管理员。
集群信息状态报告以及集群资源占用情况,以及各数据节点信息
hadoop dfsadmin -report 或者 hdfs dfsadmin -report
添加或删除数据节点
hadoop dfsadmin -refreshNodes 或者 hdfs dfsadmin -refreshNodes
打印网络拓扑
hadoop dfsadmin -printTopology 或者 hdfs dfsadmin -printTopology
- [hadoop@master bin]$ ./hdfs dfsadmin -safemode enter #进入Safemode模式
- [hadoop@master bin]$ ./hdfs dfsadmin -safemode get #获取当前运行模式
- [hadoop@master bin]$ ./hdfs dfsadmin -safemode leave #退出Safemode模式
- [hadoop@master bin]$ hadoop dfsadmin -report #当前hadoop集群状态信息
- [hadoop@master bin]$ ./hdfs dfsadmin -refreshNodes #新增删除节点更新集群信息
- [hadoop@master sbin]$ ./hadoop-daemon.sh stop datanode #停止单个数据节点
- [hadoop@master ~]$ hadoop dfsadmin -printTopology <span style="white-space: pre;"> </span> #打印集群网络拓扑
hbase的数据管理
类似于bigtable的分布式数据库,是一个稀疏的.长期存储的.多维度的排序映射表,表的索引是行关键字,列关键字,时间戳。表是纯字符串,没有类型。用户在表格中存储数据,每一行都有一个可排序的主键和任意多的列。列的字段格式是<family>:<label> ;每个表有一个family集合,相当于表的结构。
hbase把同一个family的数据存储在同一个目录下,hbase写操作是锁行的;数据库每次更新都有一个时间戳,每次都会生成一个新的版本,保留的版本数量可以设定。
hbase主要靠hregion,hmaster.hclient组成的体系结构从整体上管理数据
HBase的服务器体系结构遵循简单的主从服务器架构,它由HRegion服务器(HRegion Server)群和HBase Master服务器(HBase Master Server)构成。HBase Master服务器负责管理所有的HRegion服务器,而HBase中所有的服务器都是通过ZooKeeper来进行协调,并处理HBase服务器运行期间可能遇到的错误。HBase Master Server本身不存储HBase中的任何数据,HBase逻辑上的表可能会被划分为多个HRegion,然后存储到HRegion Server群中,HBase Master Server中存储的是从数据到HRegion Server中的映射。
每台HRegion服务器都会和HMaster服务器通信,HMaster的主要任务就是要告诉每台HRegion服务器它要维护哪些HRegion。
当一台新的HRegion服务器登录到HMaster服务器时,HMaster会告诉它先等待分配数据。而当一台HRegion死机时,HMaster会把它负责的HRegion标记为未分配,然后再把它们分配到其他HRegion服务器中。
HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。
所有的数据库数据一般是保存在Hadoop分布式文件系统上面的,用户通过一系列HRegion服务器来获取这些数据,一台机器上面一般只运行一个HRegion服务器,且每一个区段的HRegion也只会被一个HRegion服务器维护。
当用户需要更新数据的时候,他会被分配到对应的HRegion服务器上提交修改,这些修改显示被写到Hmemcache(内存中的缓存,保存最近更新的数据)缓存和服务器的Hlog(磁盘上面的记录文件,他记录着所有的更新操作)文件里面。在操作写入Hlog之后,commit()调用才会将其返回给客户端。
在读取数据的时候,HRegion服务器会先访问Hmemcache缓存,如果缓存里没有改数据,才会回到Hstores磁盘上面寻找,每一个列族都会有一个HStore集合,每一个HStore集合包含很多HstoreFile文件
当表的大小超过设置值的是偶,HBase会自动地将表划分为不同的区域,每个区域包含所有行的一个子集。对用户来说,每个表是一堆数据的集合,靠主键来区分。从物理上来说,一张表被拆分成了多块,每一块就是一个HRegion。我们用表名+开始/结束主键来区分每一个HRegion,一个HRegion会保存一个表里某段连续的数据,从开始主键到结束主键,一张完整的表是保存在多个HRegion上面的。
宽依赖:父RDD的分区被子RDD的多个分区使用 例如 groupByKey、reduceByKey、sortByKey等操作会产生宽依赖,会产生shuffle
窄依赖:父RDD的每个分区都只被子RDD的一个分区使用 例如map、filter、union等操作会产生窄依赖
-------------------------
hadoop 的集群是基于 master/slave 模式,namenode 和 jobtracker 属于 master,datanode 和 tasktracker属于 slave,master 只有一个,而 slave 有多个。SecondaryNameNode 内存需求和 NameNode 在一个数量级上,所以通常 secondary NameNode(运行在单独的物理机器上)和 NameNode 运行在不同的机器上。
JobTracker 和 TaskTracker
JobTracker 对应于 NameNode
TaskTracker 对应于 DataNode
DataNode 和 NameNode 是针对数据存放来而言的
JobTracker 和 TaskTracker 是对于 MapReduce 执行而言的
mapreduce 中几个主要概念,mapreduce 整体上可以分为这么几条执行线索:
jobclient,JobTracker 与 TaskTracker。
1、JobClient 会在用户端通过 JobClient 类将应用已经配置参数打包成 jar 文件存储到 hdfs,并把路径提交到 Jobtracker,然后由 JobTracker 创建每一个 Task(即 MapTask 和 ReduceTask)并将它们分发到各个 TaskTracker 服务中去执行
2、JobTracker 是一个 master 服务,软件启动之后 JobTracker 接收 Job,负责调度 Job 的每一个子任务 task运行于 TaskTracker 上,并监控它们,如果发现有失败的 task 就重新运行它。一般情况应该把 JobTracker 部署在单独的机器上。
3、TaskTracker 是运行在多个节点上的 slaver 服务。TaskTracker 主动与 JobTracker 通信,接收作业,并负责直接执行每一个任务。TaskTracker 都需要运行在 HDFS 的 DataNode 上
由于大数据面临海量数据,读写数据都需要 io,然后还要冗余数据,hadoop 一般备 3 份数据,所以 IO就会打折扣。因此IO是集群的最大瓶颈
【Active Namenode】:主 Master(只有一个),管理 HDFS 的名称空间,管理数据块映射信息;配置副本策略;处理客户端读写请求
【Secondary NameNode】:NameNode 的热备;定期合并 fsimage 和 fsedits,推送给 NameNode;当 Active NameNode 出现故障时,快速切换为新的 Active NameNode。
【Datanode】:Slave(有多个);存储实际的数据块;执行数据块读 / 写
【Client】:与 NameNode 交互,获取文件位置信息;与 DataNode 交互,读取或者写入数据;管理 HDFS、访问 HDFS。
LSM树全称是基于日志结构的合并树(Log-Structured Merge-Tree)。No-SQL数据库一般采用LSM树作为数据结构,HBase也不例外。众所周知,RDBMS一般采用B+树作为索引的数据结构
LSM树可以看成n层合并树。在HBase中,它把随机写转换成对memstore和hfile的连续写
数据写(插入,更新):数据首先顺序写如hlog (WAL), 然后写到MemStore, 在MemStore中,数据是一个2层B+树(图2中的C0树)。MemStore满了之后,数据会被刷到storefile (hFile),在storefile中,数据是3层B+树(图2中的C1树),并针对顺序磁盘操作进行优化。
数据读:首先搜索MemStore,如果不在MemStore中,则到storefile中寻找。
数据删除:不会去删除磁盘上的数据,而是为数据添加一个删除标记。在随后的major compaction中,被删除的数据和删除标记才会真的被删除。
LSM数据更新只在内存中操作,没有磁盘访问,因此比B+树要快。对于数据读来说,如果读取的是最近访问过的数据,LSM树能减少磁盘访问,提高性能。
Slave 节点要存储数据,磁盘越大,存储的数据量越大,越难恢复
hadoop的进程名称
一个task对应一个线程
jps显示当前所有java进程pid的命令
查看job
[root@host ~]# hadoop job -list
删除job
hadoop job -kill jobid
删除一个目录:
hadoop fs -rmr /tmp/aaa
添加新节点:
hadoop -daemon.sh start datanode
hadoop -daemon.sh start tasktracker
移除一个节点:
hadoop mradmin -refreshnodes
hadoop dfsadmin -refreshnodes
3个datanode中有一个datanode出现错误,这个datanode的数据会在其他的datanode上重新做备份。
namenode 宕机:先分析宕机后的损失,宕机后直接导致client无法访问,内存中的元数据丢失,但是硬盘中的元数据应该还存在,如果只是节点挂了,重启即可,如果是机器挂了,重启机器后看节点是否能重启,不能重启就要找到原因修复了。启用secondary NameNode
# -d 参数判断 $folder 是否存在
if [ ! -d "$folder"]; then
mkdir "$folder"
fi
# -f 参数判断 $file 是否存在
if [ ! -f "$file" ]; then
touch "$file"
fi
在hadoop中文件的压缩好处:少占空间,传输会更快
生产环境中建议使用外部表:
1、因为外部表不会加载数据到hive,减少数据传输、数据还能共享。
2、hive不会修改数据,所以无需担心数据的损坏
3、删除表时,只删除表结构、不删除数据。
Hive里面用什么代替in查询
Hive中的left semi join替换sql中的in操作
HBase的检索支持3种方式:
(1) 通过单个Rowkey访问,即按照某个Rowkey键值进行get操作,这样获取唯一一条记录;
(2) 通过Rowkey的range进行scan,即通过设置startRowKey和endRowKey,在这个范围内进行扫描。这样可以按指定的条件获取一批记录;
(3) 全表扫描,即直接扫描整张表中所有行记录。
数据库的三大范式
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。第二范式(2NF)要求实体的属性完全依赖于主关键字。
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。