数据的“大”是相对而言的,是指所处理的数据规模巨大到无法通过目前主流数据库软件工具,在可以接受的时间内完成抓取、储存、管理和分析,并从中提取出人类可以理解的资讯。
业界普遍认同大数据具有4个 V特征(数据量大Volume、变化速度快Velocity、多类型Variety与高价值Value)。简而言之,大数据可以被认为是数据量巨大且结构复杂多变的数据集合。
第一个特征Volume是大数据的首要特征,数据体量巨大。当今世界需要进行及时处理以提取有用信息的数据数量级已经从TB级别,跃升到PB甚至EB级别。
第二个特征Variety:数据类型繁多。大数据的挑战不仅是数据量的大,也体现在数据类型的多样化。除了前文提到的网络日志、地理位置信息等具有固定结构的数据之外,还有视频、图片等非结构化数据。
第三个特征Velocity:处理速度快。信息的价值在于及时,超过特定时限的信息就失去了使用的价值。
最后一个特征是Value:商业价值高,但是价值密度低。单个数据的价值很低,只有大量数据聚合起来处理才能借助历史数据预测未来走势,体现出大数据计算的价值所在。
HDFS(全称Hadoop Distributed File System)原是Apache开源项目Nutch的组件,现在成为是Hadoop的重要组件,它是一款具有高容错性特点的分布式文件系统,它被设计为可以部署在造价低廉的主机集群上。它将一个大文件拆分成固定大小的小数据块,分别存储在集群的各个节点上。因此HDFS可以存储超大的数据集和单个巨大的文件。这样的分布式结构能够进行不同节点的并行读取,提高了系统的吞吐率。同一个数据块存储在不同的数据节点上,保证了HDFS在节点失败时还能继续提供服务,使其具有了容错性。
Apache HBase是运行于Hadoop平台上的数据库,它是可扩展的、分布式的大数据储存系统。HBase可以对大数据进行随机而实时的读取和写入操作。它的目标是在普通的机器集群中处理巨大的数据表,数据表的行数和列数都可以达到百万级别。受到Google Bigtable 思想启发,Apache开发出HBase, HBase是一个开源的、分布式的、数据多版本储存的、面向列的大数据储存平台。Google的Bigtable是运行于GFS(Google File System)上的,而HBase是运行与Apache开发的Hadoop平台上。
Cassandra是社交网络理想的数据库,适合于实时事务处理和提供交互型数据。以Amazon的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模型,P2P去中心化的存储,目前twitter和digg中都有使用。在CAP特性上(CAP即Consistnecy 一致性,Avaliability 可用性,Partition-tolerance分区容忍性),HBase选择了CP,Cassandra更倾向于AP,而在一致性上有所减弱。
Redis是一种面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景。
Redis是一个支持持久化的内存数据库(与Memcache类似),也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库 数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。
MongoDB 是一个面向集合的,模式自由的文档型数据库。
在数据库里每个聚集有一个唯一的名字,可以包含无限个文档。聚集是RDBMS中表的同义词,区别是聚集不需要进行模式定义。
组织数据的方式如下:Key-Value对 > 文档 > 集合 > 数据库。
多个Key-Value对组织起来形成类似于JSON格式的文档,多个文档组织成为一个集合,多个集合组织起来,就形成了数据库(database)。单个MongoDB实例可以使用多个数据库。
PRAM模型,即并行随机存取机,也称之为SIMD-SM(共享存储的单指令流多数据流)模型,是一种应用于并行计算抽象模型。PRAM模型是顺序的冯·诺伊曼存储程序模型的自然扩展,由若干具有本地存储器的处理器和一个具有无限容量的共享存储器组成,处理器由公共的时钟进行控制,以同步方式运行。
PRAM模型对各个处理机对共享存储器是否可并发读写,可分类为:
优点:
1.RPAM结构简单,简便易行;
2.PRAM能够表达大多数并行算法
3.PRAM让算法设计变得简单;让并行算法更加容易移植到不同的并行系统上;
4.可以按需加入一些诸如同步和通信等功能。
缺点:
1.PRAM是一个同步模型,其同步过程很费时的;
2.模型中使用了一个全局共享存储器,且本地存储容量较小,不能很好的体现当前比较多见的分布主存多处理机的性能瓶颈;
3.单一共享存储器的假定,不适合于异步分布存储的MIMD机器;
4.假定每个处理器均可在单位时间内访问任何存储单元,因此要求处理机间通信无延迟、无限带宽和无开销,忽略多个处理器在访问同一存储空间的竞争问题以及处理器读写存储单元带宽有限性等实践中普遍存在的问题,这一假设显然是不现实的;
5.不能很好地描述多线程技术和流水线预取技术,这两种技术当今并行体系结构应用最普遍的技术。
BSP(Bulk Synchronous Parallel)模型,由哈佛大学Viliant和牛津大学Bill McColl提出,希望像冯·诺伊曼体系结构那样,架起计算机程序语言和体系结构间的桥梁,故又称作桥模型(Bridge Model)。本质上,BSP模型是分布存储的MIMD计算模型,被认为是最有前途的并行计算模型。
一个BSP计算机由n个处理机/存储器组成,通过通信网络进行互联,。一台BSP并行计算机包含三个部分组成:
BSP计算机的运行引入了“超步”的概念,它的运行是以超步为基础的,超步是BSP计算机进行并行计算的基本单位。一个BSP计算由若干超步组成,而每个超步的运行过程又分为三个步骤:
优点:
1.BSP并行模型独立于体系结构,接近现有的并行系统,可以在绝大多数目标体系结构上有效地实现。
2.BSP并行模型以超步为基本单位进行并行计算,这使得BSP并行程序设计简单清晰,有点类似顺序程序的编写。
3.BSP并行程序的性能是可以预测的,可以在系统编写之前进行理论分析预测系统是否可行。
缺点:
1.需要算法设计人员显式地将同步机制编入算法中,导致算法设计有难度。
2.限制每个超级步至多可以传递h条消息,限制了消息传递的效率。
3.BSP(整体大同步)简化了算法的设计和分析,牺牲了算法运行时间,因为路障延迟意味着所有进程必须等待最慢者。一种改进是采用子集同步,将所有进程按照快慢程度分成若干个子集。如果子集小,其中只包含成对的收发者,则它就变成了异步的个体同步,即logp模型。另一种改进是去除路障同步限制,改用异步模式,即异步BSP(A-BSP)。
MapReduce是Google公司提出的一种用于大规模数据集(大于1TB)的并行运算的编程模型。
软件实现
优点:
1、移动计算而不是移动数据,避免了额外的网络负载。
2、任务之间相互独立,实现高容错性。
3、理想状态下可线性扩展的,是为便宜的商业机器而设计的计算模型。
4、MapReduce模型结构简单,终端用户至少只需编写Map和Reduce函数。
5、集群扩展代价曲线平坦。
缺点:
1、一个中心用于同步各个任务。
2、用MapReduce模型来实现常见的数据库连接操作效率低下。
3、MapReduce集群管理、调试、部署以及日志收集工作困难。
4、单个Master节点有单点故障的可能性。
5、当中间结果必须给保留的时候,作业的管理并不简单。
6、对于集群的参数配置调优需要较多经验。
Spark 是一种与 Hadoop 相似的而又强于Hadoop的开源集群计算环境,由加州大学伯克利分校 AMP 实验室开发。Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。
优点:
1.在迭代任务方面,Spark的执行效率更高,远超过Hadoop 。
2.Spark能够做到与用户互动式的查询。
3.快速的故障恢复。RDD的DAG令Spark具有故障恢复的能力。
4.在不同的Action之间,RDD是可以共享的。
缺点:
1.对于多用户多作业的集群来说,Spark的Driver很可能形成整个集群性能的瓶颈。
2.Spark不适用于异步更新共享状态、数据的操作,常见的有增量的网络爬虫系统的数据库。
Impala是CDH(Cloudera Distribution with Apache Hadoop)的一个组件,是一个对大量数据并行处理(MPP-Massively Parallel Processing)的查询引擎。
项目 | MapReduce | Hive | Impala | |
---|---|---|---|---|
结构 | 1、处理数据采用批处理的形式。2、采用高容错的分布式结构,JobTracker和TaskTracker的Master- Slave结构。Master与Slave之间用心跳包保持联系。3、读取HDFS数据需经由NameNode进行定位,在从DataNode读取数据。4、基于主机和机架的感知。 | 1、基于MapReduce,是在MapReduce上加入有限的数据库管理功能的数据仓库2、只有GateWay节点可以接受HQL查询。3、使用本地SQL数据库存储元数据,数据存储与HDFS上。4、通过MapReduce间接读取HDFS数据。 | 1、采用自己的执行引擎,把一个查询拆分成碎片分布到各个节点执行,不依赖MapReduce,不采用批处理形式处理数据。2、各个节点间是对等的,没有Master、Slave之分,各个节点都可以有impala守护进程,都可以接受查询请求。3、各个节点直接从HDFS的本地文件(Raw HDFS Files)中读取数据,不经过NameNode和DataNode。4、由StateStore守护进程保存各个节点的运行状态,以供查询。5、可与Hive使用同一元数据库。6、基于主机和硬盘的感知,提高数据读取速度。7、执行查询过程中无法容错。 | |
原理 | 基于map和reduce思想的函数式编程。 | 把HQL语句编译成为MapReduce作业。 | 将一个查询请求拆分成多个碎片,分布到各个节点执行。 | |
“分而治之”的编程思想 | ||||
用户界面 | 使用命令行进行操作,Web界面可监视任务进度。 | Hive shell,Web 界面BeesWax | 与Hive类似,提供Impala shell和Web UI。 |
HadoopDB旨在结合MapReduce的可扩展性优势和并行数据库的性能、效率优势,以管理和分析大数据。HadoopDB背后的基本思想是,连接多个单节点数据库系统 (PostgreSQL),使用 Hadoop 作为任务协调者和网络通信层;查询用 SQL 表达,但是其执行是使用 MapReduce 框架跨节点并行化的,以便将单一查询工作尽可能推送到相应的节点数据库中。
HadoopDB优点:
1.结合Hive对SQL强大的支持并直接生成map/reduce任务,不需要再手动编写map/reduce程序;
2.利用关系数据库查数据利用单节点的性能优势;
3.利用Hadoop所具有的高容错性、高可用性以及对于高通量计算的性能优越性。
HadoopDB缺点:
1.如果不想手动编写map/reduce程序,则只能查询的SQL语句的数据来源不能来自多张表,原因是因为他目前只相当对一个数据库的多个分块并行查询,所以不能做到多分块的数据关系处理。当然为了实现多表join,可手动改造InputFormat以实现;
2.其数据预处理代价过高:数据需要进行两次分解和一次数据库加载操作后才能使用;
3.将查询推向数据库层只是少数情况,大多数情况下,查询仍由Hive 完成.
4.维护代价过高.不仅要维护Hadoop系统,还要维护每个数据库节点;
5.目前尚不支持数据的动态划分,需要手工一次划分好。
public class HDFSUtil {
private Configuration conf;
private FileSystem HDFS;
public HDFSUtil() throws IOException{
conf=new Configuration();
HDFS=FileSystem.get(conf);
}
//上传文件, @param localFile 本地路径,@param HDFSPath 远程路径
public void upFile(String localFile,String HDFSPath) throws IOException{
InputStream in=new BufferedInputStream(new FileInputStream(localFile));
OutputStream out=HDFS.create(new Path(HDFSPath));
IOUtils.copyBytes(in, out, conf);
}
//附加文件
public void appendFile(String localFile,String HDFSPath) throws IOException{
InputStream in=new FileInputStream(localFile);
OutputStream out=HDFS.append(new Path(HDFSPath));
IOUtils.copyBytes(in, out, conf);
}
//下载文件
public void downFile(String HDFSPath, String localPath) throws IOException{
InputStream in=HDFS.open(new Path(HDFSPath));
OutputStream out=new FileOutputStream(localPath);
IOUtils.copyBytes(in, out, conf);
}
// 删除文件或目录
public void delFile(String HDFSPath) throws IOException{
HDFS.delete(new Path(HDFSPath), true);
}
//获取HBase配置
public static Configuration conf = HBaseConfiguration.create();
//创建HBase表
public static void createTable(String tableName, String[] families) throws Exception {
try{//table create,disable,exist ,drop,use HBaseAdmin
HBaseAdmin hadmin = new HBaseAdmin(conf);//获取Admin对象
if( hadmin.tableExists(tableName)){//检查表是否存在
hadmin.disableTable(tableName);
hadmin.deleteTable(tableName);
System.out.println("table"+tableName+" exist,delete it.");
}
HTableDescriptor tbdesc = new HTableDescriptor(tableName);//创建表描述
for(String family : families){
tbdesc.addFamily(new HColumnDescriptor(family));//创建列族描述
}
hadmin.createTable(tbdesc);//创建表
} catch (MasterNotRunningException e){//捕获Master无法连接异常
e.printStackTrace();
} catch (ZooKeeperConnectionException e) {//捕获ZooKeeper无法连接异常
e.printStackTrace();
}
System.out.println("table "+ tableName+ " create ok.");
//写入数据
public static void putData(String tableName,String rowKey,String family, String qualifier, String value ) throws Exception{
//insert,update,delete,get row,column families, use HTable.
try{
if(qualifier == null) qualifier = "";//列名不提供时
if(value == null) value = "";//不提供数据时
HTable htb = new HTable(conf,tableName);//获取表对象
Put put = new Put(rowKey.getBytes());//获取Put对象
put.add(family.getBytes(),qualifier.getBytes(),value.getBytes());//把数据 插入put对象
htb.put(put);//应用put对象到htb
}
catch (IOException e){
e.printStackTrace();
}
}
public static void getData(String tableName, String rowKey) throws Exception{
try{
HTable htb = new HTable(conf,tableName); //获取表对象
Get get = new Get(rowKey.getBytes());//创建Get对象
Result rs = htb.get(get);//应用get对象并返回Result
for(KeyValue kv:rs.raw()){//读取Result中的数据
System.out.println(new String(kv.getRow()) +":\t" \
+new String(kv.getFamily())+":" \
+new String(kv.getQualifier())+",\t" \
+new String(kv.getValue())+",\t"+kv.getTimestamp());
}
}
catch (IOException e) {
e.printStackTrace();
}
}
数据的不确定性与数据质量
跨领域的数据处理方法的可移植性