大数据作业
1.何谓大数据?大数据的基本特征有哪些?
维基(Wiki)百科从处理方法角度给出的大数据定义,即大数据是指利用常用软件工具捕获管理和处理数据所耗时间超过可容忍时间限制的数据集
即数据的规模性(Volume)、高速性(Velocity)以及数据结构多样性(Variety),而在此基础上已经有不同的公司以及研究机构对其进行了扩展
2.试述Hadoop具有哪些特性。
高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。
高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低
3.试述HDFS中的块和普通文件系统中的块的区别。
1、 快照(Snapshot):
GFS中的快照功能是非常强大的,可以非常快的对文件或者目录进行拷贝,并且不影响当前操作(读/写/复制)。GFS中生成快照的方式叫copy-on-write。也就是说,文件的备份在某些时候只是将快照文件指向原chunk,增加对chunk的引用计数而已,等到chunk上进行了写操作时,Chunk Server才会拷贝chunk块,后续的修改操作落到新生成的chunk上。
而HDFS暂时并不支持快照功能,而是运用最基础的复制来完成。想象一下,当HBase上的数据在进行重新划分时(过程类似于hash平衡),HDFS需要对其中的所有数据(P/T级的)进行复制迁移,而GFS只需要快照,多不方便!
2、记录追加操作(append):
在数据一致性方面,GFS在理论上相对HDFS更加完善。
a)GFS提供了一个相对宽松的一致性模型。GFS同时支持写和记录追加操作。写操作使得我们可以随机写文件。记录追加操作使得并行操作更加安全可靠。
b)HDFS对于写操作的数据流和GFS的功能一样。但是,HDFS并不支持记录追加和并行写操作。NameNode用INodeFileUnderConstruction属性标记正在进行操作的文件块,而不关注是读还是写。DataNode甚至看不到租约!一个文件一旦创建、写入、关闭之后就不需要修改了。这样的简单模型适合于Map/Reduce编程。
3、垃圾回收(GC):
a)GFS垃圾回收采用惰性回收策略,即master并不会立即回收程序所删除的文件资源。 GFS选择以一种特定的形式标记删除文件(通常是将文件名改为一个包含时间信息的隐藏名字),这样的文件不再被普通用户所访问。Master会定期对文件的命名空间进行检查,并删除一段时间前的隐藏文件(默认3天)。
b)HDFS并没有采用这样的垃圾回收机制,而是采取了一种更加简单但是更容易实现的直接删除方式。
c)应该说延迟回收和直接删除各有优势。延迟回收为那些“不小心“的删除操作留了后路。同时,回收资源的具体操作时在Master结点空闲时候完成,对GFS的性能有很好的提高。但是延迟回收会占用很大的存储空间,假如某些可恶的用户无聊了一直创建删除文件怎么办?
4.什么是集群技术?集群技术的有点是什么?
集群技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。
集群的优点如下:
(1)提高性能
(2)降低成本
(3)提高可扩展性
(4)增强可靠性
5.简述MapReduce的运行步骤。
MapReduce的过程大致分为Map(映射)-->Shuffle(排序)-->Combine(组合)-->Reduce(归约
6.Hbase的特点是什么。Hbase在Hadoop体系结构中的角色。
HBase具有以下特点:
(1)面向列:面向列(族)的存储和权限控制,列(族)独立检索。
(2)大表:表可以非常大,一个表可以有上亿行、上百列。
(3)稀疏:列族中的列可以动态增加,一般情况下,列比较多,一行数据只有少数的列有值,而对于空值,HBase并不存储。因此,表可以设计的非常稀疏。
(4)非结构化:HBase不是关系型数据库,适合存储非结构化的数据。
(5)数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳。
(6)数据类型单一:HBase中的数据都是字符串,没有其他类型。
(7)数据操作简单:HBase只有很简单的插入、查询、删除、清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系。
(8)线性扩展:当存储空间不足时,可以通过简单地增加节点的方式进行扩展。
Hbase在Hadoop体系结构中的数据过滤器角色
7.试述NoSQL数据库的四大类型。各自的使用场合和优缺点。
1、键值(Key-Value)存储数据库
键值数据库适用于那些频繁读写,拥有简单数据模型的应用。键值数据库中存储的值可以是简单的标量值,如整数或布尔值,也可以是结构化数据类型,比如列表和JSON结构
键值数据库广泛应用于以下类型的应用:
从关系型数据库缓存数据来用于提高性能
对Web应用暂时性数据的追踪,例如购物车数据等
存储配置和用户数据信息的移动应用
需要存储图片和音频文件等较大对象的应用
2、列存储数据库
列族数据库被设计应用于大量数据的情况,它保证了读取和写入的性能和高可用性。谷歌推出Bigtable来应对其服务需求。Facebook开发Cassandra 来支持其收件箱搜索服务
列族数据库广泛适用于如下情况:
那些对数据库写操作能力有着特殊要求的应用程序
数据在地理上分布于多个数据中心的应用程序
可以容忍副本中存在短期不一致情况的应用程序
拥有动态字段的应用程序
拥有潜在大量数据的应用程序,大到几百TB的数据
3、文档型数据库
文档型数据库按照灵活性的标准设计。如果一个应用程序需要存储不同的属性以及大量的数据,那么文档数据库将会是一个很好的选择。例如,要在关系数据库中表示产品,建模者可以使用通用的属性和额外的表来为每个产品子类型存储属性。文档数据库却可以更为简单的处理这种情况。
数据库适用于如下一些用例,包括:
用于后台具有大量读写操作的网站
管理数据类型和变量属性,比如产品
跟踪元数据的变量类型
使用JSON数据结构的应用
使用类似结构套结构等非规范化数据的应用程序
4、图形(Graph)数据库
图形数据库非常适合表示网络实体连接等问题。评估图形数据库有效性的一种方法是确定实例和实例间是否存在关系。。
用于图形数据库。其他类似问题的例子包括:
网络和IT基础设施管理
认证与访问权限管理
商业流程管理
产品和服务推荐
社交网络
二、编程题
1.
import java.io.IOException;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.conf.Configuration;
public class select{
public static void QueryByCondition1(String tableName) {
HTablePool pool = new HTablePool(configuration, 1000);
HTable table = (HTable) pool.getTable(Employee);
try {
Get scan = new Get("Jie".getBytes());
Result r = table.get(scan);
for (KeyValue keyValue : r.raw()) {
System.out.println("City:" + new String(keyValue.getCity())
+ "====值:" + new String(keyValue.getValue()));
System.out.println("Town:" + new String(keyValue.getTown())
+ "====值:" + new String(keyValue.getValue()));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.1创建表
import java.io.IOException;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.conf.Configuration;
public class CreateTable {
public static void main(String[] args) throws IOException {
Configuration con = HBaseConfiguration.create();
HBaseAdmin admin = new HBaseAdmin(con);
HTableDescriptor tableDescriptor = new
TableDescriptor(TableName.valueOf("Company"));
tableDescriptor.addFamily(new HColumnDescriptor("Name"));
tableDescriptor.addFamily(new HColumnDescriptor("Address"));
tableDescriptor.addFamily(new HColumnDescriptor("What"));
admin.createTable(tableDescriptor);
System.out.println(" Table created ");
}
}
2.2查询所有的记录
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;
public class RetriveData{
public static void main(String[] args) throws IOException, Exception{
Configuration config = HBaseConfiguration.create();
HTable table = new HTable(config, "Company");
Get g = new Get(Bytes.toBytes("row1"));
// Reading the data
Result result = table.get(g);
// Reading values from Result class object
byte [] value = result.getValue(Bytes.toBytes("Address"),Bytes.toBytes("Country"));
byte [] value1 = result.getValue(Bytes.toBytes("Address"),Bytes.toBytes("Province"));
byte [] value2 = result.getValue(Bytes.toBytes("Address"),Bytes.toBytes("City"));
// Printing the values
String Country= Bytes.toString(value);
String Province = Bytes.toString(value1);
String City= Bytes.toString(value2);
System.out.println("Country= : " + Country + " Province: " +Province+ " City:" City);
}
}
2.3插入数据
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;
public class RetriveData{
public static void insertData(String tableName) {
Configuration config = HBaseConfiguration.create();
HTable table = new HTable(config, "Company");
Put put = new Put(rowKey.getBytes());
put.addColumn(ShortName.getBytes(), LongName.getBytes(), Country.getBytes(),Province.getBytes(),City.getBytes(),What.getBytes());
try {
table.put(put);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("end insert data ......");
}
}ase的Employee表中Jie的City和Town。
(2)编写java程序,完成Hbase中的Company表的创建、数据的插入和查询所有纪录。Company的信息如下表所示。