大数据思维经典问题
大数据环境下的核心问题
海量数据
工业技术相对落后
硬件损坏是常态
分而治之
把一个复杂的问题按一定的“分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的中间结果,把各部分的中间结果组成整个问题的最终结果。这也是著名的 Hadoop 中分布式存储系统 HDFS 的核心思想。
经典问题
需求一:海量数据找出重复的行
已知条件: I/O 速度500M/s,服务器内存为64G,txt文件大小为1TB。
找出重复行(能不能?)
思路:
首先我们可以看出,文件过大,服务器不可能一次性读入,必须把文件分块或者压缩文件的大小。
我们可以采用哈希算法得到每行数字的 hashcode 值(因为 hashcode 是固定不变的,且内容相同的哈希值肯定是相等)。
这里由于需要知道行数是多少,所以我们采用 HashMap 来接收,把每行的 hashcode 作为 key ,行号作为 value ,然后对逐行的 key 除以1024(这个值可以自定义)取模,形成一个个的 File 小文件。
因为相同的 hashcode 取模肯定相同,也就是说落在相同的 File 文件里,这样 ...
大型高并发处理Nginx
Nginx 产生背景
1. 日常生活中所见
大学选课时学校官网会因为访问量较大经常崩溃。
淘宝、京东等大型网站做营销活动时也会出现服务器异常。
每年十一节假日或者春运抢票时,12306网站会发生瘫痪。
2. 上述场景产生的主要2大原因:
巨大流量—海量的并发访问
单台服务器资源和能力有限
那么如何解决这些问题呢,这就要先来了解一下负载均衡。
负载均衡
先来了解一下高并发的概念。
1. 高并发
见名知意,高(大量的),并发就是可以使用多个线程或者多个进程,同时处理(就是并发)不同的操作。简而言之就是每秒内有多少个请求同时访问。
2. 负载均衡
负载均衡:将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】,也是分布式系统架构设计中必须考虑的因素之一。
3. tomcat并发图
可以发现,当每秒300个请求同时访问tomcat时,tomcat已经开始承受不住,出现波动。那么大型网站是如何处理高并发的呢?以下是高并发场景下,实现负载均衡的一个分布式架构图。
常见互联网分布式架构,分为客户端层、反向代理nginx层、站点层、服务层、数据层。只需要实现“将请 ...
Dubbo框架初识
RPC 基本概念
RPC 协议(Remote Procedure Call Protocol)
RPC 远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。在 OSI 网络通信模型中,RPC 跨越了传输层和应用层,使得开发包括网络分布式多程序在内的应用程序更加容易。
客户机(客户端)-服务器模式:当请求没有到达服务端,服务端(全天候)处于休眠状态,当请求到达时,服务端程序会被唤醒,处理客户端请求(计算,图形处理 等),将结果响应给客户端(RPC Socket)。
OSI 七层网络模型(从上至下):
应用层:Http (Https),ftp,smtp,pop3
表示层
会话层
传输层:TCP|UDP
网络层
数据链路层
物理层
RPC 框架
IPC:单机中运行的进程之间的相互通信。
RPC:可以在同一台电脑上不同进程进行,也可以在不同电脑上进行。
LPC:在windows 里面同一台电脑上不同进程间的通讯还可以采用 LPC(本地访问)。
综上:RPC 或 LPC是上层建筑,IPC 是底层基础。
RPC 与 HTTP、TCP、U ...
Java多线程笔记
Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
线程的概念
进程:
每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)
线程:
同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)
多进程是指操作系统能同时运行多个任务(程序)。
多线程是指在同一程序中有多个顺序流在执行。
每个进程至少有一个线程,若程序只有一个线程,那就是程序本身。
现代计算机支持多个线程的并发执行。
同一个进程的多个线程共享IO,内存资源。
线程是有状态的。
注意:很多多线程是模拟出来的,真正的多线程是指有多个cpu,即多核,如服务器。如果是模拟出来的多线程,即一个 cpu的情况下,在同一个时间点,cpu只能执行一个代码,因为切换的很快,所以就有同时执行的错觉。
创建多线程的三种方式以及区别
Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的 ...
Java中的内存分析
内存分区
栈空间(stack)
由系统自动分配,遵循后进先出的原则,用于存放局部变量。
每个线程私有,不能实现线程间的共享。
速度快!栈是一个连续的内存空间。
堆空间(heap)
用于存放new出的对象,或者说是类的实例。
堆是一个不连续的内存空间,分配灵活,速度慢。
方法区(method)
在堆空间内。
被所有线程共享。
用来存放程序中永远不变或唯一的内容,如:①类的代码信息;②静态变量和方法;③常量池(字符串敞亮等,具有共享机制)。
常量池
JVM 为每个已加载的类维护一个常量池,常量池就是这个类用到的常量的一个有序集合。
包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用。
池中的数据和数组一样通过索引访问。
由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。
常量池存在于方法区(Method Area)。
实例分析
创建两个实体类和测试类
实体类 Student、Computer
package cn.share.vo;public class Student { ...
Java面向对象
由于Java是一种面向对象的语言,万事万物皆对象,用户定义一个类,这是一个广泛的定义,需要用户具体化,实例化这个广泛的类,确定这个具体的对象。在java程序中,对象可以被显式创建和隐式创建,主要说一下显式的创建对象的方式。
Java中创建对象的5种方式以及区别
1、使用new关键字
这是最常见的创建对象的方法,并且也非常简单。通过使用这种方法我们可以调用任何我们需要调用的构造函数。
Employee emp1 = new Employee();
0: new #19 // class org/programming/mitra/exercises/Employee3: dup4: invokespecial #21 // Method org/programming/mitra/exercises/Employee."":()V
2、反射。使用class类的 newInstance() 方法
我们也可以使用class类的 newInstance() 方法来创建对象。此newInstance()方法调用无参构造 ...