作者存档: amyflash - 第11页

大数据平台从理论到实践4

udf-hive 类比 sql 存储过程
kettle及竞品分析

LDAP认证

LDAP(Light Directory Access Protocol)这项被广泛支持的协议。这是一个轻量、灵活、通用、长期可靠、可自有部署的目录服务协议。所谓目录服务,本质上是一个适合规划组织和账户结构的数据库标准和实现。各类软件可以通过类似数据库查询的形式,统一存取LDAP内的数据,以实现账号管理和登录认证的统一。

软件选型方面,目前兼容LDAP协议的最主流实现方案有二:Linux操作系统下开源的OpenLDAP,以及Windows Server操作系统下闭源的Active Directory。我们将以OpenLDAP为例讲解,在实际选型中,只要按照操作系统的熟悉程度两者择一即可。

Kerberos 协议

参考:https://www.zhihu.com/question/22177404
摘录:食堂打饭先买饭卡

参考大数据需求文档
https://wenku.baidu.com/view/3dce57530b4e767f5acfcecc.html

大数据平台从理论到实践3

好了,今天供应商又提到一个新概念,Hadoop体系下,支持对接LDAP体系提交任务,好啦,LADP是个啥,来给自己科普下。
原文参考:https://blog.csdn.net/Joe192/article/details/97895430
原文摘录:

OLTP,也叫联机事务处理(Online Transaction Processing),表示事务性非常高的系统,一般都是高可用的在线系统,以小的事务以及小的查询为主,评估其系统的时候,一般看其每秒执行的Transaction以及Execute SQL的数量。在这样的系统中,单个数据库每秒处理的Transaction往往超过几百个,或者是几千个,Select 语句的执行量每秒几千甚至几万个。典型的OLTP系统有电子商务系统、银行、证券等,如美国eBay的业务数据库,就是很典型的OLTP数据库。

OLAP,也叫联机分析处理(Online Analytical Processing)系统,有的时候也叫DSS决策支持系统,就是我们说的数据仓库。在这样的系统中,语句的执行量不是考核标准,因为一条语句的执行时间可能会非常长,读取的数据也非常多。所以,在这样的系统中,考核的标准往往是磁盘子系统的吞吐量(带宽),如能达到多少MB/s的流量。

LDAP是一个轻量级的产品(LightWeight),是一个Directory(D),存取的协议(Access Protocol)。
我要着重指出,LDAP是一个数据库,但是又不是一个数据库。说他是数据库,因为他是一个数据存储的东西。但是说他不是数据库,是因为他的作用没有数据库这么强大,而是一个目录。
为了理解,给一个例子就是电话簿(黄页)。我们用电话簿的目的是为了查找某个公司的电话,在这个电话簿中附带了一些这个公司的基本信息,比如地址,经营范围,联系方式等。
其实这个例子就是一个LDAP在现实生活中的表现。电话簿的组织结构是一条一条的信息组成,信息按照行业,类比进行了分类。每条记录都分成了若干的区域,其中涵盖了我们要的信息。这就是一个Directory。一个树状的结构,每个叶子都是由一条一条的分成若干区域的记录。LDAP就是这么一个东西。

可以通过以下三句话快速的认识一下LDAP:
LDAP:Lightweight Directory Access Protocol,轻量目录访问协议。
LDAP服务是一个为只读(查询、浏览、搜索)访问而优化的非关系型数据库,呈树状结构组织数据。
LDAP主要用做用户信息查询(如邮箱、电话等)或对各种服务访问做后台认证以及用户数据权限管控。
名词解释
DC:domain component一般为公司名,例如:dc=163,dc=com
OU:organization unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文
CN:common name为用户名或者服务器名,最长可以到80个字符,可以为中文
DN:distinguished name为一条LDAP记录项的名字,有唯一性,例如:dc:”cn=admin,ou=developer,dc=163,dc=com”
更多参考:https://mp.weixin.qq.com/s/JyH5mqwWFt0N1nGYZqBCBQ

大数据平台从理论到实践2

大数据平台里会产生脏数据,所以很多大数据平台的供应商都说他们有脏数据管理功能,那什么是脏数据呢,我们一起来了解下。
先看一个例子:https://blog.csdn.net/u012762054/article/details/81668209
原文摘录:
故事起因:多人同时操作一个工作单据,保存时间有先后,后保存的数据覆盖了前面保存的数据。网上找到文章都是讲并发处理的原理,没人提到数据丢失后的处理。
这是个真实的案例,对于数据量很少的单据可以随时丢弃脏数据,但是如果是软件管理系统里含有大量数据的表单,直接丢弃就不好了。见下图
货代海运信息录入资料图
举例说明,我们在给一个供应链客户做的一张工作单,里面涉及的服务同时有两种(海运和陆运),其中:
1. 安排海运工作的文员A记录海运的信息;
2. 安排陆运工作的文员B记录陆运的信息;
但是非常不幸的是,两人几乎在同一时间段打开了同一张工作单据,分别录入自己负责的信息,然后保存(A在前,B在后),之后A在查看单据的时候就叫起来了:天啦,我辛辛苦苦的数据不见了!
聪明的你一定想到了,文员B在打开工作单输入“陆运”信息时,“海运”信息全是空的,最后保存时把A的数据给覆盖了(导致A的“海运”数据不见了),原理图如下:

A和B打开单据时,数据是一样的

你也许会嗤之以鼻:切,不就是并发没处理好,导致数据覆盖么。这点小问题,秒秒钟搞定的事。

这种典型的数据并发操作问题,技术上的解决方案也是一搜一大把,归结为两种:

  1. 悲观锁:任何一个人打开编辑此单据,标记为锁住,其它人等不得打开编辑,直至它被解锁。

  2. 乐观锁:任何人都可以打开单据,可以编辑,保存时通过版本号校验,不通过者视为脏数据,提示数据已更新,不能保存。

鉴于我们的项目是基于WEB的,第一种直接否掉了,第二种实现起来,代码也不难。
我把以上的技术一分析,给她们回复:“我们有了解决方案,谁先保存谁赢,后面才保存的同学,系统说你来晚了,不好意思,你的数据要重新录咯”。So easy,小问题嘛,很容易解决滴。
——————– 剧情反转的分割线——————

可没料到,文员A跳起来对我们说:“ 你们的系统就是狗屎!我花了半个小时辛辛苦苦输入的几十个数据,因为我保存晚了,说没了就没了,你TM在逗我?!”。
咦?我感觉到被妥妥的打脸了,想想人家说得很有道理。数据录入多的人,需要的时间也更长,保存的时间当然会靠后,按我的处理方法,吃亏的是最辛苦的人。原理图如下:
好吧,我道歉,我再想想办法。
And, 作为一个伸手党,我开始在百度上找相关的处理方法,尝试了无数关键字去查找,讲数据库并发冲突原理的有一堆文章,可是就是没人考虑过数据丢失的人的感受,没有人讲如何处理脏数据,没有人!
你们这些宅男IT狗(包括我啊),你们不知道做运输公司、货代、报关企业里接单录单的妹子是多么需要有人多为她们想想,如何才能高效录入单据和节约时间的么?
在和组里小伙伴经过激烈的讨论后,最终采取的方案是:
把用户输入的临时数据在刷新前先保存起来,刷新后在页面提示其可以恢复之前的未保存的数据,有冲突的数据做提示。
技术实现
1. 如果后台提示是版本号不一致的问题,将用户所填的数据保存到浏览器 localstorage;
2. 刷新页面后,判断当前单据是否有缓存数据,如果有,则提示“你有未保存数据,是否恢复?”;
3. 选择“是”, 恢复数据到页面中,并做冲突提示,从localstorage删除数据缓存;
4. 选择“否”,不恢复数据,从localstorage删除数据缓存;

根据此做出方案,录单文员那边表示这个功能棒棒哒。哟吼,问题就此解决咯。文员和IT狗又可以愉快的玩耍了,么么哒!
结论
即将丢失的脏数据也许花费了用户大量的时间去录入,我觉得这个脏数据缓存处理非常重要和必要,看情况多想想就会提供多些价值。IT开发人者要么是觉得过于简单没在意,要么是开发者没有进一步想这个问题,这是非常不好的。我认为每个人的时间和效率都是无比珍贵的,希望同学们不要浪费你的用户的时间。
既然如何处理这个脏数据问题在网上没人提到(或是我没找到),那么我就把它记录下来,以助后人。


一个事物读取了另一个事物未提交的数据。读“脏”数据是指事物A修改某一数据,并将其写回磁盘,事物B读取同一数据后,A由于某种原因被撤销,这时A已修改过的数据恢复原值,B读到的数据就与数据库中的数据不一致,则B读到的数据为“脏”数据,即不正确的数据;脏数据的种类及处理方法

首先,我们来了解一下脏数据的种类,明白我们可能会面对哪些问题。
1 、数据缺失:缺一些记录,或者一条记录里缺一些值(空值),或者两者都缺。原因可能有很多种,系统导致的或人为导致的可能性都存在。如果有空值,为了不影响分析的准确性,要么不将空值纳入分析范围,要么进行补值。前者会减少分析的样本量,后者需要根据分析的计算逻辑,选择用平均数、零、或者等比例随机数等来填补。如果是缺一些记录,若业务系统中还有这些记录,则通过系统再次导入,若业务系统也没有这些记录了,只能手工补录或者放弃。

2、 数据重复:相同的记录出现多条,这种情况相对好处理,去掉重复记录即可。但是怕就怕不完全重复,比如两条会员记录,其余值都一样,就是住址不一样,这就麻烦了,有时间属性的还能判断以新值为准,没有时间属性的就无从下手了,只能人工判断处理。

3、 数据错误:数据没有严格按照规范记录。比如异常值,价格区间明明是100以内,偏偏有价格=200的记录;比如格式错误,日期格式录成了字符串;比如数据不统一,有的记录叫北京,有的叫BJ,有的叫beijing。对于异常值,可以通过区间限定来发现并排除;对于格式错误,需要从系统级别找原因;对于数据不统一,系统无能为力,因为它并不是真正的“错误”,系统并不知道BJ和beijing是同一事物,只能人工干预,做一张清洗规则表,给出匹配关系,第一列是原始值,第二列是清洗值,用规则表去关联原始表,用清洗值做分析,再好一些的通过近似值算法自动发现可能不统一的数据。

大数据平台从理论到实践1

最近公司要筛选大数据平台供应商了,每个供应商都给出了自己的优势功能,几乎每个供应商都说自己在数据存储方面特别强大,比如支持块存储、文件存储、对象存储,那这几种存储方式的意义及差异到底是什么呢,我们需要这么多存储方式吗,今天来学习一下。
原文参考:https://www.cnblogs.com/hukey/p/8323853.html

块存储

典型设备:磁盘阵列、硬盘
块存储主要是将裸磁盘空间整个映射给主机使用的。
就是说例如:磁盘阵列里面有5块硬盘,然后可以通过划逻辑盘、做Raid、或者LVM等方式逻辑划分出N个逻辑的硬盘。但是逻辑盘和物理盘是两个完全不同的概念。假设每个硬盘100G,共有5个硬盘,划分为逻辑盘也为5个,每个100G,但是这5个逻辑盘和原来的5个物理盘意义完全不同了。例如第一个逻辑盘第一个20G可能来自物理盘1,第二个20G来自物理盘2,所以逻辑盘是多个物理盘逻辑虚构出来的硬盘。
接着块存储会采用映射的方式将这几个逻辑盘映射给主机,主机上面的操作系统会识别到有5块硬盘,但是操作系统是无法区分到底是物理盘还是逻辑盘,它一概就认为只是5块裸的物理硬盘而已,跟直接拿一块物理硬盘挂载到操作系统没区别,至少操作系统感知上没有区别的。
在此方式下,操作系统还需要对挂载的裸硬盘进行分区、格式化后,才能使用,与平常主机内置的硬盘无差异。

优点
(1)这种方式的好处当然是因为通过了Raid与LVM等手段,对数据提供了保护;
(2)可以将多块廉价的硬盘组合起来,称为一个大容量的逻辑盘对外提供服务,提高了容量;
(3)写入数据时,由于是多块磁盘组合出来的逻辑盘,所以几块硬盘可以并行写入的,提升了读写效率;
(4)很多时候块存储采用SAN架构组网,传输速度以及封装协议的原因,使得传输速度和读写效率得到提升

缺点
(1)采用SAN架构组网时,需要额外为主机购买光纤通道卡,还要购买光纤交换机,造价成本高;
(2)主机之间数据无法共享,在服务器不做集群的情况下,块存储裸盘映射给主机,在格式化使用后,对于主机来说相当于本地盘,那么主机A的本地盘根本不能给主机B去使用,无法共享数据
(3)不利于不同操作系统主机间的数据共享:因为操作系统使用不同的文件系统,格式化后,不同的文件系统间的数据是共享不了的。 例如一台win7,文件系统是FAT32/NTFS,而linux是EXT4,EXT4是无法识别NTFS的文件系统的。

文件存储

 典型设备:FTP、NFS服务器
为了克服文件无法共享的问题,所以有了文件存储。
文件存储也有软硬一体化的设备,但是其实一台普通的PC机,只要装上合适的操作系统和软件,就可以假设FTP与NFS服务了,架上该类服务之后的服务器,就是文件存储的一种了。
主机A可以直接对文件存储进行文件的上传和下载,与块存储不同,主机A是不需要再对文件存储进行格式化的,因为文件管理功能已经由文件存储自己搞定了。

 优点
 (1)造价低:随便一台机器就可以,另外普通的以太网就可以,根本不需要专用的SAN网络,所以造价低
 (2)方便文件共享

 缺点
 (1)读写速率低,传输速率慢:以太网,上传下载速度较慢,另外所有读写都要1台服务器里面的硬盘来承受,相比起磁盘阵列动不动就十几上百块硬盘同时读写,速率慢了许多。

对象存储

典型设备:内置大容量硬盘的分布式服务器
对象存储最常用的方案,就是多台服务器内置大容量硬盘,再装上对象存储软件,然后再额外搞几台服务作为管理节点,安装上对象存储管理软件。管理节点可以管理其他服务器对外提供读写访问功能。
之所以出现对象存储这种东西,是为了克服块存储与文件存储各自的缺点,发扬各自的优点。简单来说块存储读写快,不利于共享,文件存储读写慢,利于共享。能否弄一个读写块,利于共享的存储出来呢?于是就有了对象存储。

首先,一个文件包含了属性(术语:metadata,元数据,例如该文件的大小、修改时间、存储路径等)以及内容(数据)。
像FAT32这种文件系统,是直接将一份文件与metadata一起存储的,存储过程先将文件按照文件系统的最小块大小来打散(例如4M的文件,假设文件系统要求一个块4K,那么就将文件打散称为1000个小块),再写进硬盘里,过程中没有区分数据和metadata的。而每个块最后会告知你下一个要读取的块地址,然后一直这样顺序的按图索骥,最后完成整份文件的所有块的读取。
这种情况下读写速率很慢,因为就算你有100个机械臂在读写,但是由于你只有读取到第一个块,才能知道下一个块在哪里,其实相当于只能有1个机械臂在实际工作。

而对象存储则将元数据独立出来了,控制节点叫元数据服务器(服务器+对象存储管理软件),里面主要负责存储对象的属性(主要是对象的数据被打散存放到了那几台分布式服务器中的信息)而其他负责存储数据的分布式服务器叫做OSD,主要负责存储文件的数据部分。当用户访问对象,会先访问元数据服务器,元数据服务器只负责反馈对象存储在哪里OSD,假设反馈文件A存储在B、C、D三台OSD,那么用户就会再次直接访问3台OSD服务器去读取数据。
这时候由于是3台OSD同时对外传输数据,所以传输的速度就会加快了,当OSD服务器数量越多,这种读写速度的提升就越大,通过此种方式,实现了读写快的目的。

另一方面,对象存储软件是有专门的文件系统的,所以OSD对外又相当于文件服务器,那么就不存在共享方面的困难了,也解决了文件共享方面的问题
所以对象存储的出现,很好的结合了块存储和文件存储的优点

为什么对象存储兼具块存储和文件存储的好处,还要使用块存储和文件存储呢?

(1)有一类应用是需要存储直接裸盘映射的,例如数据库。因为数据需要存储楼盘映射给自己后,再根据自己的数据库文件系统来对裸盘进行格式化的,所以是不能够采用其他已经被格式化为某种文件系统的存储的。此类应用更合适使用块存储。
(2)对象存储的成本比起普通的文件存储还要较高,需要购买专门的对象存储软件以及大容量硬盘。如果对数据量要求不是海量,只是为了做文件共享的时候,直接用文件存储的形式好了,性价比高。

下图简要的总结了三者之间的差异:

对象存储文件系统的关键技术是什么?

(1)分布元数据
(2)并发数据访问,对象存储体系结构定义了一个新的、更加智能化的磁盘接口OSD

什么是OSD?

存储局域网(SAN)和网络附加存储(NAS)是我们比较熟悉的两种主流网络存储架构,而对象存储是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备,简称:OSD

在存储对象中通过什么对象方式访问对象?

在存储设备中,所有对象都有一个对象标识,通过对象标识OSD命令访问对象

OSD的主要功能是什么?

(1)数据存储。OSD管理对象数据,并将它们放置在标准的磁盘系统上,OSD不提供块接口访问方式,Client请求数据时用对象ID、偏移进行数据读写;
(2)智能分布。OSD用其自身的CPU和内存优化数据分布,并支持数据的预取。由于OSD可以智能的支持对象的预取,从而可以优化磁盘的性能
(3)每个对象元数据的管理。OSD管理存储在其上对象的元数据,该元数据与传统的inode元数据相似,通常包括对象的数据块和对象的长度。

如何让MP4 video视频背景色变成透明

chrome下面网页css设置:

video {
    mix-blend-mode: screen;
}

as3里面设置displayobject的blendMode属性:
video_bg.blendMode="screen";

as3里面任何displayobject都可以设置blendMode属性来自动融合背景,牛逼

密码保护:业绩等信息

此内容受密码保护。如需查阅,请在下列字段中输入您的密码。

harmanair 获取用户屏幕分辨率

harmanair 获取用户屏幕分辨率

分辨率的宽度:Capabilities.screenResolutionX

分辨率的高度:Capabilities.screenResolutionY

如果代码是用在as文件中 需要导入

import flash.system.Capabilities;

apng动画获取分帧图片方法

1.到https://www.aconvert.com/cn/image/png-to-webp 上把这个png动画(也叫apng图片)转换成webp格式的文件
2.用软件apngdis分解即可,软件下载地址:http://d.xzfile.com/down/apngdis_downcc.zip

animatecc做h5动画的时候最好用单独一层做帧标签

animatecc做h5动画的时候最好用单独一层做帧标签,不然有的动画会失效

图片涟漪特效

在库里面导入jpg图片,选择导出类名pic00,基类为flash.display.BitmapData,选择第一帧导出
文档类:

package {
    import flash.display.*;
    import flash.events.*;
    import flash.filters.ConvolutionFilter;
    import flash.filters.DisplacementMapFilter;
    import flash.geom.*;
    import flash.net.URLRequest;
    public class waveclass extends Sprite {
        private var mouseDown:Boolean = false;
        private var damper,result,result2,source,buffer,output,surface:BitmapData;
        var pic:Bitmap;
        private var bounds:Rectangle;
        private var origin:Point;
        private var matrix,matrix2:Matrix;
        private var wave:ConvolutionFilter;
        private var damp:ColorTransform;
        private var water:DisplacementMapFilter;
        //
        private var imgW:Number = 600;
        private var imgH:Number = 300;

        public function waveclass () {
            super ();
            buildwave ();
        }
        private function buildwave () {
            damper = new BitmapData(imgW, imgH, false, 128);
            result = new BitmapData(imgW, imgH, false, 128);
            result2 = new BitmapData(imgW*2, imgH*2, false, 128);
            source = new BitmapData(imgW, imgH, false, 128);
            buffer = new BitmapData(imgW, imgH, false, 128);
            output = new BitmapData(imgW*2, imgH*2, true, 128);
            bounds = new Rectangle(0, 0, imgW, imgH);
            origin = new Point();
            matrix = new Matrix();
            matrix2 = new Matrix();
            matrix2.a = matrix2.d=2;
            wave = new ConvolutionFilter(3, 3, [1, 1, 1, 1, 1, 1, 1, 1, 1], 9, 0);
            damp = new ColorTransform(0, 0, 9.960937E-001, 1, 0, 0, 2, 0);
            water = new DisplacementMapFilter(result2, origin, 4, 4, 48, 48);
            var _bg:Sprite = new Sprite();
            addChild (_bg);
            _bg.graphics.beginFill (0xFFFFFF,0);
            _bg.graphics.drawRect (0,0,imgW,imgH);
            _bg.graphics.endFill ();
            addChild (new Bitmap(output));
            buildImg ();
        }
        private function frameHandle (_e:Event):void {

            var _x:Number = mouseX/2;
            var _y:Number = mouseY/2;
            source.setPixel (_x+1, _y, 16777215);
            source.setPixel (_x-1, _y, 16777215);
            source.setPixel (_x, _y+1, 16777215);
            source.setPixel (_x, _y-1, 16777215);
            source.setPixel (_x, _y, 16777215);
            result.applyFilter (source, bounds, origin, wave);
            result.draw (result, matrix, null, BlendMode.ADD);
            result.draw (buffer, matrix, null, BlendMode.DIFFERENCE);
            result.draw (result, matrix, damp);
            result2.draw (result, matrix2, null, null, null, true);
            output.applyFilter (surface, new Rectangle(0, 0, imgW, imgH), origin, water);
            buffer = source;
            source = result.clone();
        }
        private function buildImg ():void {
            surface = new pic00(10,10);
            addEventListener (Event.ENTER_FRAME,frameHandle);
        }
    }
}