最痛的领悟:
写算法题之前先确认需求,输入输出是什么,之后举例子,理清思路,并和面试官沟通,最后才动手写;
打手,打手。。。
- 最后一道算法题:给定一个字符数组,产生长度为n的所有字符串;
- 用递归的思想:
public static ArrayList<String> makestring(char[] str,int n){ ArrayList<String> rst = new ArrayList<String>(); if(n == 1){ for(int i=0;i<str.length;i++){ String tmp = String.valueOf(str[i]); rst.add(tmp); } return rst; } ArrayList<String> tmp = makestring(str,n-1); for(int i=0;i<tmp.size();i++){ StringBuilder ss = new StringBuilder(tmp.get(i)); for(int j=0;j<str.length;j++){ rst.add(ss.append(str[j]).toString()); ss.deleteCharAt(ss.length()-1); } } return rst; } public static void main(String[] args) { String a = new String(); char[] nums = {'a','b'}; //new Test_BST(). ArrayList<String> rst = makestring(nums,3); for(int i=0;i<rst.size();i++){ System.out.println(rst.get(i)); } }
- Kafka的prodecer生产消息的过程:同步、异步;ACK的设置;Broker List;写文件时:log、index,log到达一定大小log.segment.bytes,会产生新的segment file,批量写磁盘;消费时,查找offset,因为segment按照第一条消息的offset命名,所以可以进行二分查找,先定位到具体的文件,之后通过index定位消息;
- consumer和partition的对应关系,项目中offset存在HDFS文件中,消费了一定的消息条数之后同时将消息追加至HDFS文件内,同时更新offset值;若丢失则同时丢失,保证消息只被消费一次;
- Flume的source:Thrift、Avro、Spooling Directory Source,我使用过的如下;
- Thrift:简单了解RPC、具体使用的传输协议等可以深入看一下;http://elf8848.iteye.com/blog/1960131 http://blog.youkuaiyun.com/heavendai/article/details/9282967
- Spooling Directory Source:取某个目录下所有文件内容,可以配置:文件处理完后的后缀名、处理策略优先消费新的or旧的、文件被消费完后是否删除、还可以过滤掉一些文件,不处理;
- Syslog TCP Source:自己写socket client,发数据;
- Java中的
- java创建线程的方式,线程池的每个参数;
- 多线程,超时:Callable、Future接口的深入了解:http://www.cnblogs.com/dolphin0520/p/3949310.html java的Future和FutureTask
- 写代码实现单例模式的多个版本:OK,单例模式好复杂:Java单例模式深入详解
- 海量数据问题:两个文件:A:uid、tag B:uid、record 将A中的tag附加在B表的每条记录之后,前提uid匹配,B文件的数据量很大,A相对较小,有五台机器,可以分布式处理,设计方案:
- 用hash将A、B划分成小文件:可以保证同一个uid的数据在一台机器上,之后遍历B0,在A0中查找是否存在uid,附加tag;
- 数据倾斜:某一台机器负载特别大,怎么处理:
- B中的uid后加一个随机数,eg0-9内的随机数,之后哈希,可以进一步划分该uid对应的记录,那么A中相应的uid如何处理
- A数据量小,可以在uid后加0-9的每个数字,即A中数据发送10份,给B分发后的每台机器;
- 也就是改变做哈希的key值;
- 和一致性哈希的虚拟节点功能类似,虚拟节点映射时在IP后加随机数,增加虚拟节点,让每台机器上负载的key的个数相对均衡,但是不能解决某个key对应的数据量特别大,这样机器和机器之间总的负载数据量不均衡;