首页
Search
1
Kafka、RocketMQ消息队列总结
990 阅读
2
Flink on Kubernetes 计算和存储分离落地实践
989 阅读
3
Linux免密登陆-ubuntu
914 阅读
4
构建智能灵活的 Ribbon 负载均衡策略
91 阅读
5
Redis集群部署方案
898 阅读
大数据
Flink
后端
Java
笔记
运维
游客
Search
标签搜索
大数据
Flink
离线
实时
Redis
OpenJDK
Java
笔记
JVM
Elasticsearch
GC
Hadoop
Hudi
Flink CDC
K8S
数据湖
TOTC
累计撰写
307
篇文章
累计阅读
104.3万
次
首页
栏目
大数据
Flink
后端
Java
笔记
运维
页面
搜索到
27
篇与
TOTC
的结果
返回首页
2017-01-14
Linux免密登陆-ubuntu
1.假设目前有2台服务器:Master、Slave,现在要设置它们之间免密码ssh登陆。2.1 配置Master免密码登陆Slave免密码ssh登录的原理是这样的:a.Master(NameNode | JobTracker)如果作为客户端,实现无密码公钥认证,来连接到服务器Salve(DataNode | Tasktracker)上,需要在Master上生成一个密钥对,包括1个公钥和1个私钥,然后需要将公钥复制到所有的Slave上。b.当Master通过SSH连接Salve时,Salve就会生成一个随机数,并且用Master的公钥对随机数进行加密,并且发送给Master。c.Master收到加密数之后,会使用自己的私钥解密,并将解密数回传给Slave。d.Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,这个过程中不需要用户手动输入密码。而具体到实现这个无密码登录的准备过程,重要的是将客户端Master的公钥复制到Slave上。2.1.1 创建“.ssh”目录若“.ssh目录”不存在,创建”.ssh目录”:mkdir ~/.ssh2.1.2 修改“.ssh 目录”权限。chmod 700 ~/.ssh2.1.3 创建Master服务器的公钥和私钥ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa这个过程会在目录:~/.ssh/下生成公钥:id_rsa和私钥:id_rsa.pub2.1.4 配置Master本机ssh免密登录做测试同第1步类似,在Master上配置一下本机的ssh免密登录,将公钥“id_rsa.pub”追加到授权的key里面:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys授权:chmod 0600 ~/.ssh/authorized_keys然后使用命令:ssh localhost做测试,没问题就可以了。注意: 登陆之后,记得执行:exit退出!2.1.5 修改SSH配置文件"/etc/ssh/sshd_config"修改SSH配置文件:/etc/ssh/sshd_config确保以下内容信息:RSAAuthentication yes # 启用 RSA 认证PubkeyAuthentication yes # 启用公钥私钥配对认证方式AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)2.1.6 拷贝Master的公钥到Slave上去执行命令:scp ~/.ssh/id_rsa.pub hadoop@Slave:~/2.1.7 配置Slave节点登录Slave节点,执行以下操作:a.修改.ssh权限:chmod 700 ~/.sshb.把Master的公钥追加到Slave的授权文件"authorized_keys"中去:cat ~/id_rsa.pub >> ~/.ssh/authorized_keysc.修改该授权文件的权限:chmod 600 ~/.ssh/authorized_keys2.1.8 测试免密码登录在Master上执行:ssh Slave其中“Slave”已经在Master的“/etc/hosts”文件中配置过了,如果这个登录不需要输入密码,那么免密码ssh登录就设置成功了!2.2 配置Slave免密码登陆Master
2017年01月14日
914 阅读
76 点赞
2014-01-04
“锁”相关总结
synchronized 1.JDK 6之后,synchronized目前锁一共有4种状态,级别从低到高依次是:无锁、偏向锁、轻量级锁和重量级锁。锁状态只能升级不能降级。偏向锁,一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,降低获取锁的代价。轻量级锁,是指当锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能。重量级锁,若当前只有一个等待线程,则该线程通过自旋进行等待。但是当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁升级为重量级锁。重量级锁,除了拥有锁的线程以外的线程都阻塞。{lamp/}ReentrantLock Synchronized,Java虚拟机完成,不公平锁,ReentrantLock和synchronized都是可重入锁。ReentrantLock,类层面的实现,户自己去操作,可以指定锁是公平的还是非公平的。NonReentrantLock,不可重入锁。ReentrantLock更灵活,在Hashtable和ConcurrentHashMap中体现得淋漓尽致synchronized的话,锁的范围是整个方法或synchronized块部分;而Lock因为是方法调用,可以跨方法,灵活性更大。和synchronized相比,ReentrantLock提供给用户多种方法用于锁信息的获取,比如可以知道lock是否被当前线程获取、lock被同一个线程调用了几次、lock是否被任意线程获取等等。ReentrantLock的某些方法可以决定多长时间内尝试获取锁,如果获取不到就抛异常,这样就可以一定程度上减轻死锁的可能性,如果锁被另一个线程占据了,synchronized只会一直等待,很容易错序死锁。之后,synchronized做了诸多优化,效率上synchronized和ReentrantLock应该是差不多。{lamp/}公平锁 VS 非公平锁 公平锁:线程直接进入队列中排队,等待队列中除第一个线程以外的所有线程都会阻塞,优点是等待锁的线程不会饿死,缺点是整体吞吐效率相对非公平锁要低。非公平锁:如果此时锁刚好可用,线程有几率不阻塞直接获得锁,CPU不必唤醒所有线程,缺点是处于等待队列中的线程可能会饿死,或者等很久才会获得锁。{lamp/}乐观锁 VS 悲观锁 {lamp/}自旋锁 VS 适应性自旋锁 自旋锁:自旋等待虽然避免了线程切换的开销,但它要占用处理器时间。如果锁被占用的时间很短,自旋等待的效果就会非常好。反之,如果锁被占用的时间很长,那么自旋的线程只会白浪费处理器资源。适应性自旋锁:自适应意味着自旋的时间(次数)不再固定,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。{lamp/}可重入锁 VS 非可重入锁 可重入锁,又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者class),不会因为之前已经获取过还没释放而阻塞。{lamp/}独享锁 VS 共享锁 ReentrantLock和ReentrantReadWriteLock{lamp/}volatile 当写一个volatile变量时,JMM会把该线程对应的本地内存中的变量强制刷新到主内存中去,导致其他线程中的缓存无效。volatile是一种轻量级的同步机制,一是保证共享变量对所有线程的可见性;二是禁止指令重排序优化。volatile对于单个的共享变量的读/写具有原子性,但是像num++这种复合操作,volatile无法保证其原子性。可以用num.incrementAndGet()。
2014年01月04日
747 阅读
52 点赞
2013-11-02
Zookeeper学习笔记
节点选举 Zookeeper节点状态有looking following leading。①每个server首先给自己投票(myid,ZXID,epoch),将这个投票发给集群中其他机器(epoch选举周期,每次进入新一轮的投票后,都会对该值进行加1操作)②每个server接受来自各个服务器的投票,检查是否是本轮投票、是否来自LOOKING状态的服务器③处理投票优先检查ZXID。ZXID比较大的服务器优先作为Leader如果ZXID相同,那么就比较myid。myid较大的服务器作为Leader服务器④统计投票每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,一旦选出leader,后边的机器不管myid和ZXID多大,都自动成为follow⑤改变服务器状态{lamp/}Znode Znode数据节点,数据大小不能超过1M,分为持久节点和临时节点,临时节点的生命周期和客户端会话绑定,一旦客户端会话失效节点就会被移除。创建节点时还可以指定SEQUENTIAL属性,这样会在节点后面增加一个自增的整型数字。节点信息包含czxid创建该节点的事务id、mzxid最后一次更新该节点的事务id等。Zookeeper将数据存储于内存中,Znode是存储数据的最小单元,而Znode被以层次化的结构进行组织,形容一棵树,这种节点称为Znode:data:Znode存储的数据信息。ACL:记录Znode的访问权限,即哪些人或哪些IP可以访问本节点。child:当前节点的子节点引用,类似于二叉树的左孩子右孩子。stat:包含Znode的各种元数据,比如事务ID、版本号、时间戳、大小等等。{lamp/}应用场景 ①.数据发布订阅:配置信息等放到Zookeeper某个节点上,集群中其他机器监听变更。②.负载均衡:动态感知子节点(即服务ip)的上下线。③.命名服务:持久顺序节点,每个父节点都会为子节点维护一个顺序,数字后缀、上限为整型的最大值。④.分布式协调和通知:同a。⑤.集群管理:每个机器一个临时节点。⑥.Master选举:所有服务同时创建一个节点并监测,成功的为Master。⑦.分布式锁:排它锁(一起去创建和监听临时节点)、共享锁(创建临时序号节点,比本序号小的序号没有写请求时,才可以写)。⑧.分布式队列。{lamp/}其他 ①.ZAB协议原子消息广播协议,分为消息广播、崩溃恢复。②.基于观察者模式设计,数据的状态发生变化,Zookeeper就通知已经在Zookeeper上注册的那些观察者做出相应的回应。③.Zookeeper的数据结构和linux的目录结构类似,也像数据结构中的树。
2013年11月02日
456 阅读
2 点赞
2013-08-17
设计模式总结
代理模式 代理对象与目标对象,代理对象是对目标对象的扩展,并会调用目标对象。 不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。静态代理 :编译期加入a.可以做到在不修改目标对象的功能前提下,对目标功能扩展。b.因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多,一旦接口增加方法,目标对象与代理对象都要维护。动态代理 (JDK代理,接口代理):反射,运行时动态加入,目标对象一定要实现接口。 Cglib代理 (子类代理):在内存中构建一个子类对象从而实现对目标对象功能的扩展。a.需要引入cglib的jar文件,但是Spring的核心包中已经包括了Cglib功能,所以直接引入pring-core-3.2.5.jar即可。b.代理的类不能为final,否则报错。c.目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法。在Spring的AOP编程中:如果加入容器的目标对象有实现接口,用JDK代理;如果目标对象没有实现接口,用Cglib代理。{lamp/}桥梁模式 将抽象化与实现化脱耦,使得二者可以独立地变化,将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联,如JDBC桥连。a.找出变化并封装之b.优先使用聚合而并不是继承{lamp/}工厂模式 简单工厂模式 :就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建,提供静态工厂方法,根据参数决定创建出哪种类型的实例,在有限的程度上支持开闭原则,如:DateFormat、SimpleDateFormat。工厂方法模式 :工厂类变成抽象工厂,仅负责给出工厂子类必须实现的部分(返回抽象类型),完全支持开闭原则,如: java.util.Collection中的iterator()方法。抽象工厂模式 :围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。{lamp/}单例模式 :饿汉模式 :类加载时就会创建,构造方法私有(类不能被继承)懒汉模式 {lamp/}原始模型模式 原始模型模式属于对象的创建模式。浅复制:浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。a.通过构造方法实现浅拷贝b.重写clone()方法进行浅拷贝深复制:重写clone()方法进行浅拷贝注:clone()方法1、Object类虽然有这个方法,但是这个方法是受保护的(被protected修饰),所以我们无法直接使用。2、使用clone方法的类必须实现Cloneable接口,否则会抛出异常CloneNotSupportedException。对于这两点,我们的解决方法是,在要使用clone方法的类中重写clone()方法,通过super.clone()调用Object类中的原clone方法。{lamp/}观察者模式 一个对象的行为依赖于另一个对象的状态,或者换一种说法,当被观察对象(目标对象)的状态发生改变时 ,会直接影响到观察对象的行为。如Zookeeper。{lamp/}适配器模式 创建一个Adapter将两个类的功能合到一个,分为类适配器模式、对象适配器模式 如JDBC驱动软件。{lamp/}其他 1.开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”。2.里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。
2013年08月17日
1,204 阅读
21 点赞
2013-06-29
JAVA线程池总结
Executors类提供了4种不同的线程池 1.newCachedThreadPool ——SynchronousQueue2.newFixedThreadPool ——LinkedBlockingQueue3.newScheduledThreadPool4.newSingleThreadExecutor ——LinkedBlockingQueue{lamp/}参数 corePoolSize 线程池核心线程大小。maxPoolSize 线程池最大线程数量,如果工作队列满了,才会创建一个新线程。keepAliveTime 空闲线程存活时间。unit 空间线程存活时间单位,keepAliveTime的计量单位。{lamp/}workQueue 工作队列 ArrayBlockingQueue :生产和消费用的是同一个锁;必须指定大小(有界)。LinkedBlockingQueue :锁是分离的;转换为Node<E>进行插入或移除、会生成额外的Node对象、对GC有影响都可以;不指定大小时(无界),生产速度大于消费速度时候,有可能会内存溢出。PriorityBlockingQueue SynchronousQuene ,newCachedThreadPool,操作必须是放和取交替完成。threadFactory,设定线程名、是否为daemon线程,守护线程。allowCoreThreadTimeoutRejectedExecutionHandler 拒绝策略 AbortPolicy ,丢弃任务并抛出异常,默认。DiscardPolicy ,丢弃任务。DiscardOldestPolicy ,丢弃队列最前面的任务,然后重新提交被拒绝的任务。不和优先级队列同时使用。CallerRunsPolicy ,由调用线程处理该任务 导致程序阻塞,性能效率上必然的损失较大。{lamp/}默认配置 corePoolSize = 1 queueCapacity = Integer.MAX_VALUE maxPoolSize = Integer.MAX_VALUEkeepAliveTime = 60秒 allowCoreThreadTimeout = false rejectedExecutionHandler = AbortPolicy(){lamp/}corePoolSize、maxPoolSize根据机器资源配置相同的值根据峰值持续的时间设置allowCoreThreadTimeout = true、keepAliveTime来动态控制存活线程的数量。自定义任务队列,可以根据当前并发量,通过简单的管理页面随时动态调整队列的长度(保证线程安全的前提下)。{lamp/}ThreadLocal 每个线程都会有这个变量的一个副本。Thread类中有两个变量,是ThreadLocal.ThreadLocalMap ThreadLocalMap的key是ThreadLocal的弱引用,在没有其他地方对ThreadLoca依赖时,ThreadLocalMap中的ThreadLocal对象就会被回收掉,但是对应的value不会被回收,Map中就可能存在key为null但是value不为null的项,所以使用完毕及时调用remove方法避免内存泄漏。
2013年06月29日
1,040 阅读
85 点赞
1
...
4
5
6