序列化:将java程序中的对象 写入持久化到 硬盘当中,转变为二进制的数据,这个过程称为序列化,也叫钝化。
反序列化:而将硬盘中二进制的数据 读取到java程序中转化为对象,这个过程称为反序列化,也叫活化。
应用场景:将内存中的对象数据持久化到硬盘当中;将硬盘中的数据 反序列化到内存当中;在网络中传输对象,都需要使用到序列化和反序列化。代码示例见上篇文章 序列化与反序列化
jdk自带的序列化数据,往往会自带一些其他冗余的数据,比如类名、包名等等,那如何优化呢?
1.借助第三方包方法将对象转化为json字符串写入到硬盘当中
2.直接写属性到硬盘当中(序列化) 从硬盘中读取属性到内存(反序列化)时需要知道序列化时写属性的顺序 示例代码见下 自定义序列化规则
序列化规则(接口)
package demo01;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public interface Writable {
void read(ObjectInputStream ois) throws Exception;
void write(ObjectOutputStream oos) throws Exception;
}
Bean Cat类,实现接口
package demo01;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Cat implements Writable {
private String gender;
private int age;
private String name;
private String color;
public Cat() {
}
public Cat(String gender, int age, String name, String color) {
this.gender = gender;
this.age = age;
this.name = name;
this.color = color;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Cat{" +
"gender='" + gender + '\'' +
", age=" + age +
", name='" + name + '\'' +
", color='" + color + '\'' +
'}';
}
//序列化
@Override
public void write(ObjectOutputStream oos) throws Exception {
oos.writeUTF(this.gender);
oos.writeInt(this.age);
oos.writeUTF(this.name);
oos.writeUTF(this.color);
oos.close();
}
//反序列化
@Override
public void read(ObjectInputStream ois) throws Exception {
this.gender = ois.readUTF();
this.age = ois.readInt();
this.name = ois.readUTF();
this.color = ois.readUTF();
ois.close();
}
}
测试类:
package demo01;
import java.io.*;
public class TestSer {
public static void main(String[] args) throws Exception {
//直接序列化属性
// ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("aaa\\cat.txt"));
// Cat c = new Cat("男", 2, "tom", "蓝色");
// oos.writeUTF(c.getGender());
// oos.writeInt(c.getAge());
// oos.writeUTF(c.getName());
// oos.writeUTF(c.getColor());
// oos.close();
//反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("aaa\\cat.txt"));
String gender = ois.readUTF();
int age = ois.readInt();
String name = ois.readUTF();
String color = ois.readUTF();
Cat c = new Cat(gender, age, name, color);
System.out.println(c);
}
}
迭代器提供了可以遍历容器集合中元素的方法,它不需要知道容器中的数据结构和个数。
简而言之,迭代器模式提供了一种方法,可以对一个容器中的各个元素进行访问,而又不用暴露该容器内部数据组织结构的细节。
迭代器与与普通循环遍历集合的区别:
普通循环遍历集合,比如List 集合当中存入的是所有的元素,占用很大的内存;
而迭代器不一样,迭代器中只需要这个元素的一个对象,即可完成所有元素的遍历,内存占用很小。
迭代器核心方法:hasNext() 、next()
hasNext() 判断是否有元素,有,则返回true 没有返回false
next() 取出元素
例:
while(it.hasNext())
{
Object o=it.next();
}
大数据基本概念
大数据指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强大的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
大数据通常用来形容一个公司创造的大量非结构化数据和半结构化数据,这些数据在下载到关系型数据库用于分析时会花费大量的时间和金钱。
大数据主要解决两个主要问题
- 海量数据的存储 : 例如分布式存储文件系统 : HDFS
- 海量数据的运算: 例如分布式运算框架 : MAPREDUCE,SPARK等
什么是分布式(并行)
就是将一个文件存储在很多台机器上,其实就是有一个系统帮助我们存储文件,这个系统看起来是由目录组成的(也就是说是由统一的路径的,但是该路径和机器上的真实路径是不相关的),将该文件放到这个文件系统的某个路径下的时候,他会将该文件切分成不同的文件块,存放在不同的机器上(用户并不知道里面的存储信息),这就是分布式存储
存储框架
- 分布式文件存储系统HDFS
- 分布式数据库系统 ElasticSearch mongDB hbase redis
计算框架
- 解决的核心问题就是将用户的计算逻辑分布在多台机器上并行计算
- MapReduce计算框架 -- Hadoop中的计算框架
- Spark计算框架 -- 做离线批处理、实时流式处理
- Strom计算框架 -- 做实时流式处理
- flink 实时处理的框架
辅助类工具
- Hive -- 数据仓库工具:可以接受SQL,将SQL语句解析成MapReduce或者Spark程序处理
- Flume -- 数据采集 , 普通的文件数据
- Sqoop -- 数据迁移 , 将结构化的数据库中的数据迁移到分布式文件系统中
- hbase -- 分布式的数据库 , 列式存储的数据库 , 对mysql进行补充
大数据主要技术组件
Sqoop:Sqoop是一款开源的工具,主要用于在Hadoop、Hive与传统的数据库(MySql)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL,Oracle 等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。MYSQL<=============>HDFS
Flume:Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
Kafka:Kafka是一种高吞吐量的分布式发布订阅消息系统,有如下特性:
(1)通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
(2)高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。
(3)支持通过Kafka服务器和消费机集群来分区消息。
(4)支持Hadoop并行数据加载。
Storm:Storm用于“连续计算”,对数据流做连续查询,在计算时就将结果以流的形式输出给用户
Spark:Spark是当前最流行的开源大数据内存计算框架。可以基于Hadoop上存储的大数据进行计算。
Hbase:HBase是一个分布式的、面向列的开源数据库。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。 nosql not only sql
Hive:Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析
R语言:R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。
Mahout:Apache Mahout是个可扩展的机器学习和数据挖掘库。
ZooKeeper:Zookeeper是Google的Chubby一个开源的实现。它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、 分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
Redis:(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库(文件系统),并提供多种语言的API。
ElasticSearch: 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。能够达到实时搜索,稳定,可靠,快速,安装使用方便.
MongoDB:是由C++语言编写的一个介于关系数据库和非关系数据库之间的分布式文件存储的数据库。是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
flink: 是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。Flink以数据并行和流水线方式执行任意流数据程序,Flink的流水线运行时系统可以执行批处理和流处理程序。此外,Flink的运行时本身也支持迭代算法的执行。是当下比较流行的实时计算框架的领头羊!
大数据开发运用场景广泛
- 数据处理的最典型的应用场景:公司产品运营情况分析
- 电商推荐系统:基于海量的浏览行为、购物行为数据,进行大量的算法模型的运算,得出各类推荐结论,以供电商网站页面来为用户进行商品推荐。
- 广告精准推送系统:基于海量的互联网用户的各类数据,统计分析,进行用户画像(得到用户的各种属性标签),然后可以为广告主进行针对性的精准广告投放
- 金融行业,大数据在高频交易、社交情绪分析和信贷风险分析三大金融创新领域发挥重大作用
- 个人生活, 大数据还可以应用于个人生活,利用与每个人相关联的“个人大数据”,分析个人生活行为习惯,为其提供更加周到的个性化服务
- 等等等等
大数据框架之Hadoop
大数据核心技术 ----------->1.分布式存储 2.分布式运算
Hadoop 是一门大数据技术,是一套大数据组件
Hadoop核心组件+Common工具包
HDFS 分布式文件存储系统
MAPREDUCE 分布式运算编程框架
YARN 分布式运算资源调度系统
Common 工具包类
Hadoop思维脑图
个别内容网上借鉴,下篇将进入Hadoop生态技术的正式学习。
更多学习、面试资料尽在微信公众号:Hadoop大数据开发