1.传统的关系型数据库的B树,更新少量数据效率高,mapReduce更新大量数据效率高
2.关系型数据库与MapReduce比较
MapReduce比较适合以批处理方式处理需要分析整个数据集的问题,尤其是动态分析。
RDBMS适合于点查询和更新,数据集被索引之后,数据库系统能提供低延迟的数据检索和快速的少量数据更新。
MapReduce适合一次写入,多次读取的数据的应用,关系型数据库更适合持续更新的数据集
3.数据有结构化、半结构化(如电子表格,单元格内的数据没有固定的格式)、非结构化
4.关系型数据往往是规范的,以保持数据的完整性且不会有冗余
5.Pig和Hive是MapReduce的高级查询语言,容易被传统数据库的程序员接受
6.MapReduce使的程序员不必操心系统部分失效的问题,因为它自己的系统实现能够检测到并重新
执行失败的map或reduce任务。因此任务的执行殊勋无关紧要
7.MapReduce设计目标
(1)为只需要短短几分钟或者几个小时就可以完成的作业提供服务
(2)运行与同一个内部有高速网络连接的数据中心内
(3)数据中心内的计算机都是可靠的、定制的硬件
8.hadoo是Apache Lucene创始人Doug Cutting创建的,Lucene是一个应用广泛的文本搜素数据库。
Hadoop起源于开源的网络搜索引擎,Apache Nutch,它本身也是Lucene项目的一部分
9.zookeeper,一种分布式的,可用性高的协调服务
10.yarn是一个通用的运行分布式应用的资源管理器
11.HDFS联盟管理,该管理将HDFS的命名空间分散到多个namenode中那个以支持包含大规模数据文件的集群
12.HDFS高可用性,针对系统崩溃而启用备用的namenode来避免namenode的单点故障问题
13.dfs.namenode.name.dir mapreduce.job.name 14.MapReduce程序分为两个阶段,每个阶段都以键值对作为输入和输出,其类型由程序员来选择
程序员还需要写两个函数,MAP函数和Reduce函数
15.map阶段的键值对的键为文件中的行偏移量,map并不需要这个信息,所以可以忽略。
在天气分析中map函数的功能仅限于提取年份和气温信息,并将他们作为输出
map函数的输出经由MapReduce框架处理后,最后发送到reduce函数。这个处理过程基于键对键值对进行排序和分组
map输出:
(1950,0)
(1950,22)
(1950,-11)
(1949,111)
(1949,78)
reduce的输入:
(1949,[111,78])
(1950,[0,22,-11])
reduce需要做的是遍历整个列表并从中找出最大的读数,以下是最终的输出结果,每一年的全球最高气温记录
(1949,111)
(1950,22)
16.Mapper类是一个泛型类型,它的四个形参类型,分别指定map函数的输入键、输入值、输出键、输出值的类型
17.求最高气温的map函数的解释:
MapReduce主函数框架:
过程为3c2kv1入出
(1)3c即为 job.setJarByClass, job.setMapperClass, job.setReducerClass
(2)2kv,即为
①job.setMapOutputKeyClass(Text.class) ; job.setMapOutputValueClass(IntWritable.class);
②job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
(3)1入出即为:
FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1]));
注意:1入出中的,输入比输出多个s
主函数如下:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class MinTemperature {
public static void main(String[] args) throws Exception {
Configuration conf=new Configuration();
conf.set("mapreduce.framewordk.name","yarn");
conf.set("yarn,resourcemanager.address","192.168.241.130:8032");
conf.set("mapreduce.app-submission.cross-platform", "true");
conf.set("mapreduce.job.jar","ncdc1.jar");
String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
if (otherArgs.length < 2) {
System.err.println("Usage: ncdc <in> [<in>...] <out>");
System.exit(2);
}
/*
过程为3c2kv1入出
3c即为 job.setJarByClass, job.setMapperClass, job.setReducerClass
2kv,即为
①job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
②job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
1入出即为:
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
*/
//1.获取Job对象
Job job = new Job(conf, "Min temperature");
//2.设置jar存储位置
job.setJarByClass(MinTemperature.class);
// job.setJobName("Min temperature");
//3.关联Map和Reduce类
job.setMapperClass(MinTemperatureMapper.class);
job.setReducerClass(MinTemperatureReducer.class);
//4.设置Mapper阶段输出数据的key和value类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//5.设置最终数据输出的key和value类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//6.设置输入路径和输出路径 //记得输入setInputPaths 比输出多个s
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
// 返回一个布尔值,表示程序的执行成功或者失败,这个布尔值被转换成程序退出代码0或者1
//0表示成功
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
map类
import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.mapreduce.Mapper;
//Mapper类是一个泛型类型,它的四个形参类型,分别指定map函数的输入键、输入值、输出键、输出值的类型
//LongWritable是一个长整型的偏移量, Text输入值为一行文本, Text输出键是年后, IntWritable输出值是气温(整数)
public class MinTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
// 用9999代替数据集中缺失的数据
private static final int MISSING = 9999;
@Override
//以下两种参数方式都可以
/* protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text
, IntWritable>.Context context)*/
protected void map(LongWritable key, Text value,Context context)
throws IOException, InterruptedException {
// TODO Auto-generated method stub
//将读入的数据转换为字符串
String line =value.toString();
//裁取字符串的的15,19之间的字符串,当做年份
String year = line.substring(15,19);
int airTemperature;
//如果下标87位为‘+’时,读取下标从88到92不包括92,并转换为型
if(line.charAt(87) == '+') {
airTemperature = Integer.parseInt(line.substring(88, 92));
//否则下标87为‘-’号也需要读,并转换为整型
} else {
airTemperature = Integer.parseInt(line.substring(87, 92));
}
String quality = line.substring(92, 93);
//matches用于检测是否符合给定的正则表达式,只有气温数据不丢失,并且所对应的质量代码显示正确的气温读数,这些数据才会被写入输出记录
if(airTemperature != MISSING && quality.matches("[01459]")) {
//context用于输出内容的写入,将输入的值截取year字段后,强转为Text作为输出的键。
//将截取的气温值强转为IntWritable作为输出的值
context.write(new Text(year), new IntWritable(airTemperature));
}
}
}
Reduce阶段:
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
//输入的Text是map中输出的键即为年份,IntWritable为输入键对应的气温值,Text 输出的键为最高气温的年份,IntWritable为输出的最高气温
public class MinTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
@Override
//Text key输入的键为map输出的键, Iterable<IntWritable> values 输入的值为map中整合之后的值数组, Context context,输出值
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int minValue = Integer.MAX_VALUE;
//循环比较输入的值组中值,寻找该年份中的最小值
for (IntWritable value : values) {
minValue = Math.min(minValue, value.get());
}
//输出年份,以及该年份所对应的最低气温值
context.write(key, new IntWritable(minValue));
}
}
18.关于格式化
19.一个mapreduce作业包括(数据+程序+配置信息),Hadoop将任务分成两类若干小作业执行,其 中包括两类任务我:map任务和reduce任务
20.一个jobtracker与一系类tasktracker
21.hadoop将MapReduce的输入数据切割为一个个小块(输入分片),每个小块构建一个map任务
22.作业的分片不能太小,要不然管理分片的总时间和构建map任务的总时间将决定作业的整个执行时间。对于大多数作业,一个合理的分片大小趋近于HDFS的一个块的大小,默认64MB
23.为什么最佳的分片大小应该与块大小相同呢?因为为了避免分片跨越两个数据块,那么可能存储在不同的节点上。导致网络传输,相较于使用本地数据进行整个map任务效率低
24.map任务将输出写入本地磁盘,而不是HDFS,因为map只是中间结果,如果放入HDFS,会有备份出现,小题大做。
25.map输出的结果通过网络发送到reduce端合并,然后用reduce函数处理,reduce的输出存储在HDFS中实现可靠存储
26.reduce任务过程
27.combiner函数
28.HDFS中块
29.使用块好处
(1)文件的所有块不需要存储在同一块磁盘上,因此可以利用集群中的任意一个磁盘进行存储
(2)使用抽象块,而非整个文件作为存储单元,大大简化了存储系统的设计
(3)块非常适合于数据备份,提考了容错能力和可用性
30.namenode与datanode
31.HDFS联盟
因为内存限制了集群扩展,所以设置多个namenode,每个namenode维护一个命名空间,每个namenode之间是互相独立的,互不通信。甚至其中一个namenode失效也不影响其他namenode,集群中 的datanode需要注册到每个namenode上
32.hadoop HA
配置一对活动-备用(active-standby)namenode。当活动namenode失效,备用namenode就会接管它的任务并开始服务于来自客户端的请求,不会有明显的中断。
33.dfs.default.name 用于设置hadoop的默认文件系统,客户端通过该属性得知namenode在哪里运行进而连接到它。
34.本地运行MapReduce与完全分布式最大的区别是,本地不能运行多个reduce
35.可以通过设置mapreduce.framework.name在本地开发值必须设置为local
36.一个reduce文件产生一个输出结果文件
37.mapper一般执行输入格式解析,投影和过滤,可以有多个mapper,使用hadoop自带的类chainMapper完成他们的连接成一个mapper
38.文件系统块是磁盘块的整数倍,即每次读写数据量必须是磁盘块大小的整数倍 (文件系统一般把磁盘空间划分为每512字节为一组,称为磁盘块)
39.分布式文件系统中,文件被分成若干块存储,块是数据读写的基本单元。只不过比操作系统的块大,而且如果一个文件小于块的大小,它并不会占用整个数据块的存储空间。块的原因是 减少寻址开销
40.名称节点的作用为①负责文件和目录的创建、删除和重命名②负责数据节点和文件块的映射
41.HDFS只允许一个文件有一个写入者,不允许多个用户对同一个文件执行写操作
42.HDFS局限性①不适合低延时数据访问②无法高校存储大量的小文件
43.HDFS抽象数据块的好处:
①支持大规模文件存储
②简化系统设计
③适合数据备份
44.FSImage存放元数据,EditLog记录所有对文件的创建、删除、重命名操作。名称节点记录每个文件的各个块所在的数据节点的位置信息,但是并不持久化存储这些信息,而是每次启动时扫描所有数据节点重构得到这些信息。
名称节点在启动的时候,会将FsImage的内容加载到内存中,然后执行EditLog文件中的各项操作,使的内存中的数据保持最新。这个操作完之后会创建一个新的FsImage文件和一个空的EditLog文件。名称节点启动成功并进入正常运行转态,HDFS的操作都会被写入到EditLog,而不是直接写入到FsImage,这是因为FsImage太大更新操作直接写入FsImage会导致系统越来越慢
45.名称节点运行期间EditLog不断变大,变大的EditLog对系统影响不大,但是当名称节点重新启动的时候,会加载FsImage然后逐行执行EditLog中的记录,导致整个过程很慢
46.第二名称节点有俩个作用(课本P48页图)
(1)EditLog与FsImage的合并操作。一段时间后,FsImage跟EditLog被第二名称节点拉回到本地,然后加载到内存中执行EditLog中的记录进行合并,此时名称节点中会暂时将新到达的写操作添加到一个新的EditLog.new文件。上述合并过程之后得到新的FsImage发送到名称节点,替换旧的FsImage,同时使用EditLog.new替换掉EditLog文件,从而减少了EditLog的大小
(2)第二名称节点相当于名称节点设置了一个“检查点”,周期性地备份名称节点中的元数据,当名称节点发生故障时,就可以用第二名称节点中的记录的元数据进行恢复。但是,在第二名称节点上合并操作得到的新的FsImage文件是合并操作发生时HDFS记录的元数据,并没有包含合并操作发生之后发生的更新操作,如果在此时名称节点发生故障,系统就会丢失部分元数据。
47.名称节点负责管理文件熊的命名空间以及客户端对文件的访问。每个数据节点会周期性地向名称节点发送“心跳”,报告自己的状态,没有发送按时发送心跳信息的数据节点被标记为“宕机”
48.HDFS的命名空间的管理包含目录、文件和块。命名空间的管理是指命名空间支持对HDFS中的目录、文件。块做类似文件系统的创建、删除、修改等基本操作。
49.HDFS没有实现磁盘配额和文件访问权限等功能,也不支持文件的软硬连接
50.名称节点不会主动发起RPC而是响应来自客户端和数据节点的RPC请求。
51.HDFS体系结构的局限性
(1)命名空间的限制,受内存大小的限制
(2)性能的瓶颈,整个分布式文件系统的吞吐量受限于单个名称节点的吞吐量
(3)隔离问题,由于只有一个名称节点,因此无法对不同应用程序进行隔离
(4)集群的可用性。一旦名称节点故障,导致整个集群变得不可用。
52.HDFS数据的冗余处理优点:
(1)加快数据传输速度。客户端访问同一个文件时,可以从不同的数据块副本中读取数据,加快了数据传输
(2)容易检擦数据错误。HDFS的数据节点之间通过网络传输数据,采用分本可以容易判断数据传输是否有错
(3)保证数据额的可靠性。某个数据节点故障,也不会造成数据丢失
53.HDFS数据存储策略
(1)数据存放:采用机架感知策略,HDFS的默认冗余因子是3,有两份存放在同一个机架的不同机器上面,第三份放在不同机架的机器上面。这样既可以保证发生异常时的数据恢复,也可以提高数据读写性能。
如果是集群内发起的操作请求,则把第一块放在发起请求的数据节点上,如果是集群外,则找一台磁盘不满,cpu不太忙的数据节点,存放第一份。第二份放在与第一份不同的机架的数据节点上,第三份放在与第一份相同的机架的其它节点上。
(2)数据读取:就近原则
(3)数据复制:采用流水线复制,一个副本改变,再去通知其他副本改变
54.数据错误与恢复
(1)名称节点出错:Hadoop的元数据同步存储到其他文件系统(例如远程挂载的文件系统NFS)。当名称节点发生故障的时候,首先到远程挂载的网络文件系统中获取被封的元数据信息,放在第二名称节点上进行恢复,并把第二名称节点作为名称节点来使用。
(2)数据节点出错:数据节点出错,数据被标记为不可读,由于一些节点不可用导致一些数据块的副本数量少于冗余因子数。名称节点定期检查到后会为它生成新的副本。HDFS文件系统与其他分布式文件系统的最大区别就是可以调整冗余数据的位置。
(3)数据出错:网络传输和磁盘错误等都会造成数据错误。客户端在读取到数据后,会采用md5和shal(加密方式)对数据块进行校验。
### HDFS写数据过程
### HDFS读数据过程
分布式数据库HBase
1.Hbase不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空
2.关系型数据库可以针对不同的列构建复杂的多个索引,以提高数据访问性能。Hbase值有一个索引–行键
3.HBase是一个稀疏、多维度、排序的映射表,这张表的索引是行键、列族、列限定符、时间戳。每个值是未经解释的字符串
4.表在水平方向由一个或者多个列族组成,一个列族中可以包含任意多个列,同一个列族中的数据存储在一起
5.在HBase中执行更新操作,并不会删除旧值,而是生成一个新的版本。
6.HBase表视为“四维坐标”即[行键、列族、列限定符、时间戳]
7.HBase的概念视图是一个稀疏的映射表,里面有许多的空的单元格,概念视图中每个表是由许多的行组成的。概念视图中每个行都包含相同的列族,尽管不需要在每个列族里存放数据
在物理存储层面,采用了基于列的存储方式。按列族分别存放,属于同一个列族的数据保存在一起,同时,和每个列族一起存放的还包括了行键和时间戳
8.列数据库有点:
(1)支持大量并发,处理速度是传统方法的100倍
(2)具有较高的数据压缩比
(3)主要用于数据挖掘、决策支持
9.DSM存储模型缺点(列族缺点):执行连接操作时需要昂贵的 元组重构代价。
10.Hbase中master负责管理和维护HBase表的分区信息,同时也维护Region服务器列表。某个Region服务器出现问题,master会将故障服务器上的存储的Region重新分配到其他的Region服务器。如果Master出现问题,整个系统会无效
11.客户端不直接从Master上读取数据,尤其指HBase客户端不依赖Master而是借助于Zookeeper来获得Region位置信息,这种设计使得Master的负载很小。
12.根据行键对表中的行进行分区,每个行区间构成一个分区,被称为Region
13.初始时一个表只有一个Region随着数据的不断插入,Region等分裂成两个Region,数据越来越多,分的Region也就越多
14.Region是HBase中负载均衡和数据分发的基本单位
15.Master会将不同Region分到不同Region服务器上,同一个Region不会在不同Region服务器上
16.Region中RegionID唯一标识Region,便于定位,这样Region标识符为“表名+开始主键+RegionID”
17…META表包含了Region的元数据。(Region和Region服务器之间的对应关系),映射表的记录由“Region标识符+Region服务器标识”组成
18.当.MATA非常大时,也会被分裂成多个Region(包含元数据),-ROOT-表用于记录这些Region的位置信息。-ROOT-表不会再被分割,永远只有一个Region用于保存-ROOT-表,它的名字被写死,只有Master主服务器知道它的位置
19.假设Region128MB,其中一行占用1KB,那么三层结构可以保存2^34个Region
20.客户端访问Zookeeper获取-ROOT-表位置,访问-ROOT-表获取.MATA表获取Region位置,再访问Region,为了加快速度,会在客户端做缓存,当缓存中找不到时再进行三级寻址
21.客户机:
管理类操作,客户端与Master进行RPC(远程过程调用,与本地函数调用的区别是,函数定义与调用位于不同机器上,多了通信部分),数据读写类操作,客户端与Region服务器进行RPC
22.Zookeeper可能是个集群,提供稳定可靠的协同服务。
23.Master是集群的总管,它通过Zookeeper得知Region服务器状态,因为每个Region服务器必须到Zookeeper中注册。Zookeeper实时监控Region服务器状态并通告给Master。
24.Zookeeper作用:①维护当前集群中极其的服务状态②帮忙选出Master(集群中可能有多个master,但是Zookeeper帮忙选出一个总管,保证任何时间只有一个master进程,避免了“单点失效”)
25.Master作用:
(1)对用户的增删改查管理
(2)实现Region服务器之间的负载均衡
(3)负责调整分裂后的Region的分布
(4)对故障之后的Region迁移
master维护了当前可用的Region服务器列表,以及哪些Region分配给了哪些Region服务器,那些Region还没有分配。master发送请求给有空间的Region服务器,Region服务器接受请求并加载数据
26.Region服务器负责维护自己的Region并响应用户的读写请求
27.HBase依靠底层的HDFS存储,自身不具备数据复制和数据副本的功能,由HDFS提供。不过也可以采用其他文件系统(本地文件系统或者云环境中的Amazon S3)
28.Region服务器中只有一个HLog(记录操作),多个Region。每个Region由多个store(对应列族)组成,每个store又由一个MemStore(内存中的缓存,保存最近更新的数据)和多个StoreFile(磁盘中的文件)组成
29.每次刷新都会在磁盘上生成新的StoreFile文件导致StoreFile文件非常多,查找费时,因此多个StoreFile文件会合并成一个大的文件,当这个StreFile大到一定程度的时候,会分裂,同时,当前的一个父Region会被分裂成两个Region,父Region会下线,分裂的两个Region会被Master分配到相应的Region服务器上
30.Zookeeper监控Region服务器的状态,当Region服务器发生故障,通知给Master。Master处理Region服务器上的HLog,将HLog根据Region对象拆分分别放到对应Region对象的目录下,然后将失效的Region重新分配到可用的Region服务器上,并把该Region对应的HLog也发送过去。Region服务器领到属于自己的Region对象以及HLog之后重新做一遍日志记录中的各种操作。把日志记录中的数据写入MemStore,然后刷新到StoreFile
NoSql
1.nosql具有的特点:
(1)灵活的扩展性(2)灵活的数据模型(3)与云计算紧密相连
2.NoSql兴起原因:
关系型数据库无法满足Web2.0需求
(1)无法满足海量数据用的管理需求
(2)无法满足数据高并发需求
(3)无法满足高扩展性和高可用性的需求
关系数据库的关键特性在WEB2.0时代成为“鸡肋”
(1)web2.0网站系统通常不要求严格的数据库事务
(2)Web2.0不要求严格的读写实时性
(3)Web2.0通常不包含大量复杂的SQL查询
3.NoSql与关系型数据库的比较
1)关系型数据库
优点:完善的理论基础、严格的标准、支持事物ACID四性,借助索引机制可以高效查询、技术成熟,有专业公司技术支持
缺点:扩展性差、无法较好支持海量数据存储、数据模型过于死板、无法较好地支持Web2.0应用、事务机制影响了整体性能
2)NoSql
优点:支持超大规模数据存储、灵活的数据模型、可以很好的支持Web2.0应用、强大的横向扩展能力
缺点:缺乏数学理论基础、发咋查询性能不高、一般不能实现事务强一致性、很难实现数据完整性,技术不成熟,缺乏专业团队的技术支持、维护困难
4.NoSql应用例如:“购物篮”这种临时性数据,采用键值对存储更加高效,而当前的产品和订单信息则适合存放在关系型数据库中,大量的历史订单信息则是和保存在类似MongoDB的文档数据库中
5.键值数据库
优点:扩展性好、灵活性好、大量写操作时新年那个高
缺点:无法存储结构化信息、条件查询效率低
典型应用:内存缓存,如会话、配置文件、参数、购物车
数据模型:键/值对
6.列族 数据库:
优点:查找速度快、可扩展性强、容易进行分布式扩展、复杂性低
缺点:功能较少、大都不支持强事务一致性
典型应用:分布式数据存储与管理
数据模型:列族
7.文档数据库:
优点:性能好、灵活性高、复杂性低、数据结构灵活
缺点:缺乏统一的查询语言
典型应用:存储、索引并管理面向文档的数据或者类似的半结构数据
数据模型:版本化文档
9.图数据库
优点:灵活性高、支持复杂的图算法、可用于构建复杂的关系图谱
缺点:复杂性高、只能支持一定的数据规模
典型应用:应用于大量复杂、互连接、低结构化的图结构场所,如社交网络、推荐系统
数据模型:图结构
10.三大理论基石(CAP+BASE+最终一致性)
11.CAP:三者只能同时具备两个
C:一致性,指任何时刻读数据总能够读到之前完成的写操作的结果,也就是分布式环境中,多点数据一致
A:可用性,指可以再确定的时间范围内返回操作结果
P:分区容忍性,指出现网络分区(一部分节点无法与其他节点通讯),分离的系统也能够正常运行
注:
①追求C则牺牲A,需要处理因为不可用导致的写操作失败的情况
②追求A则要预估大可能发生是数据的不一致,比如,系统的读操作可能不能精确读到写入的最新值
(1)CA放弃分区容忍性,最简单的做法是把所有事务有关的内容放到同一台机器上。这样会影响系统的可扩展性。传统的关系数据库采用
(2)CP放弃可用性,当出现网络分区现象时,受影响的服务需要等待数据一致,因此此时无法对外服务HBase采用
(3)AP放弃一致性,允许系统返回不一致的数据。这对于Web2.0网站而言是可行的,一些网站用户关注的是网站服务是否可用。在采用AP时也不是完全放弃一致性,转而采用最终一致性。
12.ACID 原子性、一致性、隔离性、持久性
13.BASE牺牲了高一致性,从而获得了可用性或可靠性
14.BASE
(1)BA(basically aviailble):基本可用
一部分变得不可用时,其余还可以工作。比如一个分布式文件系统10个节点损坏一个不影响工作
(2)S(soft-state):软状态
软状态指数据可以有一段时间不同步,具有一定的滞后性 例如:转账滞后性,但是会最终一致
(3)E(Eventual consistency):最终一致性
一致性分为强一致性和弱一致性。二者的主要区别是在高并发的数据访问操作下,新操作能否获得最新数据。最终一致性是弱一致性的一种特例。最终一致性也是ACID的最终目的
15.最终一致性:
一致性从服务器端来看是指更新如何复制到整个系统,保证数据最终一致。从客户端来看,一致性指高并发的数据访问操作下,后续操作能否获得最新的数据
数据不一致的时间间隔称为“不一致窗口期”,窗口期的大小依赖于交互延迟、系统负载、副本个数
最终一致性根据更新后个进程访问到数据的时间和方式不同可以分如下区分:
①因果一致性:如果进程A通知B,B能获得最新值,而其余进程不能获得最新值,遵守最终一致
②读己之所写一致性:是因果一致性的特例,自己更新后,自己总能获得最新值
③会话一致性:访问进程放在一个会话中,保证”读己之所写一致性“
④单调读一致性:如果进程已经读到了一个值,那么后续操作不会读到那个值之前的值
⑤单调写一致性:系统保证来自同一个进程的写操作顺序执行
16.NewSql数据库不仅有NoSql对海量数据的存储管理能力 ,还保持了传统数据库支持ACID和SQL特性,不同的NewSql内部结构差异大,但是都支持ACID和SQL特性。 产品有 Amazon RDSD 、SQL Azure
MapReduce过程流程
Hive
1.hive外壳环境使我们和hive交互,发出HiveQL命令的主要方式
2.SHOW TABLES; 列出所有表(大小写不敏感)
3
.
4.metastore是Hive元数据的集中存放地。metastore包括两部分:服务和后台数据存储。使用内嵌的Derby数据库只能访问一个Hive会话。当启动第二个会报Failed to start database ‘metastore_db’
5.hive与传统数据库区别
传统的数据库,表的模式在加载数据时强制确定,称为“写时模式”。hive对数据的验证不在加载数据时进行,而是在查询时进行称为“读时模式”
6.hive不支持更新(或删除)但支持插入,可以向现有的表中增加新的行
7.hive中表在逻辑上由存储的数据和描述表中数据形式的相关元数据组成。数据一般存放在HDFS中,但它也可以放在其他任何Hadoop文件系统中。Hive把元数据存放在关系数据库中,饿而不是放在HDFS中
8.Hive把表组织成“分区”(partition),使用分区可以加快数据的分片和查询速度
9.分区可以进一步分为“桶”(bucket),它会为数据提供额外的结构以获的跟高效的查询处理
10.分区不会影响查询的效率,仍然可以跨多个分区查询整个数据集
11.和直接使用MapReduce相比,使用Hive的一个好处在于Hive简化了常用操作。
hadoop再探讨
1.Hadoop的局限与不足
hadoop1.0只包含HDFS和MapReduce不包含生态系统
(1)抽象层次低,为实现一个简单的功能需要编写大量的代码
(2)表达能力有限。复杂的分布式编程抽象到两个函数上即M阿婆、Reduce
(3)开发者自己管理作业之间的依赖关系。作业之间的复杂依赖关系,只能由开发者管理
(4)难以看到程序的整体逻辑。用户的处理逻辑隐藏在代码细节中,后期维护困难
(5)执行迭代操作效率低
(6)资源浪费,reduce需要等待所有map任务结束之后才开始
(7)实时性差,只适合离线批处理
2.hadoop的改进与提升
组件 | Hadoop1.0的问题 | Hadoop2.0的改进 |
HDFS | 单一名称节点,存在单点失效问题 | 设计了HDFS HA,提供名称节点热备机制 |
HDFS | 单一命名空间,无法实现资源隔离 | 设计了HDFS Federation,管理多个命名空间 |
MapReduce | 资源管理效率低 | 设计了新的资源管理框架YARN |
组件 | 功能 | 解决Hadoop中存在的问题 |
Pig | 处理大规模数据的脚本语言,用户只需要编写几条简单的语句,系统会自动转换为MapReduce作业 | 抽象层次低,需要手工编写大量代码 |
Spark | 基于内存的分布式并行编程框架,具有较高的实时性,并且较好支持迭代计算 | 延迟高,而且不适合执行迭代计算 |
Oozie | 工作流和协作服务引擎,协调Hadoop上运行的不同任务 | 没有提供作业(Job)之间依赖关系管理机制,需要用户自己处理作业之间依赖关系 |
Tez | 支持DAG作业的计算框架,对作业的操作进行重新分解和组合,形成一个大的DAG作业,减少不必要操作 | 不同的MapReduce任务之间存在重复操作,降低了效率 |
Kafka | 分布式发布订阅消息系统,一般作为企业大数据分析平台的数据交换枢纽,不同类型的分布式系统可以统一接入到Kafka,实现和Hadoop各个组件之间的不同类型数据的实时高效交换 | Hadoop生态系统中各个组件和其他产品之间缺乏统一的、高效的数据交换中介 |
3.hadoop HA
配置一对活动-备用(active-standby)namenode。当活动namenode失效,备用namenode就会接管它的任务并开始服务于来自客户端的请求,不会有明显的中断。
名称节点与待命节点通过NFS共享存储系统,待命节点时刻监听该系统,一旦发现有新的写入,就立即从总共存储系统中读取这些数据加载到自己的内存中,从而保证了两者完全同步
需要给数据节点配置两个名称节点的地址,并把块的位置信息和心跳信息同时发送到这两个名称节点上,为了防止出现两个管家,同一时刻,只能由一个名称节点处于活跃状态,这个任务是由zookeeper实现的
4.HDFS联盟
因为内存限制了集群扩展,其次单个节点无法保证不同程序之间的隔离性,所以设置多个namenode,每个namenode维护一个命名空间,每个namenode之间是互相独立的,互不通信。甚至其中一个namenode失效也不影响其他namenode,集群中 的datanode需要注册到每个namenode上
HDFS联盟的访问可以通过在客户端挂载表的方式进行数据共享和访问,客户端可以访问不同的挂载点来访问不同的子命名空间
各个命名空间挂载到全局“挂载表”中,实现数据全局共享
命名空间挂载到个人的挂载表中就成为应用程序可见的命名空间
优点:
(1)HDFS集群扩展性强
(2)性能更高效
(3)良好的隔离性
注意:HDFS联盟并不能解决单点故障
YARN 工作流程
- Yarn框架与MapReduce框架的对比:
(1)减轻了ResourceMangere的压力
(2)MapReduce1.0既是计算框架,优势资源调度框架,但是只能支持MapReduce编程模型。而YARN则是一个纯粹的资源调度管理框架,在它上面可以运行包括MapReduce在内的其它计算框架
(3)Yarn中资源管理比MapReduce1.0中更加高效
- YARN的发展目标:一个集群多个框架
- Pig可以加载数据、表达转换数据以及存储最终结果
Pig会自动把用户编写的脚本转换成MapReduce作业在Hadoop集群上运行,而且具备对生成的MapReduce程序进行自动优化的功能用户在编写Pig程序的时候,不需要关心程序的运行效率,这就大大减少了用户编程时间 - Tez是Apache开源的支持DAG作业的计算框架,它直接源于MapReduce框架。核心思想是将Map和Reduce两个操作进一步拆分
Map被拆分成Input、Processor、Sort、Merge和Output
Reduce被拆分成Input、Shuffle、Sort、Merge、Processor和Output等分解后的元操作可以任意灵活组合,产生新的操作这些操作经过一些控制程序组装后,可形成一个大的DAG作业通过DAG作业的方式运行MapReduce作业,提供了程序运行的整体处理逻辑,就可以去除工作流当中多余的Map阶段,减少不必要的操作,提升数据处理的性能Hortonworks把Tez应用到数据仓库Hive的优化中,使得性能提升了约100倍 - 借助于Tez框架实现对MapReduce、Pig和Hive等的性能优化
- Kafka是一种高吞吐量的分布式发布订阅消息系统,用户通过Kafka系统可以发布大量的消息,同时也能实时订阅消费消息Kafka可以同时满足在线实时处理和批量离线处理
- 在公司的大数据生态系统中,可以把Kafka作为数据交换枢纽,不同类型的分布式系统(关系数据库、NoSQL数据库、流处理系统、批处理系统等),可以统一接入到Kafka,实现和Hadoop各个组件之间的不同类型数据的实时高效交换
### spark
1.hadoop缺点
(1)表达能力有限
(2)磁盘开销大
(3)延时
2 . spark优点:
(1)spark计算模式也属于mapreduce,但不局限与map和reduce,还提供了其他多种数据操作类型
(2)spark提供了内存计算,中间结果放在内存中,带来了更高的迭代运算效率
(3)spark基于DAG的任务调度执行机制,要优于MapReduce的迭代执行机制
3.spark比较适合于迭代运算比较多的数据挖掘和机器算法
4.spark不能代替hadoop主要代替MapReduce计算模型
5.批处理、交互式查询、实时数据流的数据处理三种场景,部署三种不同的软件会带来以下问题
(1)不同场景之间的数据无法无缝共享
(2)不同软件维护团队不同,成本较高
(3)比较难以对同一个集群中的各个系统进行统一的资源协调和分配
6.spark设计遵循:“一个软件栈满足不同应用场景”
7.spark专注于数据的数据处理分析,而数据的存储还是要借助于Hadoop的分布式文件系统HDFS
### Hbase操作
注意:
put:一次只能插入一个单元格数据
delete:一次只能删除一个单元格数据
deleteall:一次删除一行数据
MongoDB
(1)显示数据库
(2)切换到school数据库(mongoDB在使用数据库时,自动创建数据库)
(3)创建集合(提前创建集合,也可以不创建)
(4)插入数据(会自动创建集合,不必要提前创建)
(5)查看所有记录
(6)修改数据
(7)删除数据
(8)删除集合(此时如果数据库中的没有集合了,那么数据库也会自动删除的)
HDFS命令
1.hdfs dfs -ls
-d 查看文件夹目录信息(不会列出文件夹内信息)
-R递归的列出文件夹下的所有文件
-h 文件大小显示为人熟知的格式
2.hdfs dfs -put zhao.txt / 上传文件到hdfs
3.hdfs dfs -cat /zhao.txt 查看hdfs文件内容