Latest Posts
-
Hive on spark
Hive on spark 官方配置说明: https://www.docs4dev.com/docs/en/apache-hive/3.1.1/reference/Hive_on_Spark__Getting_Started.html#google_vignette 版本兼容 需要使用官方推荐的spark版本 Hive Version Spark Version master 2.3.0 3.0.x 2.3.0 2.3.x 2.0.0 2.2.x 1.6.0 2.1.x 1.6.0 2.0.x 1.5.0 1.2.x 1.3.1 1.1.x 1.2.0 spark 下载地址 spark相关集群按照配置,可以参考另一篇文章...
-
实时数仓项目搭建及理论
项目背景与需求 项目背景 随着互联网的发展,数据的时效性对企业的精细化运营越来越重要, 商场如战场,在每天产生的海量数据中,如何 能实时有效的挖掘出有价值的信息, 对企业的决策运营策略调整有很大帮助。此外,随着 5G 技术的成熟、广泛应 用, 对于互联网、物联网等数据时效性要求非常高的行业,企业就更需要一套完整成熟的实时数据体系来提高自身 的行业竞争力。 随着数据时效性在企业运营中的重要性日益凸现,例如: 实时推荐; 精准营销; 广告投放效果; 实时物流 实时数仓产生的背景 数据的实时处理能力成为企业提升竞争力的一大因素,最初阶段企业主要采用来一个需求,编写一个实时计算任务的方式来处理实时数据,随着需求的增多,计算任务也相应增多,并且不同任务的开发人员不同,导致开发风格差异化,该阶段的实时数据处理缺乏统一的规划,代码风格差异化严重,在维护成本和开发效率上有很大障碍。 为避免上述问题,人们参照数据仓库的概念和模型来重新规划和设计实时数据处理,在此基础上产生了实时数据仓库(实时数仓) 离线转实时 离线数仓分层架构图 实时计算架构 收集层 Binlog(业务日志)、loT(物联网)、后端服务日志(系统日志) 经过日志收集团队和 DB 收集团队的处理,数据将会被收集到 Kafka 中。这些数据不只是参与实时计算,也会参与离 线计算。...
-
ELK(Elasticsearch,Logstash,Kibana)
ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,Elasticsearch(ES),Logstash 和 Kibana。这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,故被简称为 ELK 协 议栈。 ELK官网:https://www.elastic.co/ ELK官网文档:https://www.elastic.co/guide/index.html ELK中文手册:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html ELK中文社区:https://elasticsearch.cn/ ELK API :https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/travelansport-client.html Elk整体架构 Kibana Kibana 是一款基于 Apache 开源协议,使用 JavaScript 语言编写,为 Elasticsearch 提供分析和可视化的 Web 平 台。它可以在 Elasticsearch...
-
grep,sed,awk
元字符 ? 字符 ?字符代表单个字符。 # 存在文件 a.txt 和 b.txt $ ls ?.txt a.txt b.txt 上面命令中,?表示单个字符,所以会同时匹配a.txt和b.txt。 如果匹配多个字符,就需要多个?连用。 # 存在文件 a.txt、b.txt 和 ab.txt $ ls ??.txt ab.txt 上面命令中,??匹配了两个字符。 注意,?不能匹配空字符。也就是说,它占据的位置必须有字符存在。 * 字符 *代表任意数量的字符。...
-
Druid--高性能实时分析数据库
Part 1 Apache Druid简介及架构 Druid概述 1.1 什么是Druid 数据分析的基础架构可以分为以下几类: 使用Hadoop/Spark进行分析 将Hadoop/Spark的结果导入 RDBMS 中提供数据分析 将结果保存到容量更大的 NoSQL 数据库中,解决数据分析的存储瓶颈,例如:HBase 将数据源进行流式处理,对接流式计算框架(如Storm、Spark、Flink),结果保存到 RDBMS或NoSQL中 将数据源进行流式处理,对接分析数据库,例如:Druid 互联网技术的快速增长催生了各类大体量的数据,Hadoop很大的贡献在于帮助企业将他们那些低价值的事件流数据转化为高价值的聚合数据; Hadoop擅长的是存储和获取大规模数据,它并不提供任何性能上的保证它能多快获取到数据。虽然Hadoop是一个高可用的系统,但在高并发负载下性能会下降; Hadoop是一个很好的后端、批量处理和数据仓库系统。在一个需要高并发并且保证查询性能和数据可用性的并需要提供产品级别的保证的需求,Hadoop并不能满足。 Druid 是 Metamarkets 公司(一家为在线媒体或广告公司提供数据分析服务的公司)推出的一个分布式内存实时分析系统,用于解决如何在大规模数据集下进行快速的、交互式的查询和分析。 Druid 是一个开源的数据分析引擎工具,为实时和历史数据的次秒级(多于一秒)查询设计。主要应用于对数据的OLAP查询,Druid 提供低延迟(实时)的数据摄取、灵活的数据探索、快速的数据聚合。现有的 Druid 部署已支持扩展到数万亿时间和...
-
SQL--如何用SQL求第10个工作日
运行环境: PostpreSQL + linux 今天被一道题问住了, 给一个日期和节假日映射表,如何求每个一天的第10个工作日? 如果只是求某个特定的日期的第10个工作日,思路很直接 假如我们有如下的表 create table day_table ( the_day varchar(80) comment '日期', flag varchar(1) comment 'W 代表工作日, H 代表假日' ); insert into day_table values('2021-07-15','W'); insert into...
-
Kylin--MOLAP引擎
Apache Kylin™是一个开源的、分布式的分析引擎,提供 Hadoop 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay 开发并贡献至开源社区,它能在亚秒内查询巨大的表。 Part 1 Kylin概述 1.1 背景、历史及特点 Apache Kylin,一种MOLAP的数据分析引擎。最早脱胎于eBay中国研发中心,并贡献给Apache基金会,目前Apache Kylin的核心开发团队已经自立门户,创建了 Kyligence (Kylin Intelligence) 公司。值得一提的是,Apache Kylin是第一个由中国人主导的Apache顶级项目。 eBay使用的传统数据仓库和商业智能平台遇到瓶颈,Hadoop平台虽然可以批量处理大规模数据,但无法提供高效的数据交互分析。于是,Kylin被eBay孵化了。 Apache Kylin 发展历程 2014 年 Kylin 诞生,支持 Hive...
-
Shell 编程
什么是 Shell Shell 是命令解释器,用于解释用户对操作系统的操作 shell 有很多, 查看机器支持的 shell cat /etc/shells Linux 的启动过程 /BIOS-MBR-BootLoader(grub)-kernel-init-系统初始化-shell Shell 书写规范 #!/bin/bash # Sha-Bang # 第一行的#!/bin/bash,告诉看脚本的人,这个文件需要用哪个shell编译器运行 # 当以 ./xx.sh 的方式运行脚本是,会读取第一行,并以对应的编译器运行 # demo cd /var ls pwd...
-
Kudu--分布式数据存储引擎
概述 背景 在 KUDU 之前,大数据主要以两种方式存储: 静态数据:以 HDFS 引擎作为存储引擎,适用于高吞吐量的离线大数据分析场景。这类存储的局限性是数据无 法进行随机的读写。 动态数据:以 HBase、Cassandra 作为存储引擎,适用于大数据随机读写场景。这类存储的局限性是批量读取 吞吐量远不如 HDFS,不适用于批量数据分析的场景。 所以现在的企业中,经常会存储两套数据分别用于实时读写与数据分析, 先将数据写入HBase中,再定期通过ETL到Parquet进行数据同步。 但是这样做有很多缺点: 用户需要在两套系统间编写和维护复杂的ETL逻辑。结构复杂,维护成本高。 时效性较差。因为ETL通常是一个小时、几个小时甚至是一天一次,那么可供分析的数据就需要一个小时至一天 的时间后才进入到可用状态,也就是说从数据到达到可被分析之间是会存在一个较为明显的“空档期”的。 更新需求难以满足。在实际情况中可能会有一些对已经写入的数据的更新需求,这种情况往往需要对历史数据 进行更新,而对Parquet这种静态数据集的更新操作,代价是非常昂贵的。 存储资源浪费。两套存储系统意味着占用的磁盘资源翻倍了,造成了成本的提升。 kudu解决的问题 我们知道,基于HDFS的存储技术,比如Parquet,具有高吞吐量连续读取数据的能力;而HBase和Cassandra等技术 适用于低延迟的随机读写场景,那么有没有一种技术可以同时具备这两种优点呢?Kudu提供了一种“happy medium”的选择: Kudu不但提供了行级的插入、更新、删除API,同时也提供了接近Parquet性能的批量扫描操作。使用同一份存储, 既可以进行随机读写,也可以满足数据分析的要求。 数据模型...
-
ClickHouse--OLAP database
概述 ClickHouse是一个快速开源的OLAP数据库管理系统,它是面向列的,允许使用SQL查询实时生成分析报告。 Clickhouse 发展历史 ROLAP : 传统关系型数据库OLAP,基于MySQL的MyISAM表引擎。 MOLAP :借助物化视图的形式实现数据立方体。预处理的结果存在HBase这类高性能的分布式数据库 HOLAP:R和M的结合体H ROLAP :ClickHouse Clickhouse 支持特性剖析 1.真正的面向列的DBMS 2.数据高效压缩 3.磁盘存储的数据 4.多核并行处理 5.在多个服务器上分布式处理 6.SQL语法支持 7.向量化引擎 8.实时数据更新 9.索引 10.适合在线查询 11.支持近似预估计算 12.支持嵌套的数据结构 13.支持数组作为数据类型 14.支持限制查询复杂性以及配额 15.复制数据和对数据完整性的支持 ClickHouse的不完美...
-
Flink--流(批)式处理框架
Flink 概述 什么是 Flink Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算。 Flink 特点 Flink 是一个开源的流处理框架,它具有以下特点 批流一体:统一批处理、流处理 分布式:Flink程序可以运行在多台机器上 高性能:处理性能比较高 高可用:Flink支持高可用性(HA) 准确:Flink可以保证数据处理的准确性 Flink 应用场景 Flink主要应用于流式数据分析场景 实时ETL 集成流计算现有的诸多数据通道和SQL灵活的加工能力,对流式数据进行实时清洗、归并和结构化处理;同时,对离线数仓进行有效的补充和优化,并为数据实时传输提供可计算通道。 实时报表 实时化采集、加工流式数据存储;实时监控和展现业务、客户各类指标,让数据化运营实时化。 如通过分析订单处理系统中的数据获知销售增长率; 通过分析运输延迟原因或预测销售量调整库存; 监控预警 对系统和用户行为进行实时监测和分析,以便及时发现危险行为,如计算机网络入侵、诈骗预警等 在线系统 实时计算各类数据指标,并利用实时结果及时调整在线系统的相关策略,在各类内容投放、智能推送领域有大量的应用,如在客户浏览商品的同时推荐相关商品等 Flink 核心组成及生态发展...
-
大数据开发高频面试题
1. 给定a,b两个文件,各存放50亿个url,每个url长度为1-255字节,内存限制是4g,让你找出a,b文件共同的url,说明思路和执行方法。 思路分析:数据量很大的join,内存有限,设计一个程序解决这个问题 借鉴MapReduce的设计 每个文件的大小为5Gx64=320G,不能一次加载到内存中进行比对 hash(url)%100对数据分区,存成小文件,每个文件的大小大约300M,这个就可以得到a1,a2,,…a1000; b1,b2,,…b1000. b1中和a相同的url只能在a1中,这样只需要比较俩俩比较1000对300M的文件,就可以求出最终的结果 把An加载到内存中,使用HashSet存储,然后掉用contain方法就可以找到Bn中是否有相同的url,有的话就存到结果集里边,有n个结果集的小文件 合并n个结果集的小文件,生成最终结果文件 进一步分析,如果允许一定的错误率,可以使用bloom filter来判断A中是否有B 1G = 1000M = 10001000K = 100010001000Byte=1000100010008Bit=80亿bit 4G 大概可以表示320亿bit,将A中的url使用bloom filter映射为这320亿个bit,然后逐个读取b中url检查是否存在,如果是,这url应该是共同url 2. 二叉树前序、中序、后序遍历方式(递归以及非递归)。 前序遍历:根节点,左节点,右节点 中序遍历:左节点,根节点,右节点 后序遍历:左节点,右节点,根节点 递归实现 public class...
-
扫描线算法
定义 计算几何中,扫描线算法(Sweep Line Algorithm)或平面扫描算法(Plane Sweep Algorithm)是一种算法模式,虚拟扫描线或扫描面来解决欧几里德空间中的各种问题,一般被用来解决图形面积,周长等问题,是计算几何中的关键技术之一。 这种算法背后的想法是想象一条线(通常是一条垂直线)在平面上扫过或移动,在某些点停止。几何操作仅限于几何对象,无论何时停止,它们都与扫描线相交或紧邻扫描线,并且一旦线穿过所有对象,就可以获得完整的解。 理解 简单一点理解就是把N维数据,转化成N-1维数据,线扫过的地方会做降维(聚合操作)。下面通过算法题做详细说明 一般解题步骤 数据排序 扫描排序后的数据,聚合有共性的数据 用一个新的数据结构存聚合后的结果 天际线问题 城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度,请返回由这些建筑物形成的 天际线 。 每个建筑物的几何信息由数组 buildings 表示,其中三元组 buildings[i] = [lefti, righti, heighti] 表示: lefti 是第 i 座建筑物左边缘的...
-
算法:递归,贪心,分治,动态规划
递归 递归:函数(方法)直接或间接调用自身。是一种常用的编程技巧。 严格来说递归不算一种编程思想,其实最多算是一种编程技巧! 斐波那契数列 斐波那契数列:1、1、2、3、5、8、13、21、34、…… f(1) = 1, f(2) = 1, f(n)=f(n-1)+f(n-2) ( n>=3 ) 递归的实现 def fib1(n: Int):Int = { if (n <= 1) n else fib1(n-1)+fib1(n-2) // if...
-
Spark 原理
Spark 原理主要包括 : 核心组件的运行机制(Master、Worker、SparkContext等) 任务调度的原理 Shuffle原理 内存管理 数据倾斜处理 Spark优化 熟练掌握 Spark 内核原理,能够帮助我们更好地完成 Spark 应用开发,并能够准确锁定项目运行过程中出现问题的 症结所在。 Spark Runtime 1.Using spark-submit, the user submits an application. 2.In spark-submit, we invoke the main()...
-
Spark GraphX
Spark GraphX概述 GraphX 是 Spark 一个组件,专门用来表示图以及进行图的并行计算。GraphX 通过 重新定义了图的抽象概念来拓展了 RDD: 定向多图,其属性附加到每个顶点和边。 为了支持图计算, GraphX 公开了一系列基本运算符(比如:mapVertices、 mapEdges、subgraph)以及优化后的 Pregel API 变种。此外,还包含越来越多的 图算法和构建器,以简化图形分析任务。 GraphX在图顶点信息和边信息存储上做了优化,使得图计算框架性能相对于原生 RDD实现得以较大提升,接近或到达 GraphLab 等专业图计算平台的性能。GraphX 最大的贡献是,在Spark之上提供一栈式数据解决方案,可以方便且高效地完成图计 算的一整套流水作业。 图的相关术语 图是一种较线性表和树更为复杂的数据结构,图表达的是多对多的关系。 如上图所示,G1 是一个简单的图,其中 V1、V2、V3、V4 被称作顶点(Vertex),...
-
Spark Streaming
官网: http://spark.apache.org/streaming/ Spark Streaming概述 什么是Spark Streaming Spark Streaming类似于Apache Storm(来一条数据处理一条,延迟低,响应快,低吞吐量),用于流式数据的处理; Spark Streaming具有有高吞吐量和容错能力强等特点; Spark Streaming支持的数据输入源很多,例如:Kafka(最重要的数据源)、 Flume、Twitter 和 TCP socket等; 数据输入后可用高度抽象API,如:map、reduce、join、window等进行运算; 处理结果能保存在很多地方,如HDFS、数据库等; Spark Streaming 能与 MLlib 以及 Graphx 融合。 Spark Streaming 与 Spark...
-
Spark Core & SparkSQL
Spark Core Spark概述 Spark的特点 速度快 与 MapReduce 相比,Spark基于内存的运算要快100倍以上,基于硬盘的运算也要快10倍以上。Spark实现了高效的DAG执行引擎,可以通过基于内存来高效处理数据流; 使用简单 Spark支持 Scala、Java、Python、R的API,还支持超过80种高级算法,使用户可以快速构建不同的应用。而且Spark支持交互式的Python和Scala 的shell,可以非常方便地在这些shell中使用Spark集群来验证解决问题的方法; 通用 Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询 (Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算 (GraphX)。这些不同类型的处理都可以在同一个应用中无缝使用。Spark统一的解决方案非常具有吸引力,企业想用统一的平台去处理遇到的问题,减少开发和 维护的人力成本和部署平台的物力成本; 兼容好 Spark可以非常方便地与其他的开源产品进行融合。Spark可以使用 YARN、Mesos作为它的资源管理和调度器;可以处理所有Hadoop支持的数 据,包括HDFS、HBase和Cassandra等。这对于已经部署Hadoop集群的用户特别重要,因为不需要做任何数据迁移就可以使用Spark的强大处理能力。Spark 也可以不依赖于第三方的资源管理和调度器,它实现了Standalone作为其内置 的资源管理和调度框架,这样进一步降低了Spark的使用门槛,使得所有人都可以非常容易地部署和使用Spark。此外,Spark还提供了在EC2上部署Standalone的Spark集群的工具。 Spark 与 Hadoop 从狭义的角度上看:Hadoop是一个分布式框架,由存储、资源调度、计算三部分组成;...
-
使用 Jupyter notebook 启动 spark-shell
在Jupyter notebook上面运行spark-shell,方便交互式学习API 确认本地能够正常启动 spark-shell,(spark, hadoop,java环境已经配好了) 能够使用 pip 或 pip3 # 安装依赖, 如果是pip3 记得把python改成 python3 pip install jupyter notebook # 添加启动 spark-scala 的内核 pip install spylon-kernel python -m spylon_kernel 3.启动jupyter notebook...
-
Mac版VMWare网络相关
恢复网络默认设置 #!/bin/bash # Reset VMware Fusion Networking # Clear out the Configuration sudo rm -f /Library/Preferences/VMware\ Fusion/networking* sudo rm -f /Library/Preferences/VMware\ Fusion/*location* sudo rm -rf /Library/Preferences/VMware\ Fusion/vmnet* sudo rm -rf...
-
Scala入门
Scala基础 Scala语言特点 Scala是一门以 JVM 为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语 言。 Scala源代码会被编译成Java字节码,然后运行于JVM之上,并可以调用现有的Java类库,实现两种语言 的无缝互操作的。 面向对象 Scala是一种面向对象的语言。 Scala中的每个值都是一个对象,包括基本数据类型(即布尔值、数字等)在内,连函数也是对象。 函数式编程 Scala也是一种函数式语言,其函数也能当成值来使用。 Scala中支持高阶函数,允许嵌套多层函数,并支持柯里化。 Scala提供了模式匹配,可以匹配各种情况,比如变量的类型、集合的元素、有值或无值。 静态类型 Scala具备类型系统,通过编译时检查,保证代码的安全性和一致性。 并发性 Scala使用Actor作为其并发模型,Actor是类似线程的实体。 Actor可以复用线程,因此可以在程序中使用数百万个Actor,而线程只能创建数千个。 基础语法 基础语法规则: 区分大小写 - Scala语言对大小写敏感; 类名 - 对于所有的类名的第一个字母要大写。如果需要使用几个单词来构成一个类名,每个单词的 第一个字母要大写;比如:ListDemo 方法名...
-
拉链表
缓慢变化维 缓慢变化维(SCD;Slowly Changing Dimensions)。在现实世界中,维度的属性随着时间的流失发生缓慢的变化(缓慢是相对事实表而言,事实表数据变化的速度比维度表快)。 处理维度表的历史变化信息的问题称为处理缓慢变化维的问题,简称SCD问题。处理缓慢变化维的方法有以下几种常见方式: 保留原值 直接覆盖 增加新属性列 快照表 拉链表 保留原始值 维度属性值不做更改,保留原始值。 如商品上架售卖时间:一个商品上架售卖后由于其他原因下架,后来又再次上架,此种情况产生了多个商品上架售卖时间。如果业务重点关注的是商品首次上架售卖时间,则采用该方式。 直接覆盖 修改维度属性为最新值,直接覆盖,不保留历史信息。 如商品属于哪个品类:当商品品类发生变化时,直接重写为新品类。 增加新属性列 在维度表中增加新的一列,原先属性列存放上一版本的属性值,当前属性列存放当前版本的属性值,还可以增加一列记录变化的时间。 缺点:只能记录最后一次变化的信息。 快照表 每天保留一份全量数据。 简单、高效。缺点是信息重复,浪费磁盘空间。 适用范围:维表不能太大 使用场景多,范围广;一般而言维表都不大。 拉链表 拉链表适合于:表的数据量大,而且数据会发生新增和变化,但是大部分是不变的 (数据发生变化的百分比不大),且是缓慢变化的(如电商中用户信息表中的某些用 户基本属性不可能每天都变化)。主要目的是节省存储空间。 适用场景: 表的数据量大...
-
Tez简介及安装
Tez是Apache开源的支持DAG(有向无环图)作业的计算框架,是支持Hadoop 2.x 的重要引擎。它源于MapReduce框架,核心思想是将Map和Reduce两个操作进一步 拆分,分解后的元操作可以任意灵活组合,产生新的操作,这些操作经过一些控制程 序组装后,可形成一个大的DAG作业。 https://tez.apache.org 架构 Tez的task由Input、processor、output阶段组成,可以表达所有复杂的map、 reduce操作,如下图: Tez可以将多个有依赖的作业转换为一个作业(只需写一次HDFS,中间环节较 少),从而大大提升DAG作业的性能。Tez已被Hortonworks用于Hive引擎的优化, 经测试一般小任务比Hive MR 的2-3倍速度左右,大任务7-10倍左右,根据情况不同 可能不一样。 Tez+Hive仍采用 MapReduce 计算框架,但对DAG的作业依赖关系进行了裁剪,并 将多个小作业合并成一个大作业,不仅减少了计算量,而且写HDFS次数也大大减少。 安装部署 1、下载软件包:apache-tez-0.9.2-bin.tar.gz(https://tez.apache.org/releases/apache-tez-0-9-2.html) 2、解压缩 tar -zxvf apache-tez-0.9.0-bin.tar.gz cd apache-tez-0.9.0-bin/share 3、将tez的压缩包放到到hdfs上 hdfs dfs...
-
Griffin数据质量监控工具
为什么要做数据质量监控 garbage in garbage out,处理的数据质量不好,处理完也不会有什么有用的信息 数据不一致 企业早期没有进行统一规划设计,大部分信息系统是逐步迭代建设的,系统建设时间长短各异,各系统数据标准也不同。企业业务系统更关注业务层面,各个业务系统均有不同的侧重点,各类数据的属性信息设置和要求不统一。另外,由于各系统的相互独立使用,无法及时同步更新相关信息等各种原因造成各系统间的数据不一致,严重影响了各系统间的数据交互和统一识别,基础数据难以共享利用,数据的深层价值也难以体现。 数据不完整 由于企业信息系统的孤立使用,各个业务系统或模块按照各自的需要录入数据,没有统一的录入工具和数据出口,业务系统不需要的信息就不录,造成同样的数据在不同的系统有不同的属性信息,数据完整性无法得到保障。 数据不合规 没有统一的数据管理平台和数据源头,数据全生命周期管理不完整,同时企业各信息系统的数据录入环节过于简单且手工参与较多,就数据本身而言,缺少是否重复、合法、对错等校验环节,导致各个信息系统的数据不够准确,格式混乱,各类数据难以集成和统一,没有质量控制导致海量数据因质量过低而难以被利用,且没有相应的数据管理流程。 数据不可控 海量数据多头管理,缺少专门对数据管理进行监督和控制的组织。企业各单位和部门关注数据的角度不一样,缺少一个组织从全局的视角对数据进行管理,导致无法建立统一的数据管理标准、流程等,相应的数据管理制度、办法等无法得到落实。同时,企业基础数据质量考核体系也尚未建立,无法保障一系列数据标准、规范、制度、流程得到长效执行。 数据冗余 各个信息系统针对数据的标准规范不一、编码规则不一、校验标准不一,且部分业务 系统针对数据的验证标准严重缺失,造成了企业顶层视角的数据出现“一物多码”、“一 码多物”等现象。 数据质量监控方法 设计思路 数据质量监控的设计要分为4个模块:数据,规则,告警和反馈 数据:需要被监控的数据,可能存放在不同的存储引擎中 规则:值如何设计发现异常的规则,一般而言主要是数值的异常和环比等异常监控方式。也会有一些通过算法来发掘异常数据的方法 告警:告警是指发告警的动作,这里可以通过微信消息,电话或者短信,邮件 反馈:反馈是指对告警内容的反馈,比如说收到的告警内容,要有人员回应该告警消息是否是真的异常,是否需要忽略该异常,是否已经处理了该异常。有了反馈机制,整个数据监控才能形成闭环 技术方案 最开始可以先关注核心要监控的内容,比如说准确性,那么就对核心的一些指标做监控即可 监控平台尽量不要做太复杂的规则逻辑,尽量只对结果数据进行监控。比如要监控日质量是否波动过大,那么把该计算流程提前,先计算好结果表,最后监控平台只监控结果表是否异常即可 多数据源。多数据源的监控有两种方式:针对每个数据源定制实现一部分计算逻辑,也可以通过额外的任务将多数据源中的数据结果通过任务写入一个数据源中,再对该数据源进行监控 实时数据监控:区别在于扫描周期的不同,因此在设计的时候可以先以离线为主,但是尽量预留好实时监控的设计 Griffin架构...
-
Datax 数据导出
概述 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、 Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、 MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能。 官网:https://github.com/alibaba/DataX/blob/master/introduction.md 架构 DataX本身作为离线数据同步框架,采用Framework + plugin架构构建。将数据源读 取和写入抽象成为Reader/Writer插件,纳入到整个同步框架中。 Reader:数据采集模块,负责采集数据源的数据,将数据发送给Framework; Writer: 数据写入模块,负责不断向Framework取数据,并将数据写入到目的端; Framework:用于连接reader和writer,作为两者的数据传输通道,并处理缓 冲,流控,并发,数据转换等核心技术问题。 核心模块 DataX完成单个数据同步的作业,称为Job。DataX接受到一个Job之后,将启动 一个进程来完成整个作业同步过程。DataX Job模块是单个作业的中枢管理节 点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、 TaskGroup管理等功能。 DataX Job启动后,会根据不同的源端切分策略,将Job切分成多个小的Task(子 任务),以便于并发执行。Task便是DataX作业的最小单元,每一个Task都会负 责一部分数据的同步工作。 切分多个Task之后,DataX Job会调用Scheduler模块,根据配置的并发数据...
-
Atlas元数据管理工具
数据仓库元数据管理 元数据(MetaData)狭义的解释是用来描述数据的数据。广义的来看,除了业务逻 辑直接读写处理的那些业务数据,所有其它用来维持整个系统运转所需的信息/数据 都可以叫作元数据。如数据库中表的Schema信息,任务的血缘关系,用户和脚本/ 任务的权限映射关系信息等。 管理元数据的目的,是为了让用户能够更高效的使用数据,也是为了让平台管理人员能更加有效的做好数据的维护管理工作。 但通常这些元数据信息是散落在平台的各个系统,各种流程之中的,它们的管理也可能或多或少可以通过各种子系统自身的工具,方案或流程逻辑来实现。 元数据管理平台很重要的一个功能就是信息的收集,至于收集哪些信息,取决于业务的需求和需要解决的目标问题。 应该收集那些信息,没有绝对的标准,但是对大数据开发平台来说,常见的元数据信息包括: 表结构信息 数据的空间存储,读写记录,权限归属和其它各类统计信息 数据的血缘关系信息 数据的业务属性信息 数据血缘关系 血缘信息或者叫做Lineage的血统信息是什么,简单的说就是数据之 间的上下游来源去向关系,数据从哪里来到哪里去。如果一个数据有问题,可以根据 血缘关系往上游排查,看看到底在哪个环节出了问题。此外也可以通过数据的血缘关 系,建立起生产这些数据的任务之间的依赖关系,进而辅助调度系统的工作调度,或 者用来判断一个失败或错误的任务可能对哪些下游数据造成影响等等。 数据的业务属性信息 如一张数据表的统计口径信息,这 张表干什么用的,各个字段的具体统计方式,业务描述,业务标签,脚本逻辑的历史 变迁记录,变迁原因等,此外还包括对应的数据表格是由谁负责开发的,具体数据的 业务部门归属等。数据的业务属性信息,首先是为业务服务的,它的采集和展示也就 需要尽可能的和业务环境相融合,只有这样才能真正发挥这部分元数据信息的作用。 Atlas简介 Atlas是Hadoop平台元数据框架; Atlas是一组可扩展的核心基础治理服务,使企业能够有效,高效地满足Hadoop中的 合规性要求,并能与整个企业数据生态系统集成; Apache...
-
Airflow任务调度系统
Airflow 是 Airbnb 开源的一个用 Python 编写的调度工具。 Airflow将一个工作流制定为一组任务的有向无环图(DAG),并指派到一组计算节 点上,根据相互之间的依赖关系,有序执行。Airflow 有以下优势: 灵活易用。Airflow 是 Python 编写的,工作流的定义也使用 Python 编写; 功能强大。支持多种不同类型的作业,可自定义不同类型的作业。如 Shell、 Python、Mysql、Oracle、Hive等; 简洁优雅。作业的定义简单明了; 易扩展。提供各种基类供扩展,有多种执行器可供选择; 简介 架构体系 Webserver 守护进程 接受 HTTP 请求,通过 Python Flask Web...
-
数据采集及清洗
数据采集 数据采集:日志文件 => Flume => HDFS => ODS 选择Flume1.8+作为采集日志数据的工具: 提供了一个非常好用的 Taildir Source 使用该source,可以监控多个目录,对目录中新写入的数据进行实时采集 taildir Source的特点: 使用正则表达式匹配目录中的文件名 监控的文件中,一旦有数据写入,Flume就会将信息写入到指定的Sink 高可靠,不会丢失数据 不会对跟踪文件有任何处理,不会重命名也不会删除 不支持Windows,不能读二进制文件。支持按行读取文本文件 采集启动日志和事件日志 本系统中要采集两种日志:启动日志、事件日志,不同的日志放置在不同的目录下。 要想一次拿到全部日志需要监控多个目录。 总体思路 1、taildir监控多个目录 2、修改自定义拦截器,不同来源的数据加上不同标志 3、hdfs sink 根据标志写文件 agent的配置...
-
数据仓库理论
什么是数据仓库 数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化的(Time Variant)数据集合,用于支持管理决策 (Decision-Making Support) 数据仓库四大特征 面向主题的 与传统数据库面向应用进行数据组织的特点相对应,数据仓库中的数据是面向主题进行组织的。 什么是主题呢? 主题是一个抽象的概念,是较高层次上企业信息系统中的数据综合、归类并进行分析利用的抽象 在逻辑意义上,它是对应企业中某一宏观分析领域所涉及的分析对象 面向主题的数据组织方式,就是在较高层次上对分析对象的数据的一个完整、一致的描述,能完整、统一地刻划各个分析对象所涉及的企业的各项数据,以及数据之间的联系。所谓较高层次是相对面向应用的数据组织方式而言的,是指按照主题进行数据组织的方式具有更高的数据抽象级别。 例如销售情况分析就是一个分析领域,那么数据仓库的分析主题可以是“销售分析”。 集成的 数据仓库的数据是从原有的分散的多个数据库、数据文件、用户日志中抽取来的,数据来源可能既有内部数据又有外部数据。操作型数据与分析型数据之间差别很大: 数据仓库的每一个主题所对应的源数据,在原有的各分散数据库中有重复和不一致的地方,且来源于不同的联机系统的数据与不同的应用逻辑捆绑在一起 数据仓库中的数据很难从原有数据库系统直接得到。数据在进入数据仓库之前,需要经过统一与综合 数据仓库中的数据是为分析服务的,而分析需要多种广泛的不同数据源以便进行比较、鉴别,数据仓库中的数据会从多个数据源中获取,这些数据源包括多种类型数据 库、文件系统以及Internet网上数据等,它们通过数据集成而形成数据仓库中的数据。 稳定的 数据仓库数据反映的是一段相当长的时间内历史数据的内容,是不同时点的数据库快照的集合,以及基于这些快照进行统计、综合和重组的导出数据。 数据稳定主要是针对应用而言。数据仓库的用户对数据的操作大多是数据查询或比较复杂的挖掘,一旦数据进入数据仓库以后,一般情况下被较长时间保留。数据经加工和集成进入数据仓库后是极少更新的,通常只需要定期的加载和更新。 反映历史变化的 数据仓库包含各种粒度的历史数据。数据仓库中的数据可能与某个特定日期、星期、月份、季度或者年份有关。虽然数据仓库不会修改数据,但并不是说数据仓库的数据是永远不变的。数据仓库的数据也需要更新,以适应决策的需要。数据仓库的数据随时间的变化表现在以下几个方面: 数据仓库的数据时限一般要远远长于操作型数据的数据时限 业务系统存储的是当前数据,而数据仓库中的数据是历史数据 数据仓库中的数据是按照时间顺序追加的,都带有时间属性 数据仓库作用...
-
Kafka--高吞吐消息中间件
Kafka架构与实战 概念和基本架构 介绍 Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多生产者、多订阅者,基 于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日 志,消息服务等等 主要应用场景是:日志收集系统和消息系统。 Kafka主要设计目标 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的 访问性能。 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。 同时支持离线数据处理和实时数据处理。 支持在线水平扩展 架构 有两种主要的消息传递模式:点对点传递模式、发布-订阅模式。大部分的消息系统选用发布-订阅 模式。Kafka就是一种发布-订阅模式。 对于消息中间件,消息分推拉两种模式。Kafka只有消息的拉取,没有推送,可以通过轮询实现消 息的推送。 Kafka在一个或多个可以跨越多个数据中心的服务器上作为集群运行。 Kafka集群中按照主题分类管理,一个主题可以有多个分区,一个分区可以有多个副本分区。 每个记录由一个键,一个值和一个时间戳组成。 四个核心API Producer API 允许应用程序将记录流发布到一个或多个Kafka主题。 Consumer API 允许应用程序订阅一个或多个主题并处理为其生成的记录流...
-
Redis--高性能分布式缓存
缓存原理&设计 缓存基本思想 在互联网技术中,缓存是系统快速响应的关键技术之一 以空间换时间的一种技术(艺术) 缓存的使用场景 DB缓存,减轻DB服务器压力 一般情况下数据存在数据库中,应用程序直接操作数据库。 当访问量上万,数据库压力增大,可以采取的方案有: 读写分离,分库分表 当访问量达到10万、百万,需要引入缓存。 将已经访问过的内容或数据存储起来,当再次访问时先找缓存,缓存命中返回数据。 不命中再找数据库,并回填缓存。 提高系统响应 数据库的数据是存在文件里,也就是硬盘。与内存做交换(swap) 在大量瞬间访问时(高并发)MySQL单机会因为频繁IO而造成无法响应。MySQL的InnoDB是有行锁 将数据缓存在Redis中,也就是存在了内存中。 内存天然支持高并发访问。可以瞬间处理大量请求。 qps到达11万/S读请求 8万写/S 做Session分离 传统的session是由tomcat自己进行维护和管理。 集群或分布式环境,不同的tomcat管理各自的session。 只能在各个tomcat之间,通过网络和Io进行session的复制,极大的影响了系统的性能。 1、各个Tomcat间复制session,性能损耗 2、不能保证各个Tomcat的Session数据同步 将登录成功后的Session信息,存放在Redis中,这样多个服务器(Tomcat)可以共享Session信息。 Redis的作用是数据的临时存储 做分布式锁(Redis) 一般讲锁是多线程的锁,是在一个进程中的 多个进程(JVM)在并发时也会产生问题,也要控制时序性...
-
Azkaban--工作流调度系统
基本认识 什么是工作流workflow 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序 java程序 mapreduce程序 hive脚本等 各任务单元之间存在时间先后及前后依赖关系,为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度任务的执行。 假如,我有这样一个需求,某个业务系统每天产生20G原始数据,每天都要对其进行处理,处理步骤如下所示: 通过Hadoop先将原始数据同步到HDFS上; 借助MapReduce计算框架对原始数据进行转换,生成的数据以分区表的形式存储到多张Hive表中; 需要对Hive中多个表的数据进行JOIN处理,得到一个明细数据Hive大表; 将明细数据进行各种统计分析,得到结果报表信息; 需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。 如果每一步都是手动调用,就会很消耗人力来重复作业,所以需要有工作流调度系统来自动作业 工作流调度实现方式 简单的任务调度 -> 直接使用linux的crontab; 复杂的任务调度 -> 开发调度平台或使用现成的开源调度系统,比如Ooize、 Azkaban、Airflow等 Azkaban与Oozie对比 对市面上最流行的两种调度器,进行对比分析。总体来说,Ooize相比Azkaban是一个重量级的任务调度系统,功能全面,但配置使用也更复杂(xm)。如果可以不在意某些功能的缺失,轻量级调度器Azkaban是很不错的候选对象。 功能 两者均可以调度mapreduce,pig,java,脚本工作流任务 两者均可以定时执行工作流任务 工作流定义 Azkaban使用Properties文件定义工作流...
-
HBase--分布式数据库
HBase简介 HBase是什么 HBase 基于 Google的BigTable论文而来,是一个分布式海量列式非关系型数据库系统,可以提供超大规模数据集的实时随机读写。 HBase的特点 海量存储 底层基于HDFS存储海量数据 列式存储 HBase表的数据是基于列族进行存储的,一个列族包含若干列 极易扩展 底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加DataNode服务节点就可以 高并发 支持高并发的读写请求 稀疏 稀疏主要是针对HBase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。 数据的多版本 HBase表中的数据可以有多个版本值,默认情况下是根据版本号去区分,版本号就是插入数据的时间戳 数据类型单一 所有的数据在HBase中是以字节数组进行存储 HBase的应用 HBase适合海量明细数据的存储,并且后期需要有很好的查询性能(单表超千万、上亿,且并发要求高) 交通方面 船舶GPS信息,每天有上千万左右的数据存储。 金融方面 消费信息、贷款信息、信用卡还款信息等 电商方面 电商网站的交易信息、物流信息、游览信息等 电信方面 通话信息...
-
ZooKeeper--分布式协调组件
Zookeeper简介 Zookeeper是什么? Zookeeper 是一个分布式协调服务的开源框架。 主要用来解决分布式集群中应用系统的一致性问题, 例如怎样避免同时操作同一数据造成脏读的问题。 ZooKeeper 本质上是一个分布式的小文件存储系统。 提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理。 ZooKeeper 提供给客户端监控存储在zk内部数据的功能,从而可以达到基于数据的集群管理。 诸如: 统一命名服务(dubbo)、分布式配置管理(solr的配置集中管理)、分布式消息队列 (sub/pub)、分布式锁、分布式协调等功能。 zookeeper的架构组成 ZK也是Master/slave架构,但是与hadoop不同的是zk集群中的Leader不是指定而来,而是通过选举产 生。 Leader Zookeeper 集群工作的核心角色 集群内部各个服务器的调度者。 事务请求(写操作) 的唯一调度和处理者,保证集群事务处理的顺序性;对于 create, setData, delete 等有写操作的请求,则需要统一转发给leader 处理, leader 需要决定编号、执...
-
Flume--数据采集工具
Flume由Cloudera公司开发,是一个分布式、高可靠、高可用的海量日志采集、聚合、传输的系统。 Flume支持在日志系统中定制各类数据发送方,用于采集数据; Flume提供对数据进行简单处理,并写到各种数据接收方的能力。 简单的说,Flume是实时采集日志的数据采集引擎。 概述 Flume的特点 分布式:flume分布式集群部署,扩展性好 可靠性好: 当节点出现故障时,日志能够被传送到其他节点上而不会丢失 易用性:flume配置使用较繁琐,对使用人员专业技术要求高 实时采集:flume采集流模式进行数据实时采集 适用场景:适用于日志文件实时采集。 Flume体系结构 Agent 本质上是一个 JVM 进程,该JVM进程控制Event数据流从外部日志生产者 那里传输到目的地(或者是下一个Agent)。一个完整的Agent中包含了三个组 件Source、Channel和Sink,Source是指数据的来源和方式,Channel是一个数 据的缓冲池,Sink定义了数据输出的方式和目的地。 Source 是负责接收数据到Flume Agent的组件。Source组件可以处理各种类 型、各种格式的日志数据,包括avro、exec、spooldir、netcat等。 Channel 是位于Source和Sink之间的缓冲区。Channel允许Source和Sink运作 在不同的速率上。Channel是线程安全的,可以同时处理多个Source的写入操作 及多个Sink的读取操作。常用的Channel包括: * Memory...
-
Impala--交互式查询工具
概述 是什么 Impala是Cloudera提供的一款开源的针对HDFS和HBASE中的PB级别数据进行交互式实时查询(Impala 速度快),Impala是参照谷歌的新三篇论⽂文当中的Dremel实现而来,其中旧三篇论文分别是 (BigTable,GFS,MapReduce)分别对应HBase和已经学过的HDFS以及MapReduce。 Impala最大卖点和最大特点就是快速 官网:https://impala.apache.org Impala的诞⽣ Hive以及MR适合离线批处理,但是对交互式查询的场景无能为力(要求快速响应),为了解决查询速度的问题,Cloudera公司依据Google的Dremel开发了Impala,Impala抛弃了MapReduce 使⽤了类似于传统的MPP数据库技术,⼤大提⾼了查询的速度。 MPP是什么? MPP (Massively Parallel Processing),就是大规模并行处理,在MPP集群中,每个节点资源都是独⽴ 享有也就是有独⽴的磁盘和内存,每个节点通过网络互相连接,彼此协同计算,作为整体提供数据服务。 简单来说,MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的 结果汇总在一起得到最终的结果 对于MPP架构的软件来说聚合操作比如计算某张表的总条数,则先进行局部聚合(每个节点并行计算), 然后把局部汇总结果进⾏全局聚合(与Hadoop相似)。 Impala与Hive对比 Impala的技术优势 Impala没有采取MapReduce作为计算引擎,MR是⾮常好的分布式并行计算框架,但MR引擎更多的是面向批处理模式,⽽不是面向交互式的SQL执行。与 Hive相比:Impala把整个查询任务转为 一棵执⾏计划树,而不是⼀连串的MR任务,在分发执行计划后,Impala使⽤拉取的方式获取上个 阶段的执⾏结果,把结果数据、按执行树流式传递汇集,减少的了把中间结果写入磁盘的步骤,再 从磁盘读取数据的开销。Impala使⽤服务的⽅式避免 每次执⾏查询都需要启动的开销,即相比 Hive没了MR启动时间。 使用LLVM(C++编写的编译器)产生运⾏代码,针对特定查询⽣成特定代码...
-
Sqoop--数据迁移工具
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、 postgresql等)间进行数据的传递。可以将关系型数据库(MySQL ,Oracle ,Postgres 等)中的数据导入到HDFS中,也可以将HDFS的数据导进到关系型数据库中。 安装配置 Sqoop 官网:http://sqoop.apache.org/ Sqoop下载地址:http://www.apache.org/dyn/closer.lua/sqoop/ 1. 下载、上传并解压 将下载的安装包 sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 上传到虚拟机中; 解压缩软件包; tar zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz mv sqoop-1.4.7.bin__hadoop-2.6.0/ ../servers/sqoop-1.4.7/ 2. 增加环境变量,并使其生效 vi /etc/profile # 增加以下内容 export SQOOP_HOME=/opt/lagou/servers/sqoop-1.4.7 export...
-
HUE--数据交互工具
Hue(Hadoop User Experience)是一个开源的 Apache Hadoop UI 系统,最早是由 Cloudera Desktop 演化而来,由 Cloudera 贡献给开源社区,它是基于 Python Web 框架 Django 实现的。通过使用 Hue 可以在浏览器端的 Web 控制台上与 Hadoop 集群进行交互来分析处理数据,例如操作 HDFS 上的数据,运行 MapReduce Job 等等。Hue所支持的功能特性集合: 默认基于轻量级sqlite数据库管理会话数据,用户认证和授权,可以自定义为 MySQL、Postgresql,以及Oracle...
-
Hive--数据仓库工具
Hive是基于Hadoop的一个数据仓库工具,可以将 结构化的数据文件 映射为一张表 (类似于RDBMS中的表),并提供类SQL查询功能;Hive是由Facebook开源,用于解 决海量结构化日志的数据统计。 Hive本质是:将 SQL 转换为 MapReduce 的任务进行运算 底层由HDFS来提供数据存储 可以将Hive理解为一个:将 SQL 转换为 MapReduce 任务的工具 数据仓库(Data Warehouse)是一个面向主题的、集成的、相对稳定的、反映历史变 化的数据集合,主要用于管理决策。(数据仓库之父比尔·恩门,1991年提出)。 数据仓库的目的:构建面向分析的、集成的数据集合;为企业提供决策支持 数据仓库本身不产生数据,数据来源于外部 存储了大量数据,对这些数据的分析和处理不可避免的用到Hive Hive的优缺点 Hive的优点 学习成本低。Hive提供了类似SQL的查询语言,开发人员能快速上手; 处理海量数据。底层执行的是MapReduce 任务; 系统可以水平扩展。底层基于Hadoop; 功能可以扩展。Hive允许用户自定义函数; 良好的容错性。某个节点发生故障,HQL仍然可以正常完成;...
-
hadoop 4. YARN资源调度
Yarn架构 ResourceManager(rm): 处理客户端请求、启动/监控ApplicationMaster、监控NodeManager、资源分配与调度; NodeManager(nm): 单个节点上的资源管理、处理来自ResourceManager的命令、处理来自 ApplicationMaster的命令; ApplicationMaster(am): 数据切分、为应用程序申请资源,并分配给内部任务、任务监控与容错。 Container: 对任务运行环境的抽象,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息。 Yarn任务提交(工作机制) 作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAppMaster。 作业初始化 第6步:当RM收到Client的请求后,将该job添加到容量调度器中。 第7步:某一个空闲的NM领取到该Job。 第8步:该NM创建Container,并产生MRAppmaster。 第9步:下载Client提交的资源到本地。 任务分配 第10步:MrAppMaster向RM申请运行多个MapTask任务资源。 第11步:RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。 任务运行 第12步:MRAppMaster向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager 分别启动MapTask,MapTask对数据分区排序。 第13步:MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。 第14步:ReduceTask向MapTask获取相应分区的数据。...
-
hadoop 3. MapReduce编程架构
MapReduce思想 MapReduce的思想核心是分而治之,充分利用了并行处理的优势。 即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想,而不是自己原创 MapReduce任务过程是分为两个处理阶段: Map阶段:Map阶段的主要作用是“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。 Map阶段的这些任务可以并行计算,彼此间没有依赖关系。 Reduce阶段:Reduce阶段的主要作用是“合”,即对map阶段的结果进行全局汇总。 Hadoop序列化及数据类型 序列化主要是我们通过网络通信传输数据时或者把对象持久化到文件,需要把对象序列化成二进制的结构。 为了得到更加紧凑的序列化数据,Hadoop 传输的数据都需要实现Writable接口,和java自带的Serializable相比Hadoop的序列化数据更小,可以有效的减小网络传输的数据量 MR编程快速入门 WordCount代码实现 1. 新建Maven工程 导入hadoop依赖 <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId>...
-
hadoop 2. HDFS分布式文件系统
HDFS (全称:Hadoop Distribute File System,Hadoop 分布式文件系统)是 Hadoop 核心组 成,是分布式存储服务。 分布式文件系统横跨多台计算机,在大数据时代有着广泛的应用前景,它们为存储和处理超大规模 数据提供所需的扩展能力。 HDFS是分布式文件系统中的一种。 HDFS的重要概念 HDFS 通过统一的命名空间目录树来定位文件; 另外,它是分布式的,由很多服务器联合起来实现 其功能,集群中的服务器有各自的角色(分布式本质是拆分,各司其职); 典型的 Master/Slave 架构 HDFS 的架构是典型的 Master/Slave 结构。 HDFS集群往往是一个NameNode(HA架构会有两个NameNode,联邦机制)+多个DataNode组成; NameNode是集群的主节点,DataNode是集群的从节点。 分块存储(block机制) HDFS 中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定; Hadoop2.x版本中默认的block大小是128M;...
-
hadoop 1. hadoop简介及集群搭建
Hadoop简介 Hadoop 是一个适合大数据的分布式存储和计算平台。 如前所述,狭义上说Hadoop就是一个框架平台,广义上讲Hadoop代表大数据的一个技术生态圈,包括很多其他软件框架 Hadoop生态圈技术栈 Hadoop(HDFS + MapReduce + Yarn) Hive 数据仓库工具 HBase 海量列式非关系型数据库 Flume 数据采集工具 Sqoop 数据迁移工具 Kafka 高吞吐消息中间件 Hadoop的发行版本 企业中主要用到的三个版本分别是:Apache Hadoop版本(最原始的,所有发行版均基于这个版 本进行改进)、Cloudera版本(Cloudera’s Distribution Including Apache Hadoop,简称“CDH”)、 Hortonworks版本(Hortonworks Data...
-
tomcat及其实践
tomcat 常用的web服务器 JavaEE规范 在Java中所有的服务器厂商都要实现一组Oracle公司规定的接口,这些接口是称为JavaEE规范。不同 厂商的JavaWeb服务器都实现了这些接口,在JavaEE中一共有13种规范。实现的规范越多,功能越强。 启动时端口被占用的问题 杀进程 sudo lsof -nP -i4TCP:$PORT | grep LISTEN 改配置文件的端口 进入Tomcat安装目录/conf/server.xml 修改相关port 发布项目的三种方式 直接放置在 webapps 目录下 server.xml部署 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 添加一个子项目地址 -->...
-
CSS, js, jQuery, vue
前端可视化 css CSS是指层叠样式表 cascading style sheets 引入CSS的方式 直接在标签里写 <div style=“color:red”>hello</div> 内部样式表在head和body之间插入 外部样式表 1. <link rel="stylesheet" href="css/css01.css"> 2. <style> @import url("css/css01.css"); </style> import vs link 加载顺序不同 @import方式导入会先加载html,然后才导入css样式,那么如果网络条件不好,就会先看到没有 修饰的页面,然后才看到修饰后的页面。 如果使用link方式,它会先加载样式表,也就是说,我们看到的直接就是修饰的页面; @import方式导入css样式,它是不支持javascript的动态修改的。而link支持。 选择器...
-
MySQL,JDBC, 数据库连接池及XML
数据库 MYSQL数据库 数据库(DataBase) 就是存储和管理数据的仓库 其本质是一个文件系统, 还是以文件的方式,将数据保存在电脑上 Mac上MYSQL的安装 How to Install MySQL on Mac & Configure MySQL in Terminal 查看mysql数据 # 查看mysql安装的目录 $ which mysql $ open 查看到的目录 data 目录默认是没有权限查看的,右键get info,修改权限就可以查看...
-
JAVA 常用核心类库(下)
常用核心类库(下) lang Throwable java.lang.Throwable类是Java语言中错误(Error)和异常(Exception)的超类 Error Error类主要用于描述Java虚拟机无法解决的严重错误,通常无法编码解决,如:JVM挂掉了 等。 Exception Exception类主要用于描述因编程错误或偶然外在因素导致的轻微错误,通常可以编码解决, 如:0作为除数等 Java采用的异常处理机制是将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序 简洁、优雅,并易于维护 RuntimeException 运行时异常,也叫作非检测性异常 ⚠️注意: 当程序执行过程中发生异常但又没有手动处理时,则由Java虚拟机采用默认方式处理异常,而默认 处理方式就是:打印异常的名称、异常发生的原因、异常发生的位置以及终止程序 ArithmeticException ArrayIndexOutOfBoundsException NullPointerException ClassCastException NumberFormatException 异常的避免 在以后的开发中尽量使用if条件判断来避免异常的发生。 但是过多的if条件判断会导致程序的代码加长、臃肿,可读性差。 OtherException IOException和其它异常 - 其它异常,也叫作检测性异常,所谓检测性异常就是指在编译阶段都能 被编译器检测出来的异常。...
-
JAVA 常用核心类库(上)
常用核心类库(上) lang 该包是Java语言的核心包,并且该包中的所有内容由Java虚拟机自动导入。 如:System类、String类、… Object 根类,所有类是该类的直接或间接子类 Object() 使用无参方式构造对象 boolean equals(Object obj) 用于判断调用对象是否与参数对象相等。 该方法默认比较两个对象的地址是否相等,与 == 运算符的结果一致 若希望比较两个对象的内容,则需要重写该方法。 若该方法被重写后,则应该重写hashCode方法来保证结果的一致 性。 int hashCode() 返回对象的哈希码值(内存地址的编号) 若两个对象调用equals方法相等,则各自调用该方法的结果必须相同 若两个调用对象equals方法不相等,则各自调用该方法的结果应该 不相同。 为了使得该方法与equals方法保持一致,需要重写该方法。使用所有成员变量生成一个哈希值 @Override public int hashCode() {...
-
JAVA 面向对象编程
面向对象编程 面向对象编程的概念 万物皆对象 对象有属性(特征),行为(方法) 先以面向对象的思想进行分析,然后使用面向对象的编程语言进行表达的过程。 面向对象 VS 面向过程 面向对象编程是软件产业化的结果 三大特点:封装、继承、多态 类和对象的概念 对象主要是客观存在的实体,在JAVA中指内存中的一块存储区域 类 是对具有相同特征和行为的对象的抽象, 在JAVA中体现为一种引用数据类型,里面包含属性和方法(行为) 类是用于构建对象的模版,对象的数据结构由定义她的类来决定 类的定义 class ClassName { classBody; … } 注意:当类名由多个单词组成时,每个单词首字母大写 对象的创建 new ClassName(); 注意: a. 使用new关键字创建该类的对象,这个过程叫做类的实例化...
-
搭建一个JAVA后台
本文会演示如何一步步的搭建一个简单的JAVA后台 环境准备 JDK:https://www.oracle.com/java/technologies/javase-downloads.html 下载完之后跟着流程点点点就可以了 配置Path、JAVA_HOME(window电脑,mac不需要) 参考:https://www.bilibili.com/video/BV1G7411F7v4?p=11 p11~14 Tomcat:https://tomcat.apache.org 下载之后解压到对应文件夹就可以. 打开 根目录下面的 bin文件夹,可以找到 startup.bat, startup.sh,windows用户点击startup.bat可以启动tomcat, mac 用户在terminal中运行 ./startup.sh .如果环境安装没问题的话,可以正常启动tomcat. terminal会返回如下信息 $ ./startup.sh Using CATALINA_BASE: /Users/april/Java/apache-tomcat-9.0.34 Using CATALINA_HOME: /Users/april/Java/apache-tomcat-9.0.34 Using CATALINA_TMPDIR: /Users/april/Java/apache-tomcat-9.0.34/temp...
-
How to build an iOS framework
In this post, you’ll learn how to create an iOS framework written by swift and Objective-C, adding bundle resources, and how to integrate the framework to your project. sample code...
-
Some cool iOS libraries
DWAlertController DWAlertController is an UIAlertController that supports displaying any view controller instead of title and message. DWAlertController fully copies the look and feel of UIAlertController and has the same API....
-
How to find all the unused Objective-C selector
After several iterations, we may find our iOS project has many unused selectors or class, if we want to clear the code and make the project run faster. We might...
-
Timer for toastmasters' timer
This is a wechat mini program dedicated for toastmasters’ timer. It follow the time rule and show you the color to post your card. How to use it? Add timer...
-
如何对别人的iOS应用"动手脚"
这篇文章会讲如何改造你手机里的iOS应用,让它成为你想要的样子,当然,这里只是抛砖引玉,关键还是要看读者的想象力。 示例代码 准备工作 下载应用包 首先安装PP助手到Mac端。 然后在PP助手的应用商店找到你想要“动手脚”的app包,这里以开眼为例 点击下载完成后,点右上角的Downloads 打开文件位置 OKay, 已经获得一个越狱应用,越狱应用就是没有加密的应用 正文 使用XCode随意创建一个iOS工程,选择自己喜欢的语言,这里选择Object-C 然后运行起来,让这个应用先运行到自己的iPhone上 然后创建一个叫 appSign.sh的脚本文件,里边写上如下内容 # ${SRCROOT} 它是工程文件所在的目录 TEMP_PATH="${SRCROOT}/Temp" #资源文件夹,我们提前在工程目录下新建一个APP文件夹,里面放ipa包 ASSETS_PATH="${SRCROOT}/APP" #目标ipa包路径 TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa" #清空Temp文件夹 rm -rf "${SRCROOT}/Temp" mkdir -p "${SRCROOT}/Temp"...
-
使用python搭建简单的后台
just give me the code 环境搭建 首先确认安装了 python3.x, 可以去官网下载, python org 然后安装Visual Studio Code, 因为它可以很方便的编辑python 和 h5 等语言,还可以debug,打断点 然后安装python插件 安装了python之后终端输入 pip3 install tornado 安装python的rest框架 tornado 创建一个简单的get请求 创建第一个接口, 使用 8801 端口...
-
instruments的使用
注意: 不能使用越狱的手机来做性能检测 前提条件:后面使用的是XCode 10.3 的版本,手机为iOS 12, iOS 13 系统 这篇文章会介绍如何使用instruments测量CPU,GPU,内存,耗电,具体的优化方法,请查看另外一篇 性能优化 tips:如果打开instrument看不到代码的调用栈,确认一个项目的配置 打开这个配置之后,可以在instrument 中直接查看对应的项目源码,不打开就只能看到地址 如果还是看不到代码的调用栈,检查一下File->Symbols。查看自己项目对应项,应该会看到路径是红色的。 解决方法,重定向,打开工程,找到.app 对应的地址,copy 点击文件夹按钮,cmd+shift+G索引到刚刚copy的文件链接,这次应该就可以看到调用栈了。 如果每次都有这样的问题,应该是XCode生成临时文件的路径,和instrument寻找文件的路径没对应上导致的。打开XCode的偏好设置,找到Location->derived data, copy路径。 打开instrument的偏好设置->symbols.添加刚刚复制的路径。这下应该能够永久解决看不到调用栈的问题。 打开项目,点击 Product-> Profile 编译好之后,就可以开始使用instruments 可以看到不同类型的工具 CPU & Memory的检测...
-
性能优化
这一篇主要讲性能优化的策略,性能检测请查看另外一篇instruments 做性能优化之前,首先要有指标,明确需要优化什么? 那里出错了? 一个app的好坏如何定义? 界面是否好看?颜色,设计 内容是否足够吸引人? 交互是否方便合理? 上面这些都是产品设计和内容的问题,不过要把好的东西呈现出来就需要好的程序员啦,开发者在做好内容的同时,要保证做到 应用不能无缘无故崩溃,异常处理 界面展示、交互流畅,零卡顿 耗电量小 app快速启动 应用包尽量小 异常处理 避免意外崩溃,app意外崩溃无非是两种原因 调用方法不当 OC中调用了没有实现的方法 可以使用OC的消息转发机制处理,避免崩溃,并发错误信息当成警告上传,方便后面分析,优化 数组越界 OC 的数组 也同样可以使用消息转发机制避免崩溃 野指针 只能靠经验来尽量减少 内存溢出 加载大内容的东西,没有及时释放。比如同时加载了100000张图片 对于已知的缓存类,可以通过添加内存不足的监听,内存不足时手动释放来解决 对于未知的内存增长可以借助Allocations来检测 循环引用,用完的东西没有释放 每个类打印dealloc或...
-
内存管理
NSTimer & CADisplayLink 不管是NSTimer还是CADisplayLink都依赖于RunLoop,如果RunLoop的任务过于繁重,可能会导致NSTimer不准时 这个两个定时器使用时需要注意循环引用的问题 @interface ViewController () @property(nonatomic, strong) CADisplayLink *link; @property(nonatomic, strong) NSTimer *timer; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(linkTest)]; [self.link...
-
多线程
demo 概念 单核多线程与多核多线程 线程和进程是什么 线程是CPU调度和分配的基本单位(可以理解为CPU只能看到线程) 进程是操作系统进行资源分配(包括cpu、内存、磁盘IO等)的最小单位 单核多线程 单核多线程指的是单核CPU轮流执行多个线程,通过给每个线程分配CPU时间片来实现,只是因为这个时间片非常短(几十毫秒),所以在用户角度上感觉是多个线程同时执行。 多核多线程 多核多线程,可以把多线程分配给不同的核心处理,其他的线程依旧等待,相当于多个线程并行的在执行,而单核多线程只能是并发。1. 单CPU中进程只能是并发,多CPU计算机中进程可以并行。2. 单CPU单核中线程只能并发,单CPU多核中线程可以并行。3. 无论是并发还是并行,使用者来看,看到的是多进程,多线程。 iOS 中常见多线程方案 GCD GCD中有2个用来执行任务的函数 用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block); queue:队列 block:任务 用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block); GCD源码...
-
Runloop
iOS 程序启动时会创建一个runloop这样才能响应app的各种交互事件。 iOS 有两套runloop相关的框架 Foundation: NSRunLoop Core Foundation: CFRunLoopRef 可以通过如下方式获取runloop // 获取 runloop对象 // foundation NSRunLoop *mloop = [NSRunLoop mainRunLoop]; NSRunLoop *loop = [NSRunLoop currentRunLoop]; // core foundation CFRunLoopRef cloop...
-
Runtime
验证代码demo isa 要想学习Runtime,首先要了解它底层的一些常用数据结构,比如isa指针 在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址 从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息 上面用到了C语言中的位域 C语言中节省存储空间的一种策略,定义结构体中变量占用空间的大小。 c 位域 (c bit field) nonpointer 0,代表普通的指针,存储着Class、Meta-Class对象的内存地址 1,代表优化过,使用位域存储更多的信息 has_assoc 是否有设置过关联对象,如果没有,释放时会更快 has_cxx_dtor 是否有C++的析构函数(.cxx_destruct),如果没有,释放时会更快 shiftcls 存储着Class、Meta-Class对象的内存地址信息 magic 用于在调试时分辨对象是否未完成初始化 weakly_referenced 是否有被弱引用指向过,如果没有,释放时会更快 deallocating 对象是否正在释放 extra_rc 里面存储的值是引用计数器减1 has_sidetable_rc...
-
Block
block的本质:OC中的block其实是一个封装了函数调用及调用环境的OC对象 block 底层实现数据结构 int age = 20; void (^block)(int, int) = ^(int a, int b){ NSLog(@"block age -> %d", age); NSLog(@"block a -> %d", a); NSLog(@"block b -> %d", b);...
-
iOS-Interview
面向对象 一个NSObject对象占用多少内存? 系统分配了16个字节给NSObject对象(通过malloc_size函数获得) 但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得) OC对象有内存对齐机制,OC对象占用的空间是16byte的倍数 对象的isa指针指向哪里? instance对象的isa指向class对象 class对象的isa指向meta-class对象 meta-class对象的isa指向基类的meta-class对象 OC的类信息存放在哪里? 对象方法、属性、成员变量、协议信息,存放在class对象中 类方法,存放在meta-class对象中 成员变量的具体值,存放在instance对象 KVO iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类NSKVONotifying_XXX 当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数 _NSSetXXXValueAndNotify的实现伪代码如下 willChangeValueForKey: 父类原来的setter didChangeValueForKey: 内部会触发监听器(Oberser)的监听方法 (observeValueForKeyPath:ofObject:change:context:) 如何手动触发KVO? 手动调用willChangeValueForKey:和didChangeValueForKey: 直接修改成员变量会触发KVO么? 不会触发KVO KVC 通过KVC修改属性会触发KVO么? 会触发KVO...
-
关联对象(association)
iOS 的category无法添加属性, 但是可以通过runtime的关联对象相关方法实现category有成员变量的效果。 runtime方法 // 添加关联对象 void objc_setAssociatedObject(_Nonnull object, const void * _Nonnull key, id _Nullable value, objc_AssociationPolicy policy); // 获取关联对象 id objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key);...
-
Category
Category 即分类,Objective-C中的分类的可以给目标类增加一些类方法、实例方法、还有遵守更多协议(protocol), 分类如果有目标类方法的实现,会覆盖目标类的方法. Category 的使用 下面定义一个AYPerson类,它是分类的目标类 @interface AYPerson : NSObject @property(nonatomic, assign) NSInteger age; @property(nonatomic, strong) NSString *name; + (void)classPerson; - (void)thePerson; @end @implementation AYPerson + (void)classPerson { NSLog(@"%@-%@", self,...
-
KVO
KVO 是 key-value observing 的缩写,即 “键值监听”, 可以用于监听某个对象属性值的变化 KVO 的使用 // 定义一个简单的类 @interface AYPerson : NSObject @property(nonatomic, assign) NSInteger age; @end @implementation AYPerson @end AYPerson *p = [[AYPerson alloc] init]; //...
-
KVC
KVC即Key-Value Coding, “键值编码”, 可以通过一个key来访问某个属性 常用 API 有: - (void)setValue:(id)value forKeyPath:(NSString *)keyPath; - (void)setValue:(id)value forKey:(NSString *)key; - (id)valueForKeyPath:(NSString *)keyPath; - (id)valueForKey:(NSString *)key; 调用KVC的方法可以触发KVO setValue方法的调用顺序如上图 valueForKey方法的调用顺序如上图
-
Class struct 的组成
Class 结构体 直接点击XCode中NSObject会索引到如下结构体,这个是已经弃用的结构 struct objc_class { Class _Nonnull isa OBJC_ISA_AVAILABILITY; #if !__OBJC2__ Class _Nullable super_class OBJC2_UNAVAILABLE; const char * _Nonnull name OBJC2_UNAVAILABLE; long version OBJC2_UNAVAILABLE; long info OBJC2_UNAVAILABLE; long instance_size...
-
isa 和 superclass 指针
OC对象的分类 instance 实例对象, 实例化之后的对象, 每个instance在内存中的地址都不一样, instance对象在内存中存储的信息包括:isa指针, 其他成员变量 class 类对象, 存有类信息, 在内存中只存了一份, class对象在内存中存储的信息主要包括: isa指针, superclass指针, 类的属性信息(@property), 类的对象方法信息(instance method), 类的协议信息(protocol), 类的成员变量信息(ivar) meta-class 元类对象, 在内存中只存了一份, meta-class对象和class对象的内存结构是一样的, 但是用途不一样, 在内存中存储的信息主要包括:isa指针, superclass指针, 类的类方法信息(class method) instance &...
-
Objective-C 对象的本质
OC的类是使用C/C++的结构体来实现的 可以在terminal中运行如下代码, 把OC代码转换成c++代码,方便研究 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc objcFile.m -o objcFile_arm64.cpp NSObject 一个NSObject对象占用多少内存? 系统分配了16个字节给NSObject对象(通过malloc_size函数获得) // 获取指针指向地址占用内存的空间 16 NSLog(@"Malloc size -> %zd", malloc_size((__bridge void *)obj)); 但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得) NSObject *obj =...
-
WKWebView 与JS 交互,及内存泄漏解决
使用 WKWebview 和JS交互 { let config = WKWebViewConfiguration() let messageName = "test" /* Adding a scriptMessageHandler adds a function window.webkit.messageHandlers.<name>.postMessage(<messageBody>) for all frames */ // 添加消息监听, 一个类型使用一个messageName config.userContentController.add(self, name: messageName)...
-
数据结构
时间复杂度 定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。 用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。 一个程序内部执行(循环)的次数 O(1), O(n), O(n*n)对应的曲线 空间复杂度 定义:算法的空间复杂度通过计算算法所需的存储空间实现,算法的空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。 很多时候,可以用空间换时间,通过存储常量来减少运算量 数组 & 链表 数组:在内存中分配一块连续的空间 添加和删除都需要移动关联的一系列数据 时间复杂度 access: O(1) insert: O(n) delete: O(n) 链表:链表中元素不需要存在同一个地方,通过Next指到下一个元素,相对比较灵活 插入和移除元素,只需要改两个元素的next指针即可 时间复杂度 space O(n) prepend O(1)...
-
回归算法-Regression
-
分类算法-classification
前置概念 - Metric TP 真阳性; FN 假阴性; FP 假阳性; TN 真阴性 TPR 阳性里边被预测到的比率; TNR 阴性里边被预测到的比率 FPR 假阳率, 把没病的人预测为有病的概率; FNR 假阴率, 把有病的人预测为没病的概率 P 预测为阳性的样本, 真正是阳性的概率; R 阳性样本中被召回,被找到的概率 Receiver Operating Characteristic Curve...
-
机器学习的杂谈
python 包管理 python 版本 # 当前python 版本信息 python --version -V # 查看电脑里边所有python which -a python conda 常用指令 # 获取当前conda的信息 conda info # 更新conda 版本 conda update conda # 安装包 conda...
-
决策树与随机森林
前置概念 Entropy(墒): 热力学中表征无知状态的参量之一, 其物理意义是体系混乱程度的度量. Information Entropy(信息墒):信息墒是用来消除随机不确定性的东西,度量样本集合纯度的指标 树模型 & 线性模型 线性模型 对每个特征进行加权求和 score = f(Wx1X1 + Wx2X2 + Wx3X3 + …) 树模型 根据每个特征值, 对样本进行分类 决策树 可以用决策树对数据进行分类, 可以用 信息纯度 来衡量分类效果好坏. * 目标:...
-
人脸识别-face recognise
MTCNN(Multi-task Cascaded Convolutional Networks) 多任务人脸识别网络,它的CNN网络分为三部分.首先,使用一个浅层CNN生成候选框;然后是一个稍微复杂点的CNN,用来甄别候选框中哪些没有人脸;最后用一个更加复杂的CNN网络来进一步优化输出,并输出人脸关键点. 这个网络的主要特点:(1)把人脸检测和人脸对齐结合起来,使用比较轻量的CNN结构,可以做到实时检测.(2)使用 同步挖掘难检测样本(online hard example mining) 的方法来提升网络的精度. 网络结构 如上图所示,输入一张图片,首先按不同比例对它进行缩放,得到一个图片金字塔,用来输入到如下的网络. Proposal Network(P-Net):一个全卷积网络用来输出包含人脸的候选框,输出的候选框会使用非极大抑制(non-maximum suppression)的方式删除高度重叠的框. Refine Network(R-Net):上一阶段所有的候选框会喂到另一个CNN网络,用来进一步删除错误的候选框,同样也会使用NMS合并候选框. Output Network(O-Net):这个阶段跟上个阶段有点类似,进一步优化上一阶段的输出,不过这个阶段还会输出人脸的五个关键点. 与其他多分类任务相比,人脸检测需要更少,但差异度更大的滤镜. 训练过程 Loss函数 人脸分类:这个任务是分辨图片中是否有人脸,所以可以使用一个二元的交叉墒作为损失函数 框回归:对于每个候选框,我们计算它和最近的标记框的偏移量(左右上下,四个角) 关键点回归:预测的每个关键点和标记的关键点的偏移量 多任务训练:在每个阶段,对应的网络要完成不同的任务,所以每个阶段的训练输入图片也有所不同,比如包含人脸的,没有人脸的,还有半张人脸的.因此上面(1-3)中的损失函数可能会用不到.比如,如果图片中没有人脸,那么只计算分类的损失函数 Lidet,另外两个函数等于零.所以整体的损失函数如下: N 代表所有训练样本量…....
-
SqueezeNet & MobileNet
写在前面: 这篇文章是我阅读SqueezeNet 和 MobileNet 之后的理解总结,写给健忘的自己. 要读这篇文章需要了解熟悉卷积网络,如果还不了解,可以先查看这篇文章CNN卷积神经网络 介绍和起因 为了更高效的训练网络, 现有的一些经典CNN网络,比如VGG, GoogleNet, ResNet,虽然在预测上精度很高,但是由于参数比较多,所以要把它们训练好还是很消耗资源和时间的.所以需要一个小的模型. 当把模型更新到终端的时候需要传输的数据变少 方便把模型迁移到嵌入式芯片中 SqueezeNet(2016) 标题很好的概括了SqueezeNet的特点,AlexNet级别的精度,参数却小了50倍,整个模型的大小不到0.5MB. 网络结构 网络结构设计的三个策略 把3x3的卷积核替换成1x1. 在卷积滤镜数一样的情况下,使用1x1的卷积核和3x3的相比可以把需要的参数缩小9倍. 减少输入到3x3卷积的输入通道数. 一个卷积核是3x3的卷积层需要的参数为(输入通道数)x(滤镜数)x(3x3).所以为了减少参数.不仅可以参照策略1减少卷积核为3x3的卷积层,还可以通过减少输入到3x3卷积的 输入通道数.(现在看不懂没关系,后面会详细解释) 延迟下取样,这样卷积网络会拥有更大的激活特征图. 卷积网络输出特征图的大小由输入数据的大小(图片的 长 和 宽),还有卷积的步长(stride)决定.如果 stride > 1,那么输出图约为输入图的大小除以stride(具体大小受padding的策略影响),数据每次变小都会损失一些信息.所以在卷积网络中,前段尽量设置stride=1,stride>1放在网络的靠后阶段,可以保留图片的更多特征,这样可以有效提高预测的精度....
-
如何深度学习进行语义分割
当下,语义分割 是计算机视觉领域的一个关键研究点.如上图,语义分割是计算机进行场景理解的一个过程.随着各种从图像中获取信息的应用场景的增加,比如,自动驾驶,人机互动,虚拟现实….所以,使用计算机来解读场景也受到更多的关注.随着深度学习在这几年越来越火,很多语义分割的问题都可以使用基于卷积神经网络的深度模型来解决,它能达到的精度和效率远高于其他方式. 什么是语义分割? 从粗粒预测到细粒度预测,语义分割是必然要经历的过程: 一开始是 图片分类, 它可以预测图片的主体组成 然后是 目标检测, 它不单可以预测图片的分类,还可以标记出目标在图片中的位置 最终, 语义分割 实现了细粒度预测,它可以预测图片上每个像素属于那一类,所以每个像素都可以使用对应分类的颜色进行标记. 现在有哪些实现语义分割的方式? 语义分割的结构通常分为两部分,一个 编码器 网络,还有一个 解码器 网络: 编码器 通常是一个预训练的分类网络,比如VGG/ResNet 解码器 的任务是从语义上投射编码器(低像素)识别出的特征到高像素空间来获得像素级的目标分类 与分类任务不同,前者唯一重要的是从深层网络获得最终的预测结果,语义分割不仅需要像素级的分类,还需要投射编码器在不同阶段学到的分类特征到像素空间.不同的实现方式使用的不同的解码器的实现原理各有不同.让我们来探索一下3种主要的方式: 1–基于区域的语义分割 基于区域的方法通常遵循“通过识别来进行分割”的流程,即先提取图片不定大小的区域然后进行解析,进而获得基于区域的分类.在预测的时候,基于区域的预测被转化成像素级别的预测,通常把一个元素标记为包含这个元素的区域中分数最高的那个区域. R-CNN(Regions with CNN feature)是基于区域的语义分割的一种方式.它基于目标检测进行语义分割.具体来说,R-CNN先使用选择性搜索来提取大量的目标区域,然后计算每个区域的CNN特征.最终,使用分类用的线性支持向量机算法来对每个区域进行分类.传统的CNN主要用于图片分类,与之相比,R-CNN可以完成更加复杂的任务,比如目标检测和图片分割,甚至成为这两个领域的重要基础.此外,R-CNN可以在所有CNN经典网络的基础上进行搭建,比如AlexNet、VGG、GoogleNet、ResNet....
-
seq2seq,RNN中的多进多出
seq2seq,即往神经网络输入一个序列,然后神经网络处理完整个序列之后再返回一个序列.上图中,一个紫色方块代表一个单元输入,一个橙色方块代表一个RNN网络,一个绿色方块代表一个单元输出.这是RNN众多使用方式中的一种.可以用来做翻译,比如,输入一个完整的中文句子,然后可以得到一句对应的英文翻译.做概括,输入一段文字,然后可以得到一个话的总结.还可以做视频描述,把视频的每一帧图片作为输入,然后可以返回一个话描述视频的场景. 使用tensorflow实现seq2seq的步骤和代码 下面会介绍搭建seq2seq网络的关键代码,如果想看完整的代码,可以查看这里(搭建简单的seq2seq,网络可以按照字母表顺序,给输入的序列重新排序) 构建网络的伪代码: 1.编码器 * 输入向量化 * 解码器单元 2.解码器 a - 预处理解码器输入 b - 搭建解码器 * 输入向量化 * 解码器单元 * 全链接输出层 * 训练用的解码器 * 预测用的解码器 3. Seq2seq 模型 ->...
-
LSTM长短期记忆网络
循环神经网络(Recurrent Neural Networks) 人类不会每次都从零开始思考.当你在读这篇文章的时候,你通过前面看过的文字理解每个新出现的词语.你不会忘记前面的所见而重新从零开始思考.你的思维有持续性. 传统的神经网络不能做到这些,这似乎是它的最大局限.例如,想象一下你想分辨电影中每个时间点发生的事情.传统神经网络如何用前一个场景去推导下一个场景,未可知. 循环神经网络为此而生.它是一个环状的网络,这让信息可以续存. 上图中,神经网络单元,A,输入 Xt 输出 ht.环状网络结构让信息从上一个网络单元传到下一个. 这个环让循环神经网络看上去有点神秘.然而,如果你再使仔细琢磨一下,它其实和普通神经网络没有很大的区别.一个循环神经网络可以看作一个相同的网络被复制了n多份,每个网络把信息传递给下一个.想象一下,如果我们把这个环展开: 这种链性特征显示出循环神经网络跟序列有紧密关联.它们是神经网络为了处理序列性数据而产生的结构. 这确实挺有用的!过去的几年,把RNN应用到各式各样的问题取得了令人不可置信的成功:语音识别,语言模型,翻译,图片描述…还不断有新的应用出现. 这些成功案例的关键在于使用了“LSTM”,循环神经网络的一种类型,它在处理很多任务时,比标准型效果好非常非常多.几乎所有基于循环神经网络取得的卓越成就都是使用了LSTM.这篇文章将会详细探讨LSTM. 长期依赖的痛点 RNN 的作用在于它可能能够把前面的信息关联到当前任务中,比如使用前面的视频可能有助于理解当前的画面.如果RNN可以做到这些,它们将会极其有用.但是它可以吗?看情况. 有时候,我们只需要观察最近的信息就可以完成当前任务.举个例子,考虑一个语言模型通过前面的几个词预测下一个词.如果我们试图预测“白云飘在 天空”的最后一个词,我们不需要更多上下文 - 很明显下一个词会是 天空.诸如此类,需要预测的信息和关联信息的间隙比较小,RNN可以学会如何使用过去的信息. 但是别的场景我们可能需要更多的上下文.考虑一下预测这句话的最后一个词,“我在法国长大…我说着流利的 法语.”最靠近的句子可以预测下一个词可能是一种语言,但如果我们想知道是哪种语言,我们需要包含 法国 的段落,这就离得比较远了.完全有这样的可能,我们需要的信息会埋藏在很遥远的上文. 不幸的是,随着间隙变大,RNN开始无法学习信息之间的关联性. 理论上,RNN完全有能耐处理这样的“长期依赖”任务.人类可以很仔细的挑选合适的参数,让它解决这种类型的问题.遗憾的是,事实上,RNN几乎不能习得这一技能.这个问题在这两篇论文Hochreiter (1991) [German]...
-
RNN循环神经网络
在循环神经网络(RNN)中,前一个网络状态会影响输出,所以它可以处理依赖“时间线”的问题. 上一个网络层输出作为下一个网络的输入,如此循环. 换句话说,RNN是一个输入为 输入向量 和 前一个状态 的函数. 应用场景 机器翻译 (中文->英文) 语音转文字 市场预测 给图片加标注(与CNN结合) 如下是循环神经网络在不同场景使用时的输入、输出情况.红色的方块是输入,蓝色的是输出,绿色的是中间隐藏层(RNN单元). 一对一: 正常的向前反馈网络,比如:输入图片, 输出标签 一对多(RNN):(图片描述)输入图片,输出对应图片文字描述 多对一(RNN):(情感分析)输入一个段落的文字,输出 情感(积极/消极) 多对多(RNN):(翻译)输入英文语段,输出翻译的葡萄牙语段. 多对多(RNN):(视频分类)输入视频,输出视频描述. RNN网络结构 如下,我们描述如何给RNN添加“深度”,还有在 时间线 上如何展开(unroll)RNN.可以观察到RNN的输出喂给更深一层的RNN,而它的 隐藏状态 喂给新的RNN. 描述图片 如果你把卷积神经网络(CNN)和循环神经网络(RNN)链接起来....
-
CNN卷积神经网络
图片分类 做图片分类的时候,我们需要一个神经网络以一张图片为输入,然后输出图片对应的类型. 让我们以一辆车为例子. 这件事对人来说很简单,但是对一个神经网络呢?神经网络会如何处理? 图片是像素的集合体 从神经网络的角度图片就是一个数字的矩阵.从下图,你可以看到放大的黑白汽车的一部分.图片由很小的小方格子组成,每个方格称为一个像素.对于黑白图片,每一个像素的值在0~255之间,0代表黑色,255代表白色. 正常的彩色图片,图片上的每个像素点都由红、绿、蓝三种像素组成.你可以把这想象成红、绿、蓝三张图片叠加到一起.彩色像素被表示为三个元素的数组.例如,RGB像素值,[255,0,0]是纯红色,而[200,0,200]是紫色.从这个角度,我们可以想象一下每张图片为一个3D的矩阵,有宽、高,还有深度——颜色,黑白图片的深度为1. 要创建一个图片分类器,我们需要一个算法,可以观察这些像素并且能够识别出图片中有一辆汽车.我们也希望这个分类器能够在不同光线条件下(晚上或白天)识别汽车,这个分类器能很好的泛化,这样他才能识别出不同环境不同角度下不同的汽车. 观察一下几张汽车的图片,你会发现每张图片的像素都差异很大.所以,这个分类器要做到能够识别出不同场景图片中有汽车存在. 数据导向的方法 因为没有明确的方法可以创建一组规则来确定一堆像素是一辆车子,我们将采用数据导向的方法: 收集一组有汽车标签的图片 训练一个模型准确预测图片类别 在这个例子中,我们计划训练一个卷积神经网络(convolutional neural network).这个网络在训练中,会学到汽车的哪部分为关键特征,例如轮胎和车窗,并且它要足够泛化,这样才能识别不同角度不同环境下的汽车. 卷积神经网络 我们将使用卷积神经网络(CNN)来完成图片分类的任务.CNN能够发现并表示彩色图片空间里的特征.很多神经网络一次只关注一个输入(处理图片的时候,一个像素),但卷积神经网络可以一次接收图片中一个区域的像素,并学会寻找空间上的特征. 每个CNN都是由多个网络层构成,主要的三种网络类型为卷积层(convolutional),池化层(pooling),和全链接层(fully-connected),如下图所示.一般,你可以看到CNN由很多网络层构成,尤其是卷积层和池化层.每个层由多个节点构成,这些节点对输入数据进行相应处理. 卷积层 卷积层可以理解为这个神经网络的特征 提取器,它被训练来寻找输入图片的空间特征. 这个网络层通过对图片使用一系列不同的图片滤镜,也即卷积核(convolutional kernels)来生成的.这些滤镜在图片上一个像素一个像素的扫描,并且生成一个差不多跟原图片一样大小的输出图片.多个卷积核会生成多个输出图片. 如果我们有四个不同的卷积核,这样就会生成四张不同的滤出图片.每个不同的滤镜会提取输入图片中不同的特征,而这些特征对最终的图片分类有帮助.例如,一个滤镜可以检测图片中物体的边缘而另一个可能可以提取色彩中独特的特征.这些滤镜,叠合到一起就是一个卷积网络层. 高频率通过滤镜 (High-pass Filter) 高频率通过滤镜用来检测在小范围内强度的剧烈变化.所以,高频率通过滤镜会高亮由暗变亮或由亮变暗的区域. 例如,如果我们对一张汽车图片使用高通过滤镜,我们会看到汽车的边缘被检测到,因为边缘明暗变化比较大.物体的边缘通常强度变化比较大,因此,高频率通过滤镜有时候被称为“边缘检测滤镜”....
-
神经网络基本概念
相关练习项目:一个简单的神经网络 感知器 (perceptron) 即信号输入元, 单个的数据源, 比如人的眼睛,耳朵,鼻子,都是感知器 离散型和连续型预测 (discrete & continuous) 激活函数 (activation function) 使用连续激活函数,预测的结果不是非对即错,而是一个概率,表示预测结果的可靠,及确定性 SoftMax 多类别分类时使用 SoftMax 定义 def softmax(L): expL = np.exp(L) return expL/expL.sum() 分类问题的预测结果使用softmax作为激活函数,转化之后的结果加总为 100%,每个值代表一个预测结果可能发生的概率 One-hot Encoding 多类别分类时,分类目标数据一般表示为[2,4,56,7,8,...],需要转换成类似...
-
一些深度学习资源
如何搭建一个git pages,个人页 相关书籍 Grokking Deep Learning by Andrew Trask. Use our exclusive discount code traskud17 for 40% off. This provides a very gentle introduction to Deep Learning and covers the...