一 Hadoop
主要包括HDFS 和Yarn,Common
对于HDFS ,要熟悉基本的文件操作,shell命令hadoop fs -ls / hadoop fs -copyFromLocal path1 path2等
对于javaAPI ,熟悉FileSystem hdfs=FileSystem.get(conf) FileStatus
HDFS的NameNode 和SecondNameNode ,DataNode 的各个作用。
NameNode 文件的命名空间管理,读写文件之前都要向他询问,保存文件的元数据,即文件名与数据块。接受DataNode心跳响应,以及传递的数据块&&DataNode 的位置的信息。
SecondNameNode 并不是NameNode的热备份,他合并NameNode的fsimage和editLog,合成一个新的editLog,减轻内存的占用
在HA中,分为Active NameNode 和StandardBy NameNode 通过共享editLog 双方都及时的共享信息,配有故障转移,且都向ZK注册
因为HDFS是三备份的,数据根据通过机架感知效应,分配的合理,尽量将计算在本地进行或者距离数据较近的机器上进行,减少网络传输的消耗。
在网络上传输用的是RPC,类似于架构层次的协议,就是把某些接口以及接口中的方法称为协议,客户端和服务器端只要实现这些接口方法,就可以通信了。其中使用了动态代理的技术,NIO
DataNode 负责对数据实际的存储位置,因为数据是分块的,即每个Block大小的设置,当有一个很大的文件,NameNode 对其进行切分时,分成多少块,占总文件的比例。
因为有多个DataNode ,各个DataNode之间也是有通信的,DataNode 不仅要管理本地的数据,与JobClient 的通信,其他DataNode的通信。
当对文件进行读取的时候,NameNode 向DataNode 询问具体数据的位置,DataNode对于文件的定位。
还有就是文件的序列化问题,Hadoop实现的是自己的方式。
NameNode 和DataNode 间的通信,依靠心跳响应,DataNode 每隔一段时间向NameNode 汇报执行情况,当出现宕机时,NameNode会重新分配新的机器,还有就是当一台机器上的任务执行速度很慢的时候,
NameNode 会再起一台,同时执行。
HDFS中关于文件的输入输出格式,也可以自己定义格式,FileInputFormat 和FileOutputFormat
对于HDFS的优化:初始化Block的大小,数据备份的个数,设置机架感知,心跳的时间间隔,3.0中对NameNode中的一些信息进行适时的删除,减轻NameNode 启动压力。
Yarn 分为了资源分配管理,任务监督执行,以及真正的运算平台。
ResourceManager(Scheduler ,Application Manager)负责分配任务运行所需要的资源,container(CPU和内存)
NodeManager和Application Master分别负责对于任务的监控以及任务的执行。
yarn默认的运算平台支持mapreduce和spark,stome吧
MapReduce 执行过程:map阶段和reduce阶段。在map阶段,通过InputFormat 对于输出的数据进行整理成
按照key进行排序,如果有combiner函数,对相同key的值进行合并,如果数据量达到内存的80%自己设置的,则spill到磁盘中,最后对磁盘中的多个file进行合并,最多10个file合并,这些就是map阶段的结果。
在reduce阶段,首先copy,开启多个进程,把各个map上的结果拷贝到reduce机器的内存中,满了则磁盘上。对拷贝过来的文件,进行merge,sort。最后进行reduce计算。
MapReduce阶段的优化:map和reduce任务的个数,以及每个map和reduce能够处理的最大,最小数据量,是否能够设置combiner函数(要求输入和输出格式统一),当内存中数据达到多少比例时溢写到磁盘。
对于map结果是否进行压缩,jvm是否重用。这其中缓存的使用。
当map的文件都是小文件时,将多个小文件进行打包,或者使用AVRO格式合并
在copy过程中,开启的并行的进程数。
Hive 数据仓库,通过使用HiveQL,方便使用类似SQL的语句进行对表的管理,支持离散数据处理。
首先hive shell 创建表分为内部表和外部表,内部表是数据存储在实际的仓库中,删除时元数据和数据都删除了。外部表只是执行数据仓库的一个连接,删除时只删除元数据不擅长实际数据。
create external table name() (partitioned by ) row format delimited fields terminnated by '\t' location hdfspath
加载数据到hive load data inpath hdfspath 或者从本地 load data local inpath file:\\
或者在创建表的时候就指定 create table name as select aaa bbb from t1
由多个表中导入数据的时候使用:from tableA insert into tableB select id,name,sex
将HIVE表的数据导出到表insert overwrite table a select ss form nn
导出也分为三种方式,insert overwrite local directory file:\\\ select aa,bb from table1 导出到HDFS insert overwrite directory hdfs:\\ select aa from table2
导出到其他表 insert into table test1 partition() select a from table3
Hive java API
Hive 底层使用MapReduce 进行计算
Hive支持三种连接表的方式,map join ,reduce join 和semi join
map join 使用的条件是左表数据量较小,可以直接放到内存中,那么右表与左表的数据进行一一的比对。
reduce join 就是对map的结果进行运算,因为存在多个map的结果,所以运算量很大,网络上的传输消耗也很大。
semi join 就是在进行reduce join之前对map的结果进行筛选,筛选一些重复的key,做法是将左表随机分成一个小表,放入内存,将另一部分与他进行比较,去除重复的。
Hive的优化:数据倾斜的问题,使用分区,join,group by 或者是
Hive 中的strict 模式,很多情况下都要设置为false,关闭严格模式。
clustered by 等同于distributed by ,sort by 结合
设置在map端聚合,set hive.map.aggr=true,设置map端聚合的条目数 set hive.groupby.mapaggr.checkinterval=10000
是否合并map端输出文件,set hive.merge.mapfile=true
是否合并reduce端输出文件,set hive.merge.mapredfiles=true
HBase 列式数据库,表中必须有列族,列的个数可以实时的增加,支持实时的查询。根据行健进行查询
create 'table1','fam' put ,get ,scan,Scanner ,delete
HMaster 负责监控各个HRegionServer,且与ZK通信
HregionServer 管理各个HRegion ,向ZK注册
一个HRegionServer 中有多个HRegion,一个HRegion相当于一个map任务
写入数据时,采用预写日志,然后写入到Memstore ,满了,则spill成HFile,一个HFile格式
读取特定的数据的时候,首先从ZK中得到-ROOT-的信息,从-ROOT-得到.META.的信息,找到特定的RegionServer中的Region,此过程也会对经常要读取的文件进行缓存。
HBase java API HTable HBaseAdmin 负责对表的创建
HTableDescripter ,HColumnDescripter
HBase中的布隆过滤器,
最重要的是rowkey的设计,一般防止热点,使用salt或者hash key来组合rowkey,使得分布的均匀