分类存档: 产品 - 第11页

大数据平台从理论到实践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);
        }
    }
}

air项目里面加入浏览器功能的解决方案

adobe官方方案,适用于比较老旧的页面加载,主要用到Htmlloader或者stagewebview类,如果要支持现代h5的页面,民间给出两个ane扩展解决方案,一个是https://github.com/RayGyoe/ANEWinWebView(待验证,缺点只支持win,而且需要提前安装Miniblink的轻量浏览器?根据经验在部分air sdk可能有崩溃现象,AIR29正常。AIR30、31多次添加会崩溃。貌似是air sdk问题?),还有一个https://github.com/tuarua/WebViewANE(已验证,代码下面给出,缺点窗口好像不能多开)
上代码:

//优点:支持h5,缺点:不能多开?
//github:https://github.com/tuarua/WebViewANE
import com.tuarua.FreSharp;
import com.tuarua.FreSwift;
import com.tuarua.WebView;
import com.tuarua.webview.Settings;

import flash.desktop.NativeApplication;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Rectangle;
import flash.net.URLRequest;
import flash.utils.setTimeout;
import flash.events.MouseEvent;
import flash.text.TextField;

var freSharpANE:FreSharp = new FreSharp(); // must create before all others
var freSwiftANE:FreSwift = new FreSwift(); // must create before all others
var webView:WebView;
var hasActivated:Boolean;
//stage.displayState=StageDisplayState.FULL_SCREEN;//全屏显示
//stage.scaleMode=StageScaleMode.SHOW_ALL;//显示所有,不保证比例





gjbtn.addEventListener(MouseEvent.CLICK,doTest);
function doTest(e:MouseEvent):void
{

    stage.displayState=StageDisplayState.FULL_SCREEN;//全屏显示
    stage.scaleMode=StageScaleMode.SHOW_ALL;//显示所有,不保证比例
    //newWindow.maximize();
    newWindow.activate();
    newWindow.restore();

    newWindow.addEventListener(MouseEvent.CLICK,gotClick);
}


function gotClick(e:MouseEvent):void{
trace("click"); 
    }

this.addEventListener(Event.ACTIVATE, onActivated);
/*stage.addEventListener(Event.RESIZE, onResize);
function onResize(e:flash.events.Event):void
{
    if (newWindow){
    newWindow.bounds = new Rectangle((this.stage.stageWidth-1920)/2, (this.stage.stageHeight-840)/2, 1920, 840);
    }
}*/

function onActivated(event:Event):void {
        if (hasActivated) return;

        setTimeout(init, 0); // this is handle the HARMAN splash screen
        hasActivated = true;

}


var newWindow:NativeWindow;

function doDrag(e:MouseEvent):void{
        newWindow.startMove();

}




function init():void {


    var windowOptions:NativeWindowInitOptions = new NativeWindowInitOptions();
//  windowOptions.transparent = true;
    //windowOptions.systemChrome = NativeWindowSystemChrome.NONE;
  windowOptions.systemChrome = NativeWindowSystemChrome.STANDARD;
    windowOptions.type =  NativeWindowType.NORMAL;
    newWindow = new NativeWindow(windowOptions);

    //newWindow.stage.scaleMode = StageScaleMode.NO_SCALE;
    //newWindow.stage.align =StageAlign.;// StageAlign.TOP_LEFT;
    //newWindow.title = "title name";
    newWindow.bounds = new Rectangle((this.stage.stageWidth-1920)/2, (this.stage.stageHeight-840)/2, 1920, 840);
    newWindow.stage.color=0x000066;
    newWindow.stage.align=StageAlign.TOP_LEFT;
    newWindow.activate();

    var titlebar:Wintitle = new Wintitle();
    titlebar.addEventListener(MouseEvent.MOUSE_DOWN,doDrag);


    newWindow.stage.addChild(titlebar);

    var x1:Number = 0;//(this.stage.stageWidth-1920)/2;
    var y1:Number = 40;//(this.stage.stageHeight-840)/2;

    NativeApplication.nativeApplication.addEventListener(Event.EXITING, onExiting);
    var viewport:Rectangle = new Rectangle(x1,y1, 1920, 800);
      //  var settings:Settings = new Settings();
    webView = WebView.shared();
    webView.init(newWindow.stage, viewport, new URLRequest("http://baidu.com"), null, 1, 0xFFF1F1F1);

    webView.visible = true;


    newWindow.minimize();
}


function onExiting(event:Event):void
{
        WebView.dispose();
        FreSwift.dispose();
        FreSharp.dispose();
}


//只支持非h5页面
package
{
    import flash.display.Sprite;
    import flash.events.KeyboardEvent;
    import flash.events.LocationChangeEvent;
    import flash.geom.Rectangle;
    import flash.media.StageWebView;
    import flash.ui.Keyboard;
    import flash.events.Event;

    public class TestStageWebView extends Sprite
    {
        private var webView:StageWebView = new StageWebView();
        public function TestStageWebView()
        {
            addEventListener(Event.ADDED_TO_STAGE, onStageHandler); 

        }

        private function onStageHandler(e:Event):void
        {
            webView.stage = this.stage;
            webView.viewPort = new Rectangle( 0, 0, stage.stageWidth, stage.stageHeight );
            //webView.loadURL( "http://www.baidu.com" );
            webView.loadURL( "http://31.15.5.4:9080/#/pageList/pageViewPreview?id=712083a1-0e5a-42c4-bf88-d4c2c79105bd&mode=share" );

            webView.addEventListener( Event.COMPLETE, htmlLoaderComplete );
            webView.addEventListener( LocationChangeEvent.LOCATION_CHANGING, locationChanging);
        }

        private function htmlLoaderComplete ( eve : Event ) : void
        {
            trace( "网页加载完成!" );
        }

        private function locationChanging ( eve : Event ) : void
        {
            trace( "网页加载!" );
        }   
    }
}
//只支持非h5页面
package
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.LocationChangeEvent;
    import flash.events.MouseEvent;
    import flash.html.HTMLLoader;
    import flash.net.URLRequest;

    public class TestHtmlLoader extends Sprite
    {
        private var host:CustomHost;
        private var htmlLoader: HTMLLoader;
        public function TestHtmlLoader()
        {
            super();            
            addEventListener(Event.ADDED_TO_STAGE, onStageHandler);         
        }

        private function onStageHandler(e:Event):void
        {
            this.stage.addEventListener(Event.RESIZE,onResizeHandler);      

            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            htmlLoader = new HTMLLoader();

            htmlLoader2 = new HTMLLoader();
            setHTMLLoader();



        }

        private function onResizeHandler(e:Event):void
        {
            htmlLoader.width = stage.stageWidth/2;
            htmlLoader.height = stage.stageHeight;  

            htmlLoader2.width = stage.stageWidth/2;
            htmlLoader2.height = stage.stageHeight; 
            htmlLoader2.x = stage.stageWidth/2;
        }

        private function setHTMLLoader () : void
        {
            htmlLoader.addEventListener( Event.COMPLETE, htmlLoaderComplete );
            htmlLoader.addEventListener( LocationChangeEvent.LOCATION_CHANGING, locationChanging);


            htmlLoader.width = 1080;
            htmlLoader.height = 670;
            htmlLoader.load( new URLRequest("https://fwdt.gzw.sh.cegn.cn/r/w?cmd=com.awspaas.user.apps.datamanager_html&appId=com.awspaas.user.apps.fundplatform&html=proShow_td1.html&sid=ck") );
            addChild( htmlLoader );

            host = new CustomHost();
            htmlLoader.htmlHost = host;

            htmlLoader2.x = 1920;
            htmlLoader2.width = 1920;
            htmlLoader2.height = 670;
            htmlLoader2.load( new URLRequest("http://www.bing.com/") );
            addChild(htmlLoader2);
            //host2 = new CustomHost();
            //htmlLoader2.htmlHost = host;


        }

        private function htmlLoaderComplete ( eve : Event ) : void
        {
            trace( "网页加载完成!" );
        }

        private function locationChanging ( eve : Event ) : void
        {
            trace( "网页加载!" );
        }


        private var htmlLoader2: HTMLLoader;


    }
}

//只支持非h5页面
package
{
    import flash.html.HTMLHost;
    import flash.html.HTMLLoader;
    import flash.display.NativeWindow;
    import flash.display.NativeWindowInitOptions;
    import flash.display.StageScaleMode;
    import flash.geom.Rectangle;
    import flash.text.TextField;

    public class CustomHost extends HTMLHost
    {
        import flash.html.*;
        public var statusField:TextField;
        public function CustomHost(defaultBehaviors:Boolean=true)
        {
            super(defaultBehaviors);
        }
        override public function windowClose():void
        {
           // htmlLoader.stage.window.close();
        }
        override public function createWindow(windowCreateOptions:HTMLWindowCreateOptions):HTMLLoader
        {
            var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions();
            var window:NativeWindow = new NativeWindow(initOptions);
            window.visible = true;
            var htmlLoader2:HTMLLoader = new HTMLLoader();
            htmlLoader2.width = window.width;
            htmlLoader2.height = window.height;
            window.stage.scaleMode = StageScaleMode.NO_SCALE;
            window.stage.addChild(htmlLoader2);
            return htmlLoader2;
        }
        override public function updateLocation(locationURL:String):void
        {
            trace(locationURL);
        }        
        override public function set windowRect(value:Rectangle):void
        {
            htmlLoader.stage.nativeWindow.bounds = value;
        }
        override public function updateStatus(status:String):void
        {
            statusField.text = status;
        }        
        override public function updateTitle(title:String):void
        {
            htmlLoader.stage.nativeWindow.title = title + "- Example Application";
        }
        override public function windowBlur():void
        {
            htmlLoader.alpha = 0.5;
        }
        override public function windowFocus():void
        {
            htmlLoader.alpha = 1;
        }
    }
}

animate文本滚动条组件

import fl.controls.UIScrollBar;
import fl.controls.ScrollBarDirection;
var url2:String="https://amyflash.com";
var uLdr:URLLoader=new URLLoader(new URLRequest(url2));
uLdr.addEventListener(Event.COMPLETE, completeHandler);
var tf:TextField = new TextField();
tf.width=320;
tf.height=140;
tf.x=10;
tf.y=10;
tf.border=true;
tf.multiline=true;
tf.wordWrap=false;
addChild(tf);
/*
    如果只需要垂直方向滚动条,那么先设置tf.wordWrap=true,然后不要添加水平滚动条即可。
*/
//水平滚动条
var hScrollBar:UIScrollBar = new UIScrollBar();
hScrollBar.direction=ScrollBarDirection.HORIZONTAL;
hScrollBar.move(tf.x, tf.y + tf.height);
hScrollBar.width=tf.width;//一定要设置和文本框一样宽,不然不美观
hScrollBar.scrollTarget=tf;
addChild(hScrollBar);
//垂直滚动条
var vScrollBar:UIScrollBar = new UIScrollBar();
vScrollBar.direction=ScrollBarDirection.VERTICAL;
vScrollBar.move(tf.x + tf.width, tf.y);
vScrollBar.height=tf.height;//一定要设置和文本框一样高,不然不美观
vScrollBar.scrollTarget=tf;
addChild(vScrollBar);
function completeHandler(event:Event):void {
    tf.text=event.target.data;
    hScrollBar.update();
    vScrollBar.update();
}

Adobe Animate ReferenceError:错误#1069:在_上找不到属性loopMode,并且没有默认值

当我向Adobe Animate 2019中的MovieClip添加.as类时遇到以下错误:
Adobe Animate ReferenceError:错误#1069:在_上找不到属性loopMode,并且没有默认值
相同的项目适用于早期版本的Animate或flash而不会出错..as文件没什么特别之处.
solution:
打开”高级图层”时会发生此问题.您必须关闭”高级图层”才能在项目中使用某些代码.

1.转到stage的属性面板.

2.单击”高级设置”.

3.取消选中”使用高级图层”模式.

4.单击确定.