大数据相关常识

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)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

 

猜你喜欢

转载自www.cnblogs.com/playforever/p/9182045.html