精华内容
下载资源
问答
  • 首次发文

    2019-10-04 14:11:57
    自开通博客9个月以来,从未提笔写下过什么,也不记得当初开通的原因。未提笔,很大程度上源于自己的懒惰,没有决心去静下心来总结自己这一路的教训与收获。...为什么会常用却记不住?个人认为首要原因是没用心,...

      自开通博客9个月以来,从未提笔写下过什么,也不记得当初开通的原因。未提笔,很大程度上源于自己的懒惰,没有决心去静下心来总结自己这一路的教训与收获。每次想起什么想查阅的时候,总是打开百度或者google,脑子不记事,好像很容易查到的东西都懒得去记,这样以来浪费了很多不必要的时间。每次做那些无谓的查阅,脑子里都会浮现出来5个字:常用记不住。为什么会常用却记不住?个人认为首要原因是没用心,其次是没找到自己乐意接受并主动去记住的方法去回顾。查阅的当时正沉溺于工作情景中,一心想快速做好手头的事,停下来的时候,盲目认为自己记得住,无须再动手。平时有用有道记笔记的习惯,但都比较零碎,无法勾起自己系统回忆的欲望,只是提供了一些当前需求下的琐碎知识点供查阅。

      后续希望自己能多一点耐心,沉下去,多总结一些完整的方法,慢慢成长。

    转载于:https://www.cnblogs.com/lmxHome/p/8072720.html

    展开全文
  • 大数据学习路线

    2019-09-20 16:52:31
    单纯靠人脑记忆:远古时期的智人,买东西的时候不会记录下来自己这次花了多少钱,买了多少东西,只是单纯的记录在自己的大脑里,很快就忘记,记都记不住更不用说去分析处理一下数据了。 记录在纸上:有了造纸术...

    一、为什么要学习大数据?

    我们对数据的存储以及处理大致可以划分为以下几个阶段:

    1. 单纯靠人脑记忆:远古时期的智人,买东西的时候不会记录下来自己这次花了多少钱,买了多少东西,只是单纯的记录在自己的大脑里,很快就会忘记,记都记不住更不用说去分析处理一下数据了。

    2. 记录在纸上:有了造纸术之后,我们就把数据记录到了纸上,数据就不那么容易丢失,而且我们还可以对数据做一些简单的处理,比如说记个账,算算自己这一个月总共花了多少钱。这个时期数据已经可以存储下来了,并且还可以做一些简单的计算,但是,纸容易腐烂导致数据易丢失,可靠性不是很高。

    3. 记录在磁盘/U盘中:有了计算机之后,有了磁盘,后来又有了U盘,我们就可以把原来写在纸上的东西以文件的形式放到磁盘中,磁盘不容易坏,这大大提高了数据的可靠性。

    4. 分布式的存储:对于少量数据的存储和处理,我们只需要用一个磁盘就可以解决,但是随着数据量的增加,任何单一的磁盘都不足以容纳海量的数据。当一头牛拉不动的时候,不要试图用一头更强壮的牛,用两头牛。所以我们就会使用两块磁盘来存储,就有了分布式存储这一概念。数据的存储在多台机器上,自然,数据的处理也发生在多台机器上。对于存储在多台机器上的数据,其数据存储方式和处理方式自然有别于在单台机器上存取和处理数据。因此,大家学习大数据技术的目的就是为了解决在多台机器上存取和处理海量数据这两个问题的

    啥叫分布式存储?就是分开存储,分开管理呗;那啥叫分布式计算?就是你算 50%,我算 50%,咱俩合起来 100%呗。大家在学习大数据的时候会遇到很多或许你从未听过的名词,不要被那些专业术语吓到,说白了都是学术界搞的装13的词。

    就像你学习 Spring 的时候有人就会这样跟你说:先学习 IOC 和 AOP 思想。博主当初学的时候上网上到处找关于 IOC 和 AOP 思想的文章看,看了很多还是看不懂。最后找了个 Spring 的视频,跟着视频敲了几天代码就搞懂了,在类上加个 @Service@Repository@Component注解,在需要这些类实例的成员变量上加上@Autowired注解,这样在 Spring 启动的时候就会自动创建被 @Service,@Repository,@Component注解的类的对象,并且会把对象的引用赋值给被@Autowired注解的成员变量上,然后你写代码的时候就不用手动 new 对象了,这就把对象的控制权从你的手上转移到 Spring 上了,这就 IOC(控制反转) 了;再比如@Transactional注解,大家在做事务性操作(增删改)的时候经常使用,它内部其实就是先把向数据库自动提交 SQL 语句的操作关上,然后等你的所有 SQL 全部执行完毕,在把自动提交开开,然后你对数据库的操作就要么全部执行成功,要么全部执行失败了,你只要是想实现事务,在方法上加上@Transactional注解就可以了,也不用在业务代码里面去改自动开关连接了,就不会污染你的代码了,这就 AOP(面向切面编程)了。就这么回事。

    二、如何学习大数据?

    知道了为什么要学习大数据,那么该如何学习大数据呢?该学习哪些东西呢?从哪里开始呢?

    1. 分布式存储

    首先是解决海量数据的存储,大家学习大数据第一步就是要学习 HDFS(Hadoop Distributed File System),HDFS 是在 Linux 之上的一套分布式的文件系统。

    大家首先要学会熟练安装 hadoop(因为 hadoop 中包含了 hdfs)(大家也不要对安装这个词过于畏惧,其实就是解压个 jar 包,配置个环境变量,非常轻量的,在电脑上安装个虚拟机,反复练就完了,弄坏了,重新新建个虚拟机就行了),然后要熟练掌握 HDFS 的基本命令(其实,你使用 hdfs 的命令和使用 linux 的命令差不多,比方说,我们在 linux 中创建目录的命令是:mkdir temp,使用 hdfs 创建目录的命令是:hdfs dfs -mkdir /temp),熟练使用 hdfs 是大数据的基本功,就像你要在 linux 上做开发,一些基本的 linux 命令你就必须掌握;你要在 HDFS 上做大数据开发,那么一些基本的 hdfs 命令你就必须掌握。

    同时,HDFS 也是后续分布式计算数据的主要来源,它的重要性就好比我们做 J2EE 开发时的数据库一样。做 Java 开发我们主要是操作 MySql 数据库中的数据,对数据库中的数据进行增删改查;而做大数据开发我们操作的数据大部分都是 HDFS 上的,对 HDFS 上的数据进行复杂查询。

    注意:HDFS 上的数据是不会修改和删除的,因为大数据开发的主要目的是针对已有的海量数据做分析,而不是做事务性操作。比方说:我们经常会分析网站某天的流量变化情况,而用户访问网站这个行为属于历史行为,是不可以修改的,如果修改了,那么后续的数据分析工作都毫无意义了;或许会有人问:那如果有一些错误的数据怎么办呢?我们在分析数据之前会有一步操作,叫数据清洗,在这步操作中,会把一些错误的不准确的数据过滤掉。

    学完了 HDFS 大家其实就可以学习一个基于 HDFS 的 NoSQL => HBASE。

    HBase 是以 HDFS 为基础的,HDFS 的数据是存在磁盘上的,那它为什么叫 NoSql 呢?

    HBase 的数据存储的格式不同于传统的关系型数据库,关系型数据库是以行为单位进行存储,而 HBase 是以列为单位进行存储,也是以 key-value 对的方式来存储数据的,存储的数据会先放在内存中,内存满了再持久化到 HDFS。

    2. 分布式计算

    学会了如何存取 HDFS 上的数据,接下来我们就需要学习如何对 HDFS 上的数据进行计算。因为 HDFS 属于分布式文件系统,在分布式文件系统上对数据的计算,自然也就叫分布式计算。分布式计算又分两种:离线计算,实时计算;还可以称这两种计算方式分别为批处理,流计算。对于这两种计算,我们首先要先学习离线计算,然后再学习实时计算。

    2.1. 离线计算/批处理

    大家在做 JavaEE 开发时,比如:电商后台统计所有订单的签收情况,订单签收情况来源于订单的物流轨迹,而查询订单的物流轨迹又需要调用对应物流公司提供的API,而物流公司为了防止频繁调用API发生 DDOS,常常对接口 API 进行调用的限制(例如:1秒只允许查询一次)。所以,对于大量的订单没有办法立即获得统计结果;因此,对于这样耗时比较长的计算,就会写成一个定时任务,每天晚上执行一次计算,第二天看结果。

    大数据领域的离线计算和上面的例子类似,我们写完了一个离线计算程序(MapReduce 程序或 Spark程序)之后,提交到服务器集群上,然后它就开始运行,几个小时之后或者第二天获取运行结果。与 JavaEE 的定时任务不同的是:大数据领域计算的数据量是巨大的,通常是 PB 级别的,只用单机的定时任务来处理数据那猴年马月也计算不完,而大数据领域使用分布式的离线计算则可以大大地减少时间。

    2.1.1. MapReduce

    离线计算首先要学习的就是开发 MapReduce 程序。

    开发 MapReduce 程序的步骤如下:

    1. 创建 Maven 工程
    2. 导入 Hadoop 所需的 pom 依赖
    3. 继承相关的类,实现相关的方法
    4. 编写主程序,含 main 方法的那个类
    5. 打成 jar 包
    6. 上传到 linux 服务器上
    7. 执行 hadoop 命令将 mapreduce 程序提交到 yarn 上运行

    看了上面的步骤之后,大家对 mapreduce 程序应该不是那么的畏惧了,就像开发我们的 JavaEE 项目一样简单。

    上面出现了一个大家不熟悉的词:yarn。yarn 相当于一个运行 mapreduce 程序的容器;它就好比大家在 J2EE 开发的时候使用的 Tomcat,Weblogic。yarn 没有什么好说的就是一个资源分配运行 mapreduce 程序的容器。

    2.1.2. Hive

    学习完了开发 mapreduce 程序,再学习 Hive。

    为什么要按照这个顺序?

    hive是啥?

    在网上一搜,有人说它是数据仓库,有人说它是数据分析引擎,那它到底是啥?有没有说人话的来解释一下? ---- 博主当时百度的时候就是这么想的。

    1. 学 hive 首先也要先学会安装(其实也是官网下载压缩包,解压,配置环境变量,修改配置文件,执行命令初始化),这里暂不讨论。

    2. 之后再在 linux 上执行命令 hive,就启动了 hive,hive是长这样的,直观感受一下:

    3. 像不像启动 mysql 时的样子?然后大家就可以在 hive 里面输入 SQL 语句,像 show tables;,select * from bigtable;,就像操作 mysql 一样去操作 hive。所以,有人称 hive 为数据仓库。那么 hive 里面的数据存储在哪里呢?相信大家已经猜到了,就是一开始提到的 HDFS 中。

    4. 那么,为什么又有人称 hive 为数据分析引擎呢?大家在 hive 中执行 SQL 语句时有想过 hive 对这条语句做了什么吗?其实,hive 是把这条查询语句转化成了一个 mapreduce 程序,我们在 hive 中执行的复杂查询其实都是转换成了一个 mapreduce 程序,而 mapreduce 程序它是用来做分布式计算的,所以就有人称 hive 为数据分析引擎。

    学习 hive 其实就是在学习 hive 的查询语句(Hive Query Language),建表语句。

    2.1.3. Pig

    另一个和 Hive 类似的数据分析引擎叫 Pig,它使用一种叫 Piglatin 的查询语句来查询数据,企业中用的不多,大部分用的都是 Hive,感兴趣的同学可以自行百度。

    2.1.4. Sqoop

    无论是手动编写 mapreduce 程序还是直接使用 hive 来处理数据,操作的都是 hdfs 上的数据,那 hdfs 上的数据又是哪里来的呢?难道是手动输入的?

    拿电商来举例,我们的订单数据都是存在关系型数据库 MySql,Oracle 中的,而我们需要操作 HDFS 上的数据,就需要把我们关系型数据库中的数据导入到 HDFS 上;对于处理完的数据,又需要导出到关系型数据库中(因为前端界面展示的数据主要都是去查的数据库)。Sqoop 的功能就是在关系型数据库和 HDFS 之间导入和导出数据。

    其实学 sqoop 也很简单,首先是安装(和 hive 类似,其实整个大数据中大部分框架的安装过程都是类似的:官网下载压缩包,解压,改配置文件,执行命令初始化),然后是执行 sqoop 命令,学习 sqoop 其实就是学习 sqoop 命令。

    例:将 mysql 中的数据导入到 HDFS 上:

    sqoop import --connect jdbc:mysql://localhost:3306/dbname --username root --password 123 --table cate --target-dir /data
    
    2.1.5. Flume

    学完了 sqoop,我们已经可以把 mysql,oracle 上的数据导入到 HDFS 上了,那么对于一些访问日志,像 Ngnix 的访问日志,怎么将这些日志文件导入到 HDFS 上呢?

    所以,接下来我们就要学习 Flume 这个日志采集引擎(当然,你也可以先学 FLume),它的主要作用就是采集日志文件,监控文件或目录,当文件或目录的内容发生变化后实时的将数据发送到指定目的。

    先官网下载压缩包,解压,修改环境变量,修改配置文件,然后执行命令启动 flume,flume会根据你配置文件中的参数,去监控指定的文件或目录,当文件或目录内容发生变化的时候就会将数据发送到 HDFS 或者其他的目的。

    PS:大数据的大部分框架(99%)的安装过程都类似,后面就不再啰嗦了。

    2.1.6. Spark

    其实学完上面的部分,离线计算的部分已经差不多了,已经可以解决一些需求了。但是,人类的欲望总是永无止境的,总是渴望更高,更快,更强。mapreduce 计算框架在计算的时候,每一步的计算结果都是持久化到磁盘上的,在进行下一步操作的时候就需要进行磁盘IO,效率就比较低。

    因此,Spark 横空出世。Spark 把中间过程的计算结果放在内存中,因此大大提高了离线计算的计算效率。Spark 也是企业中使用最广的大数据计算框架,因为它还提供了一个可以进行实时计算的子模块 SparkStreaming,后面会提到(就像 Spring 有 SpringMVC 这个子模块一样)。Spark 既可以进行离线计算也可以使用 SparkStreaming 进行实时计算,所以大部分企业都会选择使用 Spark 来作为核心的计算框架(因为统一了嘛,实现需求的时候就不用这个功能用A框架实现,另一个功能用B框架实现,不好维护),而 Hadoop 中的 mapreduce 框架只是起一个辅助作用。

    2.1.7. Scala

    大家在学习 Spark 之前需要先学一门语言:Scala。Scala 是一个语法比较杂的编程语言,你学 Scala 的时候会觉得它和 JS,Java,C++ 都有点像;而且它兼容 Java,也运行在 JVM 上,你用 Java 写的工具类和方法可以直接被 Scala 类方法调用,反之亦然。

    虽然 Spark 程序也可以使用 Java 来编写,但是,用 Scala 编写会更加简洁一些,一般企业中编写 Spark 程序也是用的 Scala,很多大数据的招聘也要求你得会使用 Scala。

    2.2. 实时计算/流计算

    像统计过去一年订单中某件商品的销售总额这类需求,对实时性要求不高,一般会使用离线计算程序(mapreduce)来计算。但是,像网站访问的PV,UV,每天各小时的流量这种类型的需求,hadoop 的 mapreduce 框架或者叫编程模型的计算效率就有点低。所以为了应对实时性较高的需求就需要学习一些实时计算框架。

    2.2.1. Storm

    Storm 属于老牌经典的实时计算框架,大部分公司内部都有使用,编程模式和 mapreduce 极其相似,导 jar 包,实现接口,main 方法,打 jar 包,向集群提交,运行。

    在本地编写 Storm 程序也是相当的方便,环境都不需要配,建立 maven 工程导入依赖,写代码,右击运行就 OK。

    2.2.2. JStorm

    jstorm

    Jstorm 是阿里在 Strom 的基础上对其性能进行了改良和优化后的产物,用法和 Strom 类似,你用 storm 写的代码都不需要做太大的修改就可以直接运行在 JStorm 集群上。

    2.2.3. SparkStreaming

    在上面讲离线计算的时候已经提到了 SparkStreaming,它是 Spark 的一个子模块,用于进行实时计算,那它和 Strom 有什么不同呢?

    Strom 是真正的实时,来一个数据就处理一个;而 SparkStreaming 是以时间段的方式,是个伪实时,比如每过 5 秒才集中处理一下过去5秒内的发送过来的数据。

    Storm 和 SparkStreaming 在企业中可以说是平分秋色,用的都比较多。

    2.2.4. Kafka

    Storm,JStorm,SparkStreaming 它们接收的都是实时发送过来的数据,那这个数据是从那里来的呢?

    在介绍离线计算的时候,我们知道了 Flume 可以实时的监控文件目录,当文件内容增多或目录中的文件发生变化时可以发送数据到指定目的,这里的目的就可以是 Storm,JStorm,SparkStreaming。但是,数据发送速度非常快的时候,有的数据可能来不及接收,然后数据就丢失了,针对这种情况我们一般会使用消息中间件来做缓存,暂时的将发送过来的数据缓存到中间件里。Kafka 就是大数据常用的一种消息中间件。

    在企业中一般的做法是:Flume 实时监控目录或文件末尾,数据发生变化后送到 Kafka 缓存,Kafka 再将数据送到 SparkStreaming,Storm等实时计算组件中。

    所以,大家在学实时计算框架的时候也需要学一下 Kafka 这个缓存组件。

    2.2.5. Zookeeper

    最后,大数据技术要真正应用于企业的开发,需要保证它的 HA(High Availaibility) 高可用性,大家在搭建 Hadoop 集群,Spark 集群,Storm 集群的时候都会用上 Zookeeper,将 Hadoop,Spark,Storm 的元信息存储到 Zookeeper 上,防止因为某个节点宕机而造成数据计算失败。

    其实,根据名字和图片大家就可以猜出来 Zookeeper 在整个大数据体系中的作用:动物园管理者。Hadoop 是一头大象,Hive 是个小蜜蜂,HBase 是小鲸鱼,Pig 是一头猪…,zookeeper 就是用来确保这些 “小动物” 的稳定性可用性。

    三、大数据整体架构

    最后上一幅博主手绘的大数据架构图。企业中的大数据平台整体架构和上面的类似。

    1. 最底层是数据源,可以来自关系型数据库,用户访问日志等。
    2. 网上就是数据采集层,就需要我们使用 Sqoop / Flume 采集关系型数据库,日志中的数据,当然,我们也可以使用爬虫去爬取其他公共网站的数据。
    3. 再往上,我们采集完了数据就要把它存储到 HDFS 上,实时的就送到 Kafka。离线计算就用 Hive,MapReduce 调 HDFS 的数据,实时的就通过 Storm,JStorm,SparkStreaming 取 Kafka 中的数据再进行计算。
    4. 再向上,就是数据挖掘层,就是一直炒的火热的人工智能,机器学习,深度学习云云。其实就是一系列复杂的算法,而这都是在拥有海量数据的基础之上才能开始做的,没有数据做支撑,算法就是个空壳,就好像你买了个榨汁机,但是却没有水果。所以,就有人说:大数据是人工智能的血液。
    5. 再向上,就是大家最熟悉的一层,产品经理就住在这一层。

    相信看到这里大家对大数据已经没有那么陌生了。

    最后,祝大家顺利入门大数据,找到一份好工作。

    展开全文
  • 1.单纯靠人脑记忆:远古时期的智人,买东西的时候不会记录下来自己这次花了多少钱,买了多少东西,只是单纯的记录在自己的大脑里,很快就忘记,记都记不住更不用说去分析处理一下数据了。 2.记录在纸上:有了造纸...

    一、为什么要学习大数据?

    我们对数据的存储以及处理大致可以划分为以下几个阶段:

    1.单纯靠人脑记忆:远古时期的智人,买东西的时候不会记录下来自己这次花了多少钱,买了多少东西,只是单纯的记录在自己的大脑里,很快就会忘记,记都记不住更不用说去分析处理一下数据了。

    2.记录在纸上:有了造纸术之后,我们就把数据记录到了纸上,数据就不那么容易丢失,而且我们还可以对数据做一些简单的处理,比如说记个账,算算自己这一个月总共花了多少钱。这个时期数据已经可以存储下来了,并且还可以做一些简单的计算,但是,纸容易腐烂导致数据易丢失,可靠性不是很高。

    3.记录在磁盘/U盘中:有了计算机之后,有了磁盘,后来又有了U盘,我们就可以把原来写在纸上的东西以文件的形式放到磁盘中,磁盘不容易坏,这大大提高了数据的可靠性。

    4.分布式的存储:对于少量数据的存储和处理,我们只需要用一个磁盘就可以解决,但是随着数据量的增加,任何单一的磁盘都不足以容纳海量的数据。当一头牛拉不动的时候,不要试图用一头更强壮的牛,用两头牛。所以我们就会使用两块磁盘来存储,就有了分布式存储这一概念。数据的存储在多台机器上,自然,数据的处理也发生在多台机器上。对于存储在多台机器上的数据,其数据存储方式和处理方式自然有别于在单台机器上存取和处理数据。因此,大家学习大数据技术的目的就是为了解决在多台机器上存取和处理海量数据这两个问题的。

    啥叫分布式存储?就是分开存储,分开管理呗;那啥叫分布式计算?就是你算 50%,我算 50%,咱俩合起来 100%呗。大家在学习大数据的时候会遇到很多或许你从未听过的名词,不要被那些专业术语吓到,说白了都是学术界搞的装13的词。

    就像你学习 Spring 的时候有人就会这样跟你说:先学习 IOC 和 AOP 思想。博主当初学的时候上网上到处找关于 IOC 和 AOP 思想的文章看,看了很多还是看不懂。最后找了个 Spring 的视频,跟着视频敲了几天代码就搞懂了,在类上加个@Service,@Repository,@Component注解,在需要这些类实例的成员变量上加上@Autowired注解,这样在 Spring 启动的时候就会自动创建被@Service,@Repository,@Component注解的类的对象,并且会把对象的引用赋值给被@Autowired注解的成员变量上,然后你写代码的时候就不用手动 new 对象了,这就把对象的控制权从你的手上转移到 Spring 上了,这就 IOC(控制反转) 了;再比如@Transactional注解,大家在做事务性操作(增删改)的时候经常使用,它内部其实就是先把向数据库自动提交 SQL 语句的操作关上,然后等你的所有 SQL 全部执行完毕,在把自动提交开开,然后你对数据库的操作就要么全部执行成功,要么全部执行失败了,你只要是想实现事务,在方法上加上@Transactional注解就可以了,也不用在业务代码里面去改自动开关连接了,就不会污染你的代码了,这就 AOP(面向切面编程)了。就这么回事。【大数据开发学习资料领取方式】:加入大数据技术学习交流扣群522+数字189+数字307,点击加入群聊,私信管理员即可免费领取

    二、如何学习大数据?

    知道了为什么要学习大数据,那么该如何学习大数据呢?该学习哪些东西呢?从哪里开始呢?

    1. 分布式存储

    首先是解决海量数据的存储,大家学习大数据第一步就是要学习 HDFS(Hadoop Distributed File System),HDFS 是在 Linux 之上的一套分布式的文件系统。

    大家首先要学会熟练安装 hadoop(因为 hadoop 中包含了 hdfs)(大家也不要对安装这个词过于畏惧,其实就是解压个 jar 包,配置个环境变量,非常轻量的,在电脑上安装个虚拟机,反复练就完了,弄坏了,重新新建个虚拟机就行了),然后要熟练掌握 HDFS 的基本命令(其实,你使用 hdfs 的命令和使用 linux 的命令差不多,比方说,我们在 linux 中创建目录的命令是:mkdir temp,使用 hdfs 创建目录的命令是:hdfs dfs -mkdir /temp),熟练使用 hdfs 是大数据的基本功,就像你要在 linux 上做开发,一些基本的 linux 命令你就必须掌握;你要在 HDFS 上做大数据开发,那么一些基本的 hdfs 命令你就必须掌握。

    同时,HDFS 也是后续分布式计算数据的主要来源,它的重要性就好比我们做 J2EE 开发时的数据库一样。做 Java 开发我们主要是操作 MySql 数据库中的数据,对数据库中的数据进行增删改查;而做大数据开发我们操作的数据大部分都是 HDFS 上的,对 HDFS 上的数据进行复杂查询。

    注意:HDFS 上的数据是不会修改和删除的,因为大数据开发的主要目的是针对已有的海量数据做分析,而不是做事务性操作。比方说:我们经常会分析网站某天的流量变化情况,而用户访问网站这个行为属于历史行为,是不可以修改的,如果修改了,那么后续的数据分析工作都毫无意义了;或许会有人问:那如果有一些错误的数据怎么办呢?我们在分析数据之前会有一步操作,叫数据清洗,在这步操作中,会把一些错误的不准确的数据过滤掉。

    学完了 HDFS 大家其实就可以学习一个基于 HDFS 的 NoSQL => HBASE。

    HBase 是以 HDFS 为基础的,HDFS 的数据是存在磁盘上的,那它为什么叫 NoSql 呢?

    HBase 的数据存储的格式不同于传统的关系型数据库,关系型数据库是以行为单位进行存储,而 HBase 是以列为单位进行存储,也是以 key-value 对的方式来存储数据的,存储的数据会先放在内存中,内存满了再持久化到 HDFS。

    2. 分布式计算

    学会了如何存取 HDFS 上的数据,接下来我们就需要学习如何对 HDFS 上的数据进行计算。因为 HDFS 属于分布式文件系统,在分布式文件系统上对数据的计算,自然也就叫分布式计算。分布式计算又分两种:离线计算,实时计算;还可以称这两种计算方式分别为批处理,流计算。对于这两种计算,我们首先要先学习离线计算,然后再学习实时计算。

    2.1. 离线计算/批处理

    大家在做 JavaEE 开发时,比如:电商后台统计所有订单的签收情况,订单签收情况来源于订单的物流轨迹,而查询订单的物流轨迹又需要调用对应物流公司提供的API,而物流公司为了防止频繁调用API发生 DDOS,常常对接口 API 进行调用的限制(例如:1秒只允许查询一次)。所以,对于大量的订单没有办法立即获得统计结果;因此,对于这样耗时比较长的计算,就会写成一个定时任务,每天晚上执行一次计算,第二天看结果。

    大数据领域的离线计算和上面的例子类似,我们写完了一个离线计算程序(MapReduce 程序或 Spark程序)之后,提交到服务器集群上,然后它就开始运行,几个小时之后或者第二天获取运行结果。与 JavaEE 的定时任务不同的是:大数据领域计算的数据量是巨大的,通常是 PB 级别的,只用单机的定时任务来处理数据那猴年马月也计算不完,而大数据领域使用分布式的离线计算则可以大大地减少时间。

    2.1.1. MapReduce

    离线计算首先要学习的就是开发 MapReduce 程序。

    开发 MapReduce 程序的步骤如下:

    •创建 Maven 工程•导入 Hadoop 所需的 pom 依赖•继承相关的类,实现相关的方法•编写主程序,含 main 方法的那个类•打成 jar 包•上传到 linux 服务器上•执行 hadoop 命令将 mapreduce 程序提交到 yarn 上运行

    看了上面的步骤之后,大家对 mapreduce 程序应该不是那么的畏惧了,就像开发我们的 JavaEE 项目一样简单。

    上面出现了一个大家不熟悉的词:yarn。yarn相当于一个运行 mapreduce 程序的容器;它就好比大家在 J2EE 开发的时候使用的 Tomcat,Weblogic。yarn 没有什么好说的就是一个资源分配运行 mapreduce 程序的容器。

    2.1.2. Hive

    学习完了开发 mapreduce 程序,再学习 Hive。

    为什么要按照这个顺序?

    hive是啥?

    在网上一搜,有人说它是数据仓库,有人说它是数据分析引擎,那它到底是啥?有没有说人话的来解释一下?---- 博主当时百度的时候就是这么想的。

    1.学 hive 首先也要先学会安装(其实也是官网下载压缩包,解压,配置环境变量,修改配置文件,执行命令初始化),这里暂不讨论。

    2.之后再在 linux 上执行命令hive,就启动了 hive,启动过程就类似 mysql 的 CMD 窗口的启动过程。

    3.然后大家就可以在 hive 里面输入 SQL 语句,像show tables;,select * from bigtable;,就像操作 mysql 一样去操作 hive。所以,有人称 hive 为数据仓库。那么 hive 里面的数据存储在哪里呢?相信大家已经猜到了,就是一开始提到的 HDFS 中。

    4.那么,为什么又有人称 hive 为数据分析引擎呢?大家在 hive 中执行 SQL 语句时有想过 hive 对这条语句做了什么吗?其实,hive 是把这条查询语句转化成了一个 mapreduce 程序,我们在 hive 中执行的复杂查询其实都是转换成了一个 mapreduce 程序,而 mapreduce 程序它是用来做分布式计算的,所以就有人称 hive 为数据分析引擎。

    学习 hive 其实就是在学习 hive 的查询语句(Hive Query Language),建表语句,就和操作 mysql 查询数据类似。

    2.1.3. Pig

    另一个和 Hive 类似的数据分析引擎叫 Pig,它使用一种叫 Piglatin 的查询语句来查询数据,企业中用的不多,大部分用的都是 Hive,感兴趣的同学可以自行百度。

    2.1.4. Sqoop

    无论是手动编写 mapreduce 程序还是直接使用 hive 来处理数据,操作的都是 hdfs 上的数据,那 hdfs 上的数据又是哪里来的呢?难道是手动输入的?

    拿电商来举例,我们的订单数据都是存在关系型数据库 MySql,Oracle 中的,而我们需要操作 HDFS 上的数据,就需要把我们关系型数据库中的数据导入到 HDFS 上;对于处理完的数据,又需要导出到关系型数据库中(因为前端界面展示的数据主要都是去查的数据库)。Sqoop 的功能就是在关系型数据库和 HDFS 之间导入和导出数据。

    其实学 sqoop 也很简单,首先是安装(和 hive 类似,其实整个大数据中大部分框架的安装过程都是类似的:官网下载压缩包,解压,改配置文件,执行命令初始化),然后是执行 sqoop 命令,学习 sqoop 其实就是学习 sqoop 命令。

    例:将 mysql 中的数据导入到 HDFS 上:sqoop import --connect jdbc:mysql://localhost:3306/dbname --username root --password 123 --table cate --target-dir /data

    2.1.5. Flume

    学完了 sqoop,我们已经可以把 mysql,oracle 上的数据导入到 HDFS 上了,那么对于一些访问日志,像 Ngnix 的访问日志,怎么将这些日志文件导入到 HDFS 上呢?

    所以,接下来我们就要学习 Flume 这个日志采集引擎(当然,你也可以先学 FLume),它的主要作用就是采集日志文件,监控文件或目录,当文件或目录的内容发生变化后实时的将数据发送到指定目的。

    先官网下载压缩包,解压,修改环境变量,修改配置文件,然后执行命令启动 flume,flume会根据你配置文件中的参数,去监控指定的文件或目录,当文件或目录内容发生变化的时候就会将数据发送到 HDFS 或者其他的目的。

    PS:大数据的大部分框架(99%)的安装过程都类似,后面就不再啰嗦了。

    2.1.6. Spark

    其实学完上面的部分,离线计算的部分已经差不多了,已经可以解决一些需求了。但是,人类的欲望总是永无止境的,总是渴望更高,更快,更强。mapreduce 计算框架在计算的时候,每一步的计算结果都是持久化到磁盘上的,在进行下一步操作的时候就需要进行磁盘IO,效率就比较低。

    因此,Spark 横空出世。Spark 把中间过程的计算结果放在内存中,因此大大提高了离线计算的计算效率。Spark 也是企业中使用最广的大数据计算框架,因为它还提供了一个可以进行实时计算的子模块 SparkStreaming,后面会提到(就像 Spring 有 SpringMVC 这个子模块一样)。Spark 既可以进行离线计算也可以使用 SparkStreaming 进行实时计算,所以大部分企业都会选择使用 Spark 来作为核心的计算框架(因为统一了嘛,实现需求的时候就不用这个功能用A框架实现,另一个功能用B框架实现,不好维护),而 Hadoop 中的 mapreduce 框架只是起一个辅助作用。

    2.1.7. Scala

    大家在学习 Spark 之前需要先学一门语言:Scala。Scala 是一个语法比较杂的编程语言,你学 Scala 的时候会觉得它和 JS,Java,C++ 都有点像;而且它兼容 Java,也运行在 JVM 上,你用 Java 写的工具类和方法可以直接被 Scala 类方法调用,反之亦然。

    虽然 Spark 程序也可以使用 Java 来编写,但是,用 Scala 编写会更加简洁一些,一般企业中编写 Spark 程序也是用的 Scala,很多大数据的招聘也要求你得会使用 Scala。

    2.2. 实时计算/流计算

    像统计过去一年订单中某件商品的销售总额这类需求,对实时性要求不高,一般会使用离线计算程序(mapreduce)来计算。但是,像网站访问的PV,UV,每天各小时的流量这种类型的需求,hadoop 的 mapreduce 框架或者叫编程模型的计算效率就有点低。所以为了应对实时性较高的需求就需要学习一些实时计算框架。

    2.2.1. Storm

    Storm 属于老牌经典的实时计算框架,大部分公司内部都有使用,编程模式和 mapreduce 极其相似,导 jar 包,实现接口,main 方法,打 jar 包,向集群提交,运行。

    在本地编写 Storm 程序也是相当的方便,环境都不需要配,建立 maven 工程导入依赖,写代码,右击运行就 OK。

    2.2.2. JStorm

    Jstorm 是阿里在 Strom 的基础上对其性能进行了改良和优化后的产物,用法和 Strom 类似,你用 storm 写的代码都不需要做太大的修改就可以直接运行在 JStorm 集群上。

    2.2.3. SparkStreaming

    在上面讲离线计算的时候已经提到了 SparkStreaming,它是 Spark 的一个子模块,用于进行实时计算,那它和 Strom 有什么不同呢?

    Strom 是真正的实时,来一个数据就处理一个;而 SparkStreaming 是以时间段的方式,是个伪实时,比如每过 5 秒才集中处理一下过去5秒内的发送过来的数据。

    Storm 和 SparkStreaming 在企业中可以说是平分秋色,用的都比较多。

    2.2.4. Kafka

    Storm,JStorm,SparkStreaming 它们接收的都是实时发送过来的数据,那这个数据是从哪里来的呢?

    在介绍离线计算的时候,我们知道了 Flume 可以实时的监控文件目录,当文件内容增多或目录中的文件发生变化时可以发送数据到指定目的,这里的目的就可以是 Storm,JStorm,SparkStreaming。但是,数据发送速度非常快的时候,有的数据可能来不及接收,然后数据就丢失了,针对这种情况我们一般会使用消息中间件来做缓存,暂时的将发送过来的数据缓存到中间件里。Kafka 就是大数据常用的一种消息中间件。

    在企业中一般的做法是:Flume 实时监控目录或文件末尾,数据发生变化后送到 Kafka 缓存,Kafka 再将数据送到 SparkStreaming,Storm等实时计算组件中。

    所以,大家在学实时计算框架的时候也需要学一下 Kafka 这个缓存组件。

    2.2.5. Zookeeper

    最后,大数据技术要真正应用于企业的开发,需要保证它的 HA(High Availaibility) 高可用性,大家在搭建 Hadoop 集群,Spark 集群,Storm 集群的时候都会用上 Zookeeper,将 Hadoop,Spark,Storm 的元信息存储到 Zookeeper 上,防止因为某个节点宕机而造成数据计算失败。

    其实,根据名字和图片大家就可以猜出来 Zookeeper 在整个大数据体系中的作用:动物园管理者。Hadoop 是一头大象,Hive 是个小蜜蜂,HBase 是小鲸鱼,Pig 是一头猪...,zookeeper 就是用来确保这些 "小动物" 的稳定性可用性。

    三、大数据整体架构

    最后上一幅博主手绘的大数据架构图。企业中的大数据平台整体架构和上面的类似。

    •最底层是数据源,可以来自关系型数据库,用户访问日志等。•网上就是数据采集层,就需要我们使用 Sqoop / Flume 采集关系型数据库,日志中的数据,当然,我们也可以使用爬虫去爬取其他公共网站的数据。•再往上,我们采集完了数据就要把它存储到 HDFS 上,实时的就送到 Kafka。离线计算就用 Hive,MapReduce 调 HDFS 的数据,实时的就通过 Storm,JStorm,【大数据开发学习资料领取方式】:加入大数据技术学习交流扣群522+数字189+数字307,点击加入群聊,私信管理员即可免费领取SparkStreaming 取 Kafka 中的数据再进行计算。•再向上,就是数据挖掘层,就是一直炒的火热的人工智能,机器学习,深度学习云云。其实就是一系列复杂的算法,而这都是在拥有海量数据的基础之上才能开始做的,没有数据做支撑,算法就是个空壳,就好像你买了个榨汁机,但是却没有水果。所以,就有人说:大数据是人工智能的血液。•再向上,就是大家最熟悉的一层,产品经理就住在这一层。

    相信看到这里大家对大数据已经没有那么陌生了。

    最后,祝大家顺利入门大数据,找到一份好工作。

    展开全文
  • 设计模式概述

    千次阅读 2016-04-08 14:32:14
    那么多所谓的设计模式,为什么老是记不住为什么面试的时候总是回答不上来? 其实本来很简单的内容,为什么很难在实际项目中使用? 面试的时候,考察设计模式,就像是“天王盖地虎,宝塔镇河妖”一样的黑话。在...

    设计模式概述

    本文由 @lonelyrains出品,转载请注明出处。
    文章链接: http://blog.csdn.net/lonelyrains/article/details/51089534

    • 那么多所谓的设计模式,为什么老是记不住?
    • 为什么面试的时候总是回答不上来?
    • 其实本来很简单的内容,为什么很难在实际项目中使用?

    面试的时候,考察设计模式,就像是“天王盖地虎,宝塔镇河妖”一样的黑话。在道上混,虽然不知道会碰到什么鬼神,知道内涵意义的同时,也需要知道这些形式上的东西到底是怎么一一表述的。不然,咋死的都不知道~

    • 设计模式的性质
      • 都是一些特定使用场景的固定章法
    • 设计模式的实现
      • 都是加抽象层
    • 设计模式的目的
      • 都是解耦
      • 评价是否是过度设计:被解耦的部分是否确实可能频繁变化

    对一些常用的设计模式套用上面的描述结构:

    创建型

    工厂模式(Factory)

    • 性质
      • 创建型场景的固定章法。
    • 实现
      • 创建对象时加一层抽象,相对于直接调用创建指定对象的代码而言。
      • 所有的创建都被封装在一种叫指定对象工厂的代码里。
    • 目的
      • 针对的是解耦一种类型的特定对象创建。创建特定对象的代码可能会频繁变化。

    抽象工厂(Abstract Factory)

    • 性质
      • 创建型场景的固定章法。
    • 实现
      • 创建对象时加一层抽象,相对于直接调用创建指定对象的工厂方法而言。
      • 所有的创建都被封装在一种叫抽象对象工厂的代码里。
    • 目的
      • 针对的是解耦特定类型的对象创建。创建对象的类型可能频繁变化。

    结构型

    桥接(Bridge)

    • 性质
      • 结构型场景的固定章法。结构型是经常需要重构的部分。
    • 实现
      • 接口和实现加一层抽象,相对于直接调用特定功能实现。
      • 所有的特定功能实现都被封装在一种叫特定实现接口的代码里。
      • 其实将实现当做特定对象的话,桥接就跟工厂模式没什么区别。工厂这时候就是接口。
    • 目的
      • 针对的是解耦特定类型的功能调用。实现特定类型功能的方法可能频繁变化。
    • 思考
      • 为什么没有对应的抽象桥接模式?因为抽象桥接如果存在,需要解耦的部分就是特定类型的功能接口。也就是说在调用这个类时,不知道需要调用其中的什么方法。这种使用场景虽然不是没有,但是极其少见,所以没有这个提法而已。其他设计模式为什么没有对应的抽象XXX设计模式,也是因为这个原因。“抽象”两个字就像是运算符,本可以无限往上叠加。比如,抽象抽象工厂模式是不是可以存在呢?因为没有解耦的实际意义,所以并不存在实用价值。

    装饰模式(Decorator)

    • 性质
      • 结构型场景的固定章法。
    • 实现
      • 调用特定对象的功能组合时,加多一层抽象,相对于直接定义并调用多变功能的子类对象而言。
    • 目的
      • 将额外功能可以通过不同子类组合起来,而不是笨拙地拼接定义新子类。功能定制更加灵活。

    行为型

    模板方法(TemplateMethod)

    • 性质
      • 行为型场景的固定章法。
    • 实现
      • 增加一层调用算法流程的骨架,在父类中定义好。注意这个骨架是不变的部分。各种子类实现里实现这个算法流程骨架函数里的具体调用子函数。可想而知,这个通用算法流程骨架函数通常不需要是虚函数,而子函数需要。
    • 目的
      • 仅仅是为了减少骨架方法每个子类都实现一遍的重复劳动,没啥玄乎的。

    观察者模式(Observer)

    • 性质
      • 行为型场景的固定章法。
    • 实现
      • 通过增加定义一层抽象观察者类,在需要观察的类结构里增加一层消息通知的机制。对所有需要对此类对象状态变化产生行为的各种观察者进行统一通知。
    • 目的
      • 实现统一通知,解耦的是各种自定义类、五花八门的通知方式。

    总结

    本文通过对创建、结构、行为型三种设计模式中分别提取两种典型的设计模式加以探讨,得出一个基本的设计模式的理解骨架——即从性质(使用场景)、实现(如何解耦)、目的(解耦什么)三方面考察,然后附加一点自己的思考。

    这个总结本身也是一种抽象。理解有偏差的地方,或者有不同的声音,欢迎一起探讨或者指正。

    展开全文
  • 之所以记录这些,是因为看了别人的笔记总是记不住。为了加深记忆,本文记录一些比较经典的题目,还是选择敲一点东西,以后要回来阅读也更容易一些。 提示:以下是本篇文章正文内容,下面案例可供参考 一、TCP的三...
  • N多个配置类还有N多个需要实现的接口,总是记不住和不知道为什么会有这么多,最近在学习这方面的东西,正好能够把学习到的东西分享出来给大家参考一下。 ​ 在目前网上的很多博文中,只是把配置文件贴出来,根本没...
  • 背景:由于公司需要用c++对现有项目进行重构,本人从事近6年的C#开发现需要快速转C++,但是看书学习内容太多记不住,所以打算从Vulkan入手写一些东西为什么选择Vulkan而不是OpenGL或者别的? 1、因为个人感觉...
  • 最近发现好多常见但是生疏的知识点,有时候感觉自己跟pig一样,什么记不住了。今天写一下惯导中的关于加速度和投影的一部分该记住的东西。 正文 本文延续了一贯的盗图风格,先看下面这个图: 不要...
  • 但经常的查询搜索搞的我也很烦,还是做个笔记吧,自己做的也是最适合自己的,等以后什么记不住了,至少还有存世的东西。嘻嘻:)tarsed将文件夹下所有.c文件的printf替换PRINTF:# sed -i 's/printf/PRINTF/g' *....
  • 在实际的场景中会遇到各种奇怪的问题,为什么会感觉到奇怪,因为没有理论支撑的东西才感觉到奇怪,SQL Server自己管理内存,我们可以干预的方式也很少,所以日常很难遇到处理内存问题的案例。当遇到了原有的知识储备...
  •  在实际的场景中会遇到各种奇怪的问题,为什么会感觉到奇怪,因为没有理论支撑的东西才感觉到奇怪,SQL Server自己管理内存,我们可以干预的方式也很少,所以日常很难遇到处理内存问题的案例。当遇到了原有的知识...
  • 不以输出目的的知识输入,只是在自嗨。...不知道记录什么,可能是我经常记不住的知识点,可能是学习过程中发现的有趣的东西。。。 希望未来的自己回头看到曾经的努力,很骄傲! 转载于:https://w...
  • 映射文件的XML元素我为什么记不住?等等。以下就这两个问题谈谈我的一些心得。 首先,学习任何一门新的框架首先要理解它所解决的问题域。Hibernate是一个解决对象关系映射的框架(ORM),这说明ORM必须遵循一定的...
  • 也就是记不住东西都放上面,需要的时候去看去查。当然现在以linux命令主,我把它扩大到更多的范围。 我用golang进行的开发,并开放源代码,可以自己部署。 用golang开发的好处是干净,所有文件均一清二楚,...
  • 其实我不太喜欢写博客的,可是不写的话,又有不太好的地方,不是记不住什么,而是许多公司看重这个,虽然我觉得技术牛的永远是技术牛的,小白也慢慢的成长。同时作为一个程序员,总要这个社会发点实用的干货,...
  • 我虽然学习的东西不多,但架不住犯上知识不牢和理解不够深刻的毛病,而且通过写博客分享自己学习编程的心得能够收获成就感与满足感,进一步培养对编程的兴趣,因此何乐而不写博客呢? 当然,我写博客的理由不止于...
  • 为什么要整理呢?因为原著作者讲过于详细了,而且写得有点“随性”,往往是想到哪讲到哪,这对于新手的阅读就不太友好,因为你往往抓不住重点,思路因为作者的笔风(加上英文翻译造成的习惯问题)而感到晦涩难懂。...
  • 步入职场之后,边工作边学习成了很多人的常态,经常听到同事吐槽,哇,这本书知识点太多了,记都记不住,就算记住了时间久了还是忘,也不知道是不是自己自学的方式不对。 要想解决这个问题,得先聊聊我们的学习的...
  • 我们经常在电脑上写头条文章写到一半,不是卡文就是临时有事,需要存起来下次再写,复制粘贴到其他地方又怕一时半找不到,而且麻烦,不保存吧下次又记不住,所以草稿箱是个好东西。网页版头条号后台系统更新后,找...
  • 最近百度查东西的时候,经常看到各种恶心的广告,以下面这货代表: 这货不断变换的恶心造型真是醉了(已打马赛克),我实在忍不住要净化一下视线了。 首先想到的是有什么屏蔽掉图片的东西能干掉这种广告,...
  • 其他的就什么记不住了。这里强调一下我是极讨厌看的,你知道孩子脑中只有动画片。但是我爹不许啊,非紧紧抱着我跟他一起看,然后一个一个给我讲解人物,我哪听得进去。枉费了他的一番苦心,只记住了刘备曹操。 再...

空空如也

空空如也

1 2
收藏数 36
精华内容 14
关键字:

为什么会记不住东西