首页 文章 精选 留言 我的

精选列表

搜索[学习],共10003篇文章
优秀的个人博客,低调大师

JavaScript学习(三)

强制类型转换(将一个数据类型强制转换为另一个数据类型) 在JS中如果需要写16进制的数字,需要以0x开头。8进制数字,需要以0开头。2进制数字需要用0b开头 string类型强转 方式一:调用被转换类型的toString()方法。 ----被转换类型.toString() 该方法不会影响到原变量,它会将转换的结果返回。 但是null和undefined不能调用toString方法。 方式二:调用string()函数。 -----直接写string(); 将被转换数据作为参数传递给函数,可以转换null和undefined。 number类型强转 方式三:调用Number函数。 字符串转数值如果是纯数字将直接转换,如果非数字内容则转换为NaN,空字符串将转换为0。 布尔值转数值:false-->0 true-->1 空值转数值:null-->0 未定义转数值:NaN 方式四:调用parseInt() 把一个字符串转换成一个整数。 parseFloat()把字符串转换成一个浮点数。 parseInt()可以将字符串中有效的整数内容取出来。 如果对非string使用,会将其先转换为string。 Boolean类型强转 方式五:调用Boolean()函数。 数字转换为Boolean,除了0和NaN是false,其余都是true。 字符串转换为Boolean,除了空串,其余都是true。 null和undefined都会转换为false。 运算符(操作符) 通过操作符可以对一个值或者多个值进行运算。 算数运算符:+ - * / % 当对非number类型的值进行运算时,将会把值转换成number进行运算。 如果对两个字符串进行加法运算,会把两个字符串拼接成一个字符串并返回。 任何值和字符串进行加法操作,都会把值转换成字符串之后进行拼串操作。 任何值进行减法,乘法,除法操作,都可以转换成number。 %取模运算,除法取余运算。

优秀的个人博客,低调大师

JavaScript学习(二)

一、javascript基本代码 /**/ 多行注释 //单行注释 要养成一个良好的写注释习惯,也可以通过注释来对代码进行简单的测试。 1.JS中严格区分大小写 2.JS中每一条语句以分号结尾。 ---如果不写分号,浏览器会自动添加,但是会消耗一些系统资源。有些时候浏览器会加错分号。 3.JS中会自动忽略多个空格和换行,所以可以利用空格和换行对代码进行格式化 字面量:都是一些不可改变的值,可以直接使用,一般不会直接使用字面量。 比如:1、2、3、4、5 变量:变量可以用来保存字面量,而且变量的值可以任意改变。变量更方便我们使用,通过变量描述字面量,所以在开发中都是使用变量。 声明变量:在JS中,使用var关键字来声明变量。 /*声明变量:使用var关键字 */ var a=3; console.log(a); 标识符:在JS中所有可以由我们自主命名的都可以称为是标识符。例如:变量名、函数名、属性名 命名一个标识符规则:1.标识符中可以含有字母、数字、下划线、$,不能使用数字开头 2.标识符不能是ES中的关键字或保留字 比如:var var=3; 3.标识符一般使用驼峰命名法:首字母小写,每个单词开头大写,其余字母小写 helloWorld 数据类型:指的是字面量的类型,一共有6种数据类型。 1.String 字符串 2.number 数值 3.Boolean 布尔值 4.null 空值 5.undefined 未定义 6.object 对象 其中String、number、Boolean、null、undefined属于基本数据类型,object属于引用数据类型。 String字符串:在JS中字符串需要用引号引起来,单引号双引号效果一样,引号不能嵌套。 var str="ok"; 在字符串中可以使用 \ 来作为转义字符,当表示一些特殊符号时,可以使用 \ 进行转义。var str="你说:\" 今天天气不错 \"" \"可以表示一个" \'可以表示一个' \n换行 \t制表符 两个字符串相乘将会返回一个NaN:表示一个特殊的数值,not a number Number:在JS中所有数值都是number类型,包括整数和浮点数 var a=123 //number var b="123" //string JS中可以使用number.MAX_VALUE表示数值最大值。如果表示的数值超过最大值,则会返回一个infinity表示正无穷。 可以使用一个运算符来检查变量类型:typeof 变量 Boolean布尔值:布尔值只有两个true 和 false,进行逻辑判断 Null空值:null类型的值只有一个null,使用typeof来检查一个null值将会返回object。 undefined(未定义):undefined的值也只有自己,当声明一个变量但不给值赋值时。

优秀的个人博客,低调大师

JavaScript学习(一)

一、使用软件Hbuilder。 二、javascript(java编程语言,script脚本:java的脚本语言) 诞生于1995年,出现时主要用于处理网页中的前端验证。----所谓前端验证,就是指检查用户输入内容是否符合一定的规则。比如:用户名称的长度、密码的长度、邮箱的格式等。 javascript的标准是SCMAscript 一个完整的javascript由三个部分组成:ECMAscript(标准)、DOM(文档对象模型)、BOM(浏览器对象模型) 特点:1.解释型语言 ---不需要编译,可以直接运行 2.类似于C和java的语法结构 3.动态语言 4.基于原型的面向对象 <!--js代码需要编写到script的标签中--> <script type="text/javascript"> </script> 三、javascript语句警告框、页面body、控制台输出 /*控制浏览器弹出一个警告框*/ alert("这是第一行JavaScript代码") /*让计算机在页面中输出一个内容*/ document.write("的司法解释的凯撒缴纳罚款"); /*向控制台输出一个内容*/ console.log("在控制台位置"); 四、JS代码编写位置 <!--可以将JS代码编写到标签的onclick属性中 当我们点击按钮时,js代码才会执行 --> <button onclick="alert('为什么点击');">点击一下</button> <!--可以将JS代码写在超链接的href属性中,当点击超链接时也会执行JS代码--> <a href="javascript:alert('超链接点击')">555</a> 可以在JS文件夹中新建一个javascript。 <!--可以将javascript代码编写到外部JS文件夹中,通过script标签引入--> <!--script标签一旦引入外部代码,就不能再编写了--> <script type="text/javascript" src="js/script.js"> </script>

优秀的个人博客,低调大师

node知识学习

一、什么是node? node是js的运行环境,可以让js脱离前端单独运行 二、node的特点 1、单线程 无论是多少事情,都是一个线程去完成 单线程的优点:没有了多线程创建线程和销毁线程的开销,调度多线程也是需要消耗资源的。多线程,有多少事情就有多少线程去完成。 单线程的特点:无法利用多核cup,一旦陈谷被恶意的行为挂起,那么整个程序崩溃。 2、非堵塞I/O,在i/o进行的时候,线程不等待。阻塞I/O: 在i/o进行的时候,线程等待。 I:input O:output 读取文件、连接数据库读取数据库、操作光盘驱动器等等都叫做I/O。它们比较起内存和cpu的运行速度来说,是特别慢的。也就是说如果线程让硬盘读取一个比较大的文件。并且等待读取完毕并交给内存之后再去做别的事情。那么也就是说线程在等待读取(I/O)完成 3 事件驱动 事件驱动与非阻塞I/O是连着的一个事情。非阻塞I/O确实可以让线程在I/O进行的时候去做其它的事情,但是有个问题。线程去做了其它的事情,万一这个时候I/O完成了呢?怎么知道I/O什么时候完成?I/O完成的时候会触发一个事件,这个事件驱动着线程回来继续做下面的事情。 三、模块 3.1 内置核心模块 ——http http模块是用来搭建服务器的。 IncomingMessage : request OutgoingMessage : response METHODS : 这是一个数组里面装着所有的http请求方式 STATUS_CODES :是一个对象,对象的每个key都是一个状态码,对象的value是该状态码的含义 Server :是一个方法,用于将其它的服务转化成http服务 createServer : 是一个方法,用于创建服务 3.2 文件系统——file system Fs模块是用来操作文件的。所有的相关操作都是fs的方法。 创建文件并追加内容 3.3 url模块 Parse方法:将一个url路径,转成一个对象,对象有各种属性对应的就是不同的部分。 http://www.icketang.com/html/shouye/index.html?username=wanglaowu&password=123#123 上面的url字符串经过url模块的parse方法处理完会转变成以下对象 { Protocol:http, Host:www.icketang.com, Hostname:www.icketang.com, Port:null, Pathname:html/shouye/index.html, Search:?username=wanglaowu&password=123, Query: username=wanglaowu&password=123, Hash:#123, Href:http://www.icketang.com/html/shouye/index.html?username=wanglaowu&password=123#123 } parse方法还有第二个参数,是一个布尔值。默认为false。 如果为true,那么将会把返回的对象中的query选项转为一个对象。 url.format(urlObj) format这个方法是将传入的url对象编程一个url字符串并返回参数:urlObj指一个url对象 url解析get方法 Url模块是专门处理前端提交过来的请求地址的。 如何处理get请求: 1判断请求的方式 处理 如何处理post请求: 1判断请求的方式 if(req.method===”post”){ //code... } 2给req绑定data事件 if(req.method===”post”){ var str=“”; req.on(“data”,function(data_chunk){ //这个事件是post每发送一次数据,就会触发一次,回调函数中的参数是data_chunk表示的是这一次所 传递的数据。 str += data_chunk; }) req.on(“end”,function(){ //这个事件是post发送数据完毕之后才最终触发一次。所以说先触发1次或者多次data事件,再触发1次end事件。后续代码要写在end事件中 }) } 3.4 文件上传 formidable 3.5 express Express是第三方模块,用来快速开发一个服务器。 express中间件 Express内置的唯一中间件就是静态资源中间件。 req是前端传递过来的请求。 Req.query表示的是get请求携带的数据 包含在路由每个查询字符串参数的属性的对象。如果没有查询字符串,它是空的对象,{}。 Req.params表示的是从pathname上获得的数据 包含映射到指定的路线“参数”属性的对象。例如,如果你有路线/user/:name,那么“名”属性可作为req.params.name。这个对象默认{}。 Req.body 表示的是post请求携带的数据 (必须得先应用中间件:body-parser); 包含请求主体提交的键值对。默认情况下它是undefined。除非你使用了body-parser 例如:app.use(body_parser.urlencoded({extended:false})); Body-parser中间件: Ejs模板 Express允许我们像使用php那样(或者说是underscore的模板)使用ejs模板。 Ejs模板必须是一个文件,文件的拓展名是ejs => index.ejs 内部的内容还是大体上是html只不过有一部分是<%=variable%>组成的。当渲染的时候,会从字典中与variable进行匹配。并替换。 Ejs模板不需要引入app.js主程序文件。但是必须要在express中声明,而且还要放到node_modules中,这样express就能够找到ejs模块了: app.set(“view engine”,”ejs”); App.set表示要设置什么东西,第一个参数就是要设置的内容。第二个参数是对第一个参数更详细的说明. 声明完了之后,就可以在某个路由的响应中使用res.render()进行渲染ejs模板了。 条件:第一个参数是要渲染的模板文件。(该文件必须要存在与主程序同级目录下的views文件夹中) 第二个参数是渲染该模板文件的字典。 4.自定义模块 在NodeJs中,每一个js文件天生就是一个模块。 每个模块都能够向外暴露一些东西。 核心模块暴露的内容是十分重要的,比如:http模块负责搭建服务器。Fs模块负责操作文件等 自定义模块,随便定义。 模块化开发有什么好处呢? 每个模块只负责提供功能。不会将变量注册到全局作用域下。 我们自己定义了一个js文件。可以通过require函数将它引入到其它的js文件中。 方法是: var app = require(“./app.js”); 此时,必须在同级目录下有app.js这个文件 另一个方法是:将app.js放在同级目录下的node_modules文件夹中(或者上级、上上级、一直到根目录) 此时可以这么写了: var app = require(“app.js”); 此时的查找顺序是只会查找node_modules。 向外暴露有三种方式:

优秀的个人博客,低调大师

Android学习目录

Theme风格 Android 沉浸式风格(为毛叫沉浸式这么唬人) Build编译 Android 多渠道打包(同一个工程不同包名,不同服务器地址等) Application Android 权限管理(原生、EasyPermissions、RxPermissions) Activity Activity 传递ArrayList<bean>数据及其他基本运用Android 跳转系统设置+返回键 Service Content Provider BroadCast Receiver View控件 Android 好用的下拉控件SpinnerTextView使用实例Android Button的英文字是大写的? 设备 Android 设备+APP+号码信息Android 设备屏幕信息(dip,sp,px的转换及其运用) Media多媒体 1、Camera 2、Video 3、Radio 硬件通信 1、USB通信、USB转串口通信 Android USB转串口通信 2、BlueTooth蓝牙通信 3、SerialPort串口通信 4、WIFI通信 5、RFID通信(NFC) 6、扫码枪 Android 扫码枪监听封装 网络通信 httpclient,httpurlconnection,afinal,okhttp,retrofit,volley socket,webservice WebService WebService 基础知识点和用Postman调试Retrofit 用Soap协议访问WebService 详解Android XStream 解析xml数据变成bean,支持CDATA 数据解析 json,xml Android xml数据的读取和写入(sax,pull,dom,xstream,jsoup)

优秀的个人博客,低调大师

Spring学习路径

一.Spring框架简介 Spring作为一个优秀的开源企业级框架有着以下特点 开源框架 简化企业级应用开发的流程 Spring是一个JavaSE/EE的一站式框架 优点在于 方便解耦 AOP的编程支持 声明式事务的支持 可以引入jUnit4,方便程序测试 对优秀开源框架的支持,方便集成 降低JavaEE API的使用难度 Spring开发框架中最重要的两个特性是 IOC控制反转 AOP面向切片 IOC的优点可以从以下的开发演变中体现出来 二.Spring Beans管理 XML方式管理 注解方式管理

优秀的个人博客,低调大师

前端学习路线

第一步 安装开发工具:sublime(文本编辑器)、webstorm(JS IDE)、Visual Studio Code(web代码编辑器),Hbuilder(我比较喜欢用的国产IDE)。 HTML:理解如何浏览和创建网页、基本的语法规范、常用的标签及属性(包括HTML5新增的标签及属性,如块级标签等)、网页之间的链接和跳转(三种方式:a标签、link标签、form表单)、标签节点和层级节点。 CSS:基本语法和三种书写位置(行内CSS、内部CSS、外部CSS)、选择器(标签选择器、id选择器、类选择器)和格式化排版(利用块级元素以及定位属性进行排版)、盒模型的高级用法(padding、margin以及元素大小)、常用布局模型(流动模型、浮动模型、层模型)。 JS:基础语法以及变量(所有变量都用var定义)、数据类型和数据类型转换、条件判断(if、switch)、循环语句(while、for)、函数(函数的定义方式、js的内置函数)、数组和集合等js的内置对象。 第二步 DOM(文档对象模型)+BOM(浏览器对象模型):DOM的基本结构(父子关系、兄弟关系)、节点对象操作(getElementByName、getElementById等)、事件的特性及使用(change、click、blur等)、常见的DOM内置对象(alert、confirm等)、常见的BOM功能(open、close等)。 网页特效与进阶:在网页特效中常用的编程接口(onFocus、onSelect等)、动画编程(onload、hover等)、事件对象和冒泡(useCapture)、缓动框架封装(参考:https://www.cnblogs.com/yongshaoye/p/7102644.html)和旋转木马案例(参考:https://www.cnblogs.com/forlina/p/4313065.html)、正则表达式及其应用。 Jquery:选择器、基本操作API(中文API网址:https://www.jquery123.com/)、插件机制(jQuery.extend():扩展对象方法)、原理分析(参考:https://blog.csdn.net/liupc123123/article/details/2661 4337)。 第三步 HTML5+CSS3:语义化结构、多媒体、本地存储(HTML5连接本地数据库)、常见API(HTML5:http://www.dcloud.io/docs/api/index.html、CSS3:http://phpstudy.php.cn/css3/)、CSS3选择器(参考:http://www.w3school.com.cn/cssref/css_selectors.asp)、CSS3边框、背景、阴影、CSS3过渡和动画(参考:https://blog.csdn.net/XIAOZHUXMEN/article/details/52003135)、CSS3伸缩布局(参考:https://www.cnblogs.com/fxycm/p/4649648.html)、Canvas(画布元素)。 服务端编程:端的概念、web服务器的概念、服务器搭建(参考:https://www.cnblogs.com/W-Kr/p/5455862.html)、XML与json。 PHP:PHP基础语法(参考:http://www.w3school.com.cn/php/php_syntax.asp)、PHP服务端编程基础(参考:https://www.cnblogs.com/hope666/p/6919487.html)。 AJAX:基本编程接口(参考:https://blog.csdn.net/u013279840/article/details/52786348)、异步数据交互(参考:https://blog.csdn.net/bug_money/article/details/54645396)、模板引擎的使用(参考:https://www.cnblogs.com/sw1990/p/5851377.html)。 借鉴:https://www.cnblogs.com/chengjian-physique/p/8076356.html

优秀的个人博客,低调大师

Java底层学习

最近在看几本Java的书,也做了很多笔记,主要是关于Java虚拟机、Java GC、Java 并发编程等方面,参考的主要几本书籍有: 《深入理解Java虚拟机》——周志明 《深入理解Java虚拟机 第二版》——美 Bill Venners 《Java性能调优指南》——也是老美的 《Java高并发程序设计》——葛一鸣 本来想自己把这些书的pdf传上来的,可惜已经有人上传了,大家自己去找资源吧 当然在写作过程中也参考了很多大神的文章,下面给几个链接,大家也可以看看: 【Java成神之路】—-死磕Java系列博客 《成神之路系列文章》 JVM调优总结 等全部写完,我就写个目录方便大家查看

优秀的个人博客,低调大师

Storm学习总结

分享的目的 让大家更加深入了解Storm的架构以及运用JStorm之类的流式计算框架解决业务开发过程中遇到的问题能够有所帮助 分享大纲 Storm介绍和系统架构Storm核心类Storm trident框架Storm重要参数 Storm介绍和系统架构 1. Twitter将Storm正式开源了,这是一个分布式的、容错的实时计算系统 2. Storm为分布式实时计算提供了一组通用原语,可被用于“流处理”之中,实时处理消息并更新数据 3. Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算,Storm用于实时处理。Storm保证每个消息都会得到处理,而且它非常快,在一个小集群中,每秒可以处理数以百万计的消息 4. 开发者可以使用任意编程语言来做开发 主要特点: 1. 简单的编程模型 类似于MapReduce降低了并行批处理复杂性,Storm降低了进行实时处理的复杂性; 2. 容错性 Storm会管理工作进程和节点的故障; 3.水平扩展 计算是在多个线程、进程和服务器之间并行进行的; 4.可靠的消息处理 Storm保证每个消息至少能得到一次完整处理。任务失败时,它会负责从消息源重试消息, 如何判断一条消息是否处理成功或失败,通过异或来判断; 5.快速 系统的设计保证了消息能得到快速的处理,使用ØMQ作为其底层消息队列storm系统架构图 Storm 名词 1.Nimbus 任务的中央调度器(相当于Yarn中 ResourceManager) 2.Supervisor worker的代理, 负责管理Worker的生命周期(相当于Yarn中NodeManager, AppMaster) 3.Stream 被处理的数据 4.Spout 数据源(Map或Reduce) 5.Bolt 处理数据(Map或Reduce) 6.Task 运行于Spout或Bolt中的线程(Container) 7.Executor worker进程中的线程,默认情况下,一个executor对应一个task 8.Worker 运行Task线程的进程(容器) 9.Tuple 流数据 10.Stream Grouping 定义了Bolt接收什么东西作为输入数据 11.Topology Stream Grouping连接起来的Spout和Bolt节点网络 Storm数据流—Tuple 1. Tuple(元组)是Storm最主要的数据结构,一个元组就是一个命名的值列表,其中的每一个值可以是任何类型; 2. Tuple(元组)都是动态类型——字段的类型不需要提前被声明; 3. Tuple(元组)有一些方法像getInteger 和getString之类 得到字段的值的方法,而不需要强制转换结果类型(和JDBC的ResultSet非常类似); Storm 的容错 工作进程worker 失效: 如果一个节点的工作进程worker死掉,supervisor 进程会尝试重启该worker。如果连续重启worker 失败或者worker 不能定期向Nimbus 报告心跳,Nimbus 会分配该任务到集群其他的节点上执行; 集群节点失效: 如果集群中某个节点失效,分配给该节点的所有任务会因超时而失败,Nimbus 会将分配给该节点的所有任务重新分配给集群中的其他节点; Nimbus 或者supervisor 守护进程失败: Nimbus 和supervisor 都被设计成快速失败(遇到未知错误时迅速自我失败)和无状态的(所有的状态信息都保存在Zookeeper 上或者是磁盘上)。Nimbus 和supervisor 守护进程必须在一些监控工具(例如,daemontools 或者monitor)的辅助下运行,一旦Nimbus 或者supervisor 失败,可以立刻重启它们,整个集群就好像什么事情也没发生。最重要的是,没有工作进程worker 会因为Nimbus 或supervisor 的失败而受到影响,Storm 的这个特性和Hadoop 形成了鲜明的对比,在Hadoop中如果JobTracker 失效,所有的任务都会失败; Nimbus 所在的节点失效: 如果Nimbus 守护进程驻留的节点失败,工作节点上的工作进程worker 会继续执行计算任务,如果worker 进程失败,supervisor 进程会在该节点上重启失败的worker 任务。但是,没有Nimbus的影响时,所有worker 任务不会分配到其他的工作节点机器上,即使该worker所在的机器失效; storm异步并发运行模式 在前面提到task、executor、worker、node,这四者的关系如下: 一个node上可以启动多个worker进程 一个work进程上可以执行多个executor线程3.一个executor上可以执行1个或多个task, 即bolt或spout实例,默认情况下一个executor对应一个task 这就是Storm并发运行的模式,可以在创建topology的时候设置node, work 、executor和task的并发度模型, 下面拿单词统计程序来详细说明。 默认并发度 运行的并发模型如下: 调整并发度 Tuple消息分组路由机制 Storm定义了7种内置数据流分组方式,分别是: 1. Shuffle Grouping(随机分组): 随机分发tuple给bolt的各个task,每个bolt接收到相同数量的tuple,代码中是用shuffleGrouping这个方法; 2. Fields Grouping(按字段分组): 根据给定的字段进行分组。比如说一个数据流根据word字段进行分组,所有具有相同的word字段值的tuple会路由到同一个bolt中(用得最多),代码中是用fieldsGrouping这个方法; 3. All Grouping(广播发送): 将所有tuples复制后分发给所有bolt task,这样每个订阅数据流的task都会收到tuple的一个copy,代码中是用allGrouping这个方法; 4. Global Grouping(全局分组): 将所有tuples路由到唯一的一个task上,Storm按照最小的task ID来选取接收数据的task,代码中是用globalGrouping这个方法; 5. Non Grouping(不分组): Shuffle Grouping 是一样的效果,有一点不同的是Storm 会把这个Bolt 放到此Bolt 的订阅者同一个线程里面去执行,代码中是用noneGrouping这个方法; 6. Direct Grouping(指向型分组): 这种分组意味着消息的发送者指定由消息接收者的哪个Task 处理这个消息。只有被声明为Direct Stream 的消息流可以声明这种分组方法。而且这种消息tuple 必须使用emitDirect 方法来发送,代码中是用directGrouping这个方法; 7.Local or shuffle grouping(本地或随机分组): 和随机分组类似,但是会将tuple分发给同一个worker内的bolt task。其它情况下,采用随机分组的方式,这取决于topology的并发度,本地或随机分组可以减少网络人传输,从而且提高topology的性能,代码中是用localOrShuffleGrouping这个方法; 自定义分组路由 可以通过实现CustomStreamGrouping的接口来自定义分组方式:prepare()会在运行时间调用, 用来初始化分组信息,分组的个体实现会在这些信息决定如何向接收task分发tuple.chooseTasks()方法返回一个tuple发送目标的task的标识符列表,它的两个参数是发送tuple的组件的id和tuple的值. Storm核心类 1.BaseRichSpout 重写nextTuple、declareOutputFields、 open、ack、 fail方法open : 一般是初始化SpoutOutputCollector对象nextTuple : 从数据源接受数据,并向下游的bolt发射数据流declareOutputFields : 声明发射数据的输出字段ack : 成功的处理fail : 失败的处理 2.BaseRichBolt 重写execute 、declareOutputFields、 prepare、 cleanup方法prepare:一般是初始化SpoutOutputCollector对象declareOutputFields :声明发射数据的输出字段execute : 处理数据,并向下游发送tuplecleanup : 清除工作 3.TopologyBuilder 通过setSpout、setBolt构建topology Storm trident框架 Storm Trident的数据模型 Storm Trident的核心数据模型是小批量去处理流数据(相当于Spark Stream组件),流分区在集群的节点上,对流的操作也是并行的在每个分区上进行; 官方的描述是: Trident is an alternative interface to Storm. Tuples are processed as small batches(小批量). It provides exactly-once processing (刚好一次的处理), “transactional" datastore persistence(事物的持久化), and a set of common stream analytics operations.)。Trident对事物处理方案如下: 1. 一批数据被分配指定一个唯的id 称作为“transaction id”. 如果一批数据被重复处理,将会得到是同 一个transaction id(唯一、幂等); 2. 在各批数据之中,状态更新是保序的,例如:批次3的状态更新不会在批次2状态更新成功之前(保序); Storm trident数据流 Trident数据流是分批次的,如下图所示,而普通bolt或spout数据流是一个接一个连续的, trident数据每一批的大小,取决输入数据量的大小 Trident API Trident有五种对流的操作的API: 1.不需要网络传输的本地批次运算,每个分区(partion)的运算是互相独立的 Functions Filters partitionAggregate stateQuery and partitionPersist projection 2.需要网络传输的重分布操作,不改变数据的内容; shuffle broadcast partitionBy global batchGlobal partition 3. 聚合操作,网络传输是该操作的一部分 aggregate 4. 流分组(groupby)操作 groupby 5. 合并和关联操作 merge join 一个Trident topology完整的示例 示例中包含:filterfunctiongroupbypersistentAggregate filter function projection 投影操作是对数据上进行列裁剪用法:如果你有一个流有【“a”,“b”,“c”,“d”】四个字段,执行下面的代码:mystream.project(new Fields("b","d"))输出流将只有【“b”,“d”】两个字段 Repartition(重分区) 重分区操作是通过一个函数改变元组(tuple)在task之间的分布。也可以调整分区数量(比如,如果并发的hint在repartition之后变大)重分区(repatition)需要网络传输,以下是重分区函数: 1. shuffle: 使用随机算法在目标分区中选一个分区发送数据;用法: inputStream.shuffle(); 2. broadcast: 每个元组重复的发送到所有的目标分区。这个在DRPC中很有用。如果你想做在每个分区上做一个statequery;用法: inputStream.broadcast(); 3.paritionBy: 根据一系列分发字段(fields)做一个语义的分区。通过对这些字段取hash值并对目标分区数取模获取目标分区。paritionBy保证相同的分发字段(fields)分发到相同的目标分区;用法: inputStream.partitionBy(new Fields("event", "city")); 4.global: 所有的tuple分发到相同的分区。这个分区所有的批次相同;用法: inputStream.global(); 5.batchGobal: 本批次的所有tuple发送到相同的分区,不通批次可以在不通的分区;用法: inputStream.batchGlobal(); 6.patition: 这个函数接受用户自定义的分区函数,很少用。用户自定义函数事项 backtype.storm.grouping.CustomStreamGrouping接口; 用法: inputStream.partition(grouping); Aggregation(聚合) 1. Trident有aggregate和persistentAggregate函数对流做聚合, aggregate在每个批次上独立运行;persistentAggregate聚合流的所有的批次并将结果存储下来,然后现在一个流上做全局的聚合 2. 如果使用reducerAggregator或者aggretator,这个流先被分成一个分区,然后聚合函数在这个分区上运行。 3. 如果使用CombinerAggreator,Trident会在每个分区上做一个局部的汇总,然后重分区聚合到一个分区,在网络传输结束后完成聚合。CombinerAggreator非常有效,在尽可能的情况下多使用.下面是一个做批次内聚合的例子:mystream.aggregate(new Count(), new Fields("count"))和partitionAggregate一样,聚合的aggregate也可以串联。如果将CombinerAggreator和非CombinerAggreator串联,trident就不能做局部汇总的优化。 Trident流分组操作 1. groupBy操作根据特殊的字段对流进行重分区,分组字段相同的元组(tuple)被分到同一个分区,如果对分组的流进行聚合,聚合会对每个组聚合而不是这个批次聚合。(和关系型数据库的groupby相同). 2 persistentAggregate也可以在分组的流上运行,这种情况下结果将会存储在MapState里面,key是分组字段,和普通聚合一样,分组流的聚合也可以串联。 Trident—merge和join 合并: 将不同的流合并,最简单的方式就是合并(meger)多个流成为一个流, 用法如下:topology.merge(stream1, stream2, stream3);Trident合并的流字段会以第一个流的字段命名 关联: 类似SQL的join都是对固定输入的。而流的输入是不固定的,所以不能按照sql的方法做join。Trident中的join只会在spout发出的每个批次见进行,下面是个join的例子: 一个流包含字段【“key”,“val1” ,“val2”】,另一个流包含字段【“x”,“val1”】:topology.join(stream1, new Fields("key"), stream2, new Fields("x"), new Fields("key","a","b","c"));Stream1的“key”和stream2的“x”关联。Trident要求所有的字段要被名字,因为原来的名字将会会覆盖。Join的输入会包含:1.首先是join字段。例子中stream1中的“key”对应stream2中的“x”。2.接下来,会吧非join字段依次列出来,排列顺序按照传给join的顺序。例子中” a”,” b”对应stream1中 的“val1”和“val2”,“c”对应stream2中的“val1”。 注意:当join的流分别来自不同的spout,这些spout会同步发射的批次,也就是说,批次处理会包含每 个spout发射的tuple。 partitionAggregate 有三种不同的聚合接口:CombinerAggreator,ReduceAggregator和Aggregator Aggregator(聚合器) CombinerAggregator CombinerAggregator用来将一个集合的tuple组合到一个单独的字段中,Storm 对每一个tuple调用init方法,然后重复调用combine()方法直到一个分片的数据处理完成为止。传递给combine方法的两个参数是局部聚合的结果,以及调用了init()返回的值。Storm将tuple生成的值进行组合之后,Storm发送组合结果作为一个新的字段,如果分片是空的,Storm会发送zero()方法执行的返回。 ReducerAggregator Storm调用init()方法来获取原始值。然后为分片中每一个tuple调用reduce()方法,直到分片的数据处理完成。第一个参数是局部聚合的结果,这个方法需要将第二个参数tuple合并到局部聚合结果中并返回。 Aggregator Aggregators能发射任何类型和任何字段的tuple, 在执行期间,他能发射任何tuple,执行的方式如下:在处理一批数据之前,就调用init(), init()方法的返回值对象代表aggregation的state, 并且会传递到aggregate和complete方法中去;针对一批数据中的每一个tuple,都会调用aggregator方法,这个方法能够更新state和选择性的发射tuple流;当一批数据处理完成的时候,就会调用complete方法; 编程中三种聚合器的选择 共同点:都可以实现一些简单、复杂的计数、统计功能、在partitionAggregate操作方法上性能、功能都差不多; 区别: CombinerAggregator: 比较灵活,每一个tuple的初始值都可以根据实际情况灵活设置,适合流的 aggregate操作,此时trident会有自动优化机制(在网络传输之前就会做局转换合并) ReducerAggregator: 最容易使用, 初始值可以根据实际情况灵活设置,适合比较简单处理的场景 Aggregator: 最灵活, 批次的初始值可以灵活设置, 常用在多次统计处理,一次发射的场景 要求:学会用三种Aggregator实现各自的计数功能, Trident State Trident State有如下三个组件: StateFactory : 该接口定义了Trident用来建立持久state对象的方法; State : 该接口定义了beginCommit()和commit()方法,分别在Trident一批分区数据写到后端存储之前和之后调用。如果写入成功,意味着,所有的处理都没有报错,Trident会调用commit()方法; StateUpdater : 该接口定义了updateState()方法用来调用更新state,假定处理了一批tuple,Trident将三个参数传递给这个方法,需要更新的State对象,一个批次分区数据中TridentTuple对象的列表和TridentCollector实例用来视需要发送额外的tuple作为state更新的结果; Trident State事物 在Storm中,有三种类型的状态,每个类型的描述如下:在写Storm脚本的时候,这三种事物对应的MapState接口的实现,分别是: 重复事物型:TransactionalMap 不透明事物型:OpaqueMap 非事物型:NonTransactionalMap重复事物和不透明事物详细看附件 Trident事物和幂等性 StateUpdater 从数据流中的tuple更新状态(state)信息, updateState()调用的时机是在state对象的beginCommit()和commit()方法调用之间进行,接口定义如下: 使用的场景:主要是在Stream类的partitionPersist的各种方法中,主要的作用是允许topology从数据流中的tuple更新状态(state)信息,部分重载方法如下: StateQuery stateQuery方法从State实现类对象生成一个输入数据流, 操作示例如下: TridentTopology topology = new TridentTopology(); topology.newDRPCStream("words") .each(new Fields("args"), new Split(), new Fields("word")) .groupBy(new Fields("word")) .stateQuery(wordCounts, new Fields("word"), new MapGet(), new Fields("count")) .each(new Fields("count"), new FilterNull()) ; StateQueryProcessor核心源码如下:由上面的代码可以看出,在流在执行stateQuery方法的时候,针对每一批数据中的每一个tuple,都会执行QueryFunction实现类的execute方法 persistentAggregate persistentAggregate: 持久化聚合的的操作过程,它是GroupedStream类的 一个方法,它一般是用来在Stream对象通过groupby分组聚合操作之后生成的GroupedStream方法之后,在每个分片数据的每个分组上运行这方法,方法的各个参数,以及返回值如下: 1. 方法第一个参数传入的StateFactory对象生成的State对象,结合前面介绍的State三种事物中某一种事物来进行持久化操作操作处理,一般持久化操作需要实现IBackingMap这个接口,比例持久化到本地文件、Memcache、redis、HBase、LevelDB、HDFS、mysql等,通常在开发环境 下为了方便写入到一个Map中即可; 2. 方法的第二参数一般是一个Aggregator对象,在分片上执持persistentAggregate的时候,会去执行这个Aggregator对象的初始化方法、多次迭代方法、完成方法,比例ReducerAggregator对象,在这个分片上先执行ReducerAggregator的init方法,然后针对每一个tuple,执行ReducerAggregator的 reduce方法,直到完成; 3. 第三参数是由第二个参数聚合操作指定产生的新字段, 如Count聚合,一般会设置成count字段; 4. 返回值的类型是一个TridentState对象,一般情况下返回的TridentState对象会再生成一个新的Stream对象,继续往下游处理; partitionPersist partitionPersist : 是在一个在分区上进行持久化的操作方法,不需要网络通信, 它是Stream类的一个方法,在每个分片数据的每个分组上运行这方法,方法的各个参数,以及返回值如下: 1. 第一个参数是一个StateFactory类型,和persistentAggregate的第一个参数一样,功能也一样; 2. 第二个参数是输入的字段集合; 3. 第三个参数是一个StateUpdater实例, storm在一个数据分片上调用这个方法时,会在state对象的beginCommit和commit这两个方法之间会调用这个StateUpdater实例的updateState去更新状态 ,数据批次的状态是方法的第一个参数,该批次数据的集合是第二个参数, 第三个参数是一个TridentController控制器对象,方法调用的部分核心源码如下: 4. 第四个参数是一个方法操作的字段; Storm重要参数 worker.childopts: 默认情况下,Storm启动worker进程时,JVM的最大内存是768M,但是在线上环境中,由于会在Bolt中加载大量数据,768M内存无法满足需求,会导致内存溢出程序崩溃,可以通过在Strom的配置文件storm.yaml中设置worker的启动参数, 例如可以这样设置:"-Xmn1024m -Xms2048m -Xmx2048m -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly" Supervisor.slots.ports: Storm的Slot,最好设置成OS核数的整数倍;同时由于Storm是基于内存的实时计算,Slot数不要大于每台物理机可运行Slot个数; storm.messaging.netty.buffer_size: 传输的buffer大小,默认1MB,当Spout发射的消息较大时,此处需要对应调整###storm.messaging.netty.max_retries:建议设置为3 storm.messaging.netty.max_wait_ms: 建议设置为10000; storm.messaging.netty.min_wait_ms: 建议设置为3000; Topology.acker.executors: 由于Acker基本消耗的资源较小,强烈建议将此参数设置在较低的水平, 建议设置为1; Topology.max.spout.pending: 一个SpoutTask中处于pending状态的最大的Tuple数量。该配置应用于单个Task,而不是整个Spout或Topology,可在Topology中进行覆盖, 通常情况下,建议设置为1024; Storm应用 1. 日志分析 2. 消息转化器 3. 实时统计分析 1. 阿里双11交易大屏 2. 腾讯网2015年 9.3阅兵在线人数实时统计(lamba架构) 3. 搜索引擎中热点词频 4.人工智能 5. NLP(语音合成处理,高德导航上林志玲的导航语言提示) 6. 股票实事趋势分析 7. 互联网风控 8. 广告推荐 推荐资料 Storm 官方文档 : http://storm.apache.org/ Storm分布式实时计算模式 Storm源码分析 问题 Storm是如何确定一条消息是否处理成功?原值和返回值进行异或计算,如下:

优秀的个人博客,低调大师

Hadoop学习路径

一、平台基础 1.1、大数据 了解什么是大数据,大数据入门,以及大数据介绍。 以及大数据中存在的问题,包括存储,计算的问题,有哪些解决策略。 1.2、Hadoop平台生态圈 熟悉了解开源Hadoop平台生态圈,以及第三方大数据平台,查找一些Hadoop入门介绍博客或者官网,了解: What’s Hadoop Why Hadoop exists How to Use Hadoop 1.3、Hadoop家族成员 Hadoop是一个庞大的家族,包含存储,计算等一系列产品组件,需要了解其中的一系列组件,包括HDFS,MapReduce,Yarn,Hive,HBase,ZooKeeper,Flume,Kafka,Sqoop,HUE,Phoenix,Impala,Pig,Oozie,Spark等,知道其干什么,维基百科定义。 1.4、HDFS 分布式存储HDFS,了解HDFS架构,HDFS的存储机制,各节点协作关系需理解清楚。 1.5、Yarn 分布式资源管理Yarn,熟悉Yarn架构,以及如何进行资源管理的机制。 1.6、MapReduce 分布式计算MapReduce,对MapReduce底层架构,处理方案进行了解,计算架构方案,了解MapReduce计算的优势,以及劣势。 1.7、HBase 大数据高效存储HBase,了解HBase底层架构,HBase的应用场景,存储方案。 1.8、Hive 大数据仓库Hive,了解Hive的存储机制,Hive的事务型变迁,Hive的应用场景,以及Hive底层计算。 1.9、Spark 内存计算平台Spark,熟悉Spark内存计算架构,计算流程,Spark的运行模式,以及应用场景。 二、平台进阶 2.1、HDFS 通过命令行操作HDFS,文件查看,上传,下载,修改文件,赋权限等。 通过java demo连接操作HDFS,实现文件读取,上传,下载功能。 通过DI工具,配置HDFS操作流程,实现关系型数据库文件到HDFS存储,HDFS文件保存到本地目录中。 2.2、MapReduce Eclipse绑定Hadoop环境,添加MapReduce Location,用eclipse运行MapReduce的经典实例WordCount,看其中原理,尝试修改为中文词汇统计,并排除不相关词汇。 2.3、Hive 通过命令行操作Hive,进行beeline连接,SQL语句操作Hive数据仓库。 通过java demo连接操作Hive,实现建表,插入数据,查询,删除数据记录,更新数据,删除表等操作。 通过DI工具,配置关系型数据库抽取到Hive事务表流程,不通过直接驱动连接Hive,通过HDFS以及Hive外表进行过度实现。 2.4、HBase 在命令行中访问操作使用HBase,建立列族,每列添加数据,修改更新数据查看变化。 通过java demo,用phoenix驱动,连接HBASE,实现对HBASE的建表,增删改查数据操作。 DI工具需要修改源码,或者添加phoenix组件,才能使用,因为phoenix插入语句不是Insert into,而是Upsert into,无法与DI工具匹配。 2.5、Spark 在命令行中,运行pyspark,以及spark shell,进行spark命令行操作,提交spark示例任务,进行试运行。 切换Spark运行模式,进行命令行尝试体验。 通过java demo连接Spark,进行任务的分发计算运行。 三、平台高级 针对上述组件,进行熟练使用,熟能生巧,举一反三,能够根据场景编写MapReduce代码,Spark代码等,针对Hive,HBase深入理解支持的SQL类型,存储过程,触发器等如何进行操作,能够根据需求设计最优的解决方案。 四、平台深度 深读组件源码,理解平台部署中各个配置的意义及影响,以及如何通过源码以及配置对组件进行优化,修改源码提高Hadoop平台的容错性,扩展性,稳定性等。

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Eclipse

Eclipse

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。