标签:最大 报错 继承 模式 transform 合并 oracl app environ
——————————————————面试题————————————————————————————
包括HDFS和Mapreduce两部分。
1)HDFS自动保存多个副本,移动计算。缺点是小文件存取占用namenode内存,写入只支持追加,不能随机修改。
它存储的逻辑空间称为block,文件的权限类似linux。整体架构分三种节点,NN,SNN,DN
NN 负责读写操作保存metadata(Ownership Permission blockinfo)
SNN 负责辅助NN合并fsimage和edits,减少nn启动时间
DN 负责存数据,每个数据(文件)分割成若干block,每个block默认3个副本。启动后像NN发送心跳保持联系
NN保存的metadata在hdfs启动后加载到计算机内存,除block位置信息的metadata保存在OS文件系统中的fsimage文件中,对metadata的操作日志保存在OS文件系统中的edits文件中。block位置信息是hdfs启动后由DN上报NN再加载到内存的。
HDFS的安全模式:直到NN完全加载完metadata之前的这段时间。期间不能写入文件,DN检查各个block完整性,并修复。
2)MapReduce
离线计算框架,过程分为split map shuffle reduce四个过程
架构节点有:Jobtracker TaskTracker
Split将文件分割,传输到mapper,mapper接收KV形式的数据,经过处理,再传到shuffle过程。
Shuffle先进行HashPartition或者自定义的partition,会有数据倾斜和reduce的负载均衡问题;再进行排序,默认按字典排序;为减少mapper输出数据,再根据key进行合并,相同key的数据value会被合并;最后分组形成(key,value{})形式的数据,输出到下一阶段
Reduce输入的数据就变成了,key+迭代器形式的数据,再进行处理
逻辑上:
1、split
2、map
3、shuffle
4、reduce
四个过程
物理上:
JobTracker节点:JobTracker创建每一个Task(即MapTask和ReduceTask)
并将它们分发到各个TaskTracker服务中去执行。负责调度Job的每一个子任务task运行于TaskTracker上。
TaskTracker节点:运行在多个节点上的slaver服务。TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务。TaskTracker都需要运行在HDFS的DataNode上
1) client端发送写文件请求,namenode检查文件是否存在,如果已存在,直接返回错误信息,否则,发送给client一些可用namenode节点
2) client将文件分块,并行存储到不同节点上datanode上,发送完成后,client同时发送信息给namenode和datanode
3) namenode收到的client信息后,发送确信信息给datanode
4) datanode同时收到namenode和datanode的确认信息后,提交写操作。
数据样本:
A:B,C
B:A,E
C:A,D
D:C
E:B
import java.io.IOException;
import java.util.ArrayList;
//import java.util.Collection;
//import java.util.Map.Entry;
//import java.util.HashMap;
import java.lang.Iterable;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
//import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.util.ToolRunner;
import org.apache.hadoop.util.Tool;
import org.apache.commons.lang.StringUtils;
public class FindUsers extends Configured implements Tool {
static class Map extends Mapper<LongWritable, Text, Text, Text> {
public void map(LongWritable key, Text val, Context context) throws IOException, InterruptedException {
String line = val.toString();
String user = line.split(":")[0];
String[] friends = line.split(":")[1].split(",");
String joined_friends = StringUtils.join(friends, ",");
for(String friend : friends) {
int result = friend.compareTo(user);
if(result > 0) {
context.write(new Text(user + "," + friend), new Text(joined_friends));
}
else if(result < 0) {
context.write(new Text(friend + "," + user), new Text(joined_friends));
}
}
}
}
static class Reduce extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterable<Text> vals, Context context) throws IOException, InterruptedException {
String string_key = key.toString();
String[] users = string_key.split(",");
ArrayList<String> list = new ArrayList<String>();
int i = 0;
String state = "Off";
for(Text val : vals) {
i++;
String[] all_people = val.toString().split(",");
ArrayList<String> inner_list = new ArrayList<String>();
if(state.equals("Off")) {
for(String one_people: all_people) {
list.add(one_people);
state = "On";
continue;
}
}
if( state.equals("On")) {
for(String one_people: all_people) {
inner_list.add(one_people);
}
}
list.retainAll(inner_list);
}
if( ! users[0].equals(users[1])) {
for(String user : users) {
if(list.contains(user)) list.remove(user);
}
if(list.size() >= 1 && i >=2) {
context.write(new Text(StringUtils.join(users, ",")), new Text(StringUtils.join(list,",")));
}
}
}
}
@Override
public int run(String[] args) throws Exception {
Job job = Job.getInstance(getConf());
job.setJarByClass(getClass());
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
//job.setNumReduceTasks(0);
job.setMapOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
return job.waitForCompletion(true) ? 0 : 1;
}
public static void main(String[] args) throws Exception {
ToolRunner.run(new FindUsers(), args);
}
}
输入文件格式:二级域名,一级频道,二级频道,访问ip地址,访问者id
需求:按照二级域名,一级频道,二级频道分组,计算pageview数,计算独立ip数和独立访问者id数
当map生成的数据过大时,带宽就成了瓶颈,怎样精简压缩传给Reduce的数据,有不影响最终的结果呢。有一种方法就是使用Combiner,Combiner号称本地的Reduce,Reduce最终的输入,是Combiner的输出
5种写法,1、懒汉2、恶汉3、静态内部类4、枚举5、双重校验锁
1、
class LazySingleton{
private static LazySingleton singleton;
private LazySingleton(){
}
public static LazySingleton getInstance(){
if(singleton==null){
singleton=new LazySingleton();
}
return singleton;
}
}
2、
class HungrySingleton{
private static HungrySingleton singleton=new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return singleton;
}
}
3、
class InternalSingleton{
private static class SingletonHolder{
private final static InternalSingleton INSTANCE=new InternalSingleton();
}
private InternalSingleton(){}
public static InternalSingleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
4、
enum EnumSingleton{
INSTANCE;
public void doSomeThing(){
}
}
5、
class LockSingleton{
private volatile static LockSingleton singleton;
private LockSingleton(){}
//详见:http://www.ibm.com/developerworks/cn/java/j-dcl.html
public static LockSingleton getInstance(){
if(singleton==null){
synchronized(LockSingleton.class){
if(singleton==null){
singleton=new LockSingleton();
}
}
}
return singleton;
}
}
ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
1)重要信息:MD5,AES加密
2)不太重要的数据:用签名
3)登录态:
自动监测对象是否超过作用域从而达到自动回收内存的机制,Java语言没有提供
释放已分配内存的显式操作方法。
Public class MyStack{
Private ArrayList data = new ArrayList();
Public Boolean pop(){}
Public Boolean push(){}
}
implicit
1)x、y都是var,x变为Unit
2)都是val,报错
堆内存、栈内存、方法区
栈内存:保存局部变量
堆内存:存储数组和对象
方法区:代码区、字符串常量池、静态区
Scala的代码执行是用REPL过程,Read Execute Print Loop
通电后读取ROM的BIOS程序进行硬件自检,自检成功后把计算机控制权交给BIOS中BOOTsequence中的下一个有效设备,读取该设备MBR找到操作系统,载入linux的bootloader,一般是grub。之后载入kernel,执行 /etc/rc.d/sysinit ,开启其他组件(/etc/modules.conf),执行运行级别,执行/etc/rc.d/rc.local ,执行/bin/login,最后shell启动。
Struts2
Spring
hibernate
mybatis
hadoop
hive
hbase
flume
sqoop
Zookeeper
Mahout
Kafka
Storm
Spark
Hadoop。介绍
底层是MapReduce,所以又可以说是MapReduce优化。
Hbase节点运行很慢,发现是Hfile过小,hbase频繁split。
修改了hfile大小。或者设置major compack设置为手动
?
Mogodb是单机
Hbase是分布式??
建表时就分区,rowkey设置定长(64字节),CF2到3个
Max Versio,Time to live,Compact&Split
多Htable并发写
Htable参数设置,手动flush,降低IO
WriteBuffer
批量写
多线程并发写
多Htable并发读
Htable参数设置
批量读
释放资源
缓存查询结果
1. 任务调度
I/O 方面:Hadoop 会尽量将 Map 任务分配给 InputSplit 所在的机器,以减少网
络 I/O 的消耗。
2.数据预处理与 InputSplit 的大小
合理地设置 block块大小是很重要的调节方式。除此之外,也可以通过合理地
设置 Map 任务的数量来调节 Map 任务的数据输入。
3. Map 和 Reduce 任务的数量
当 Reduce 任务的数量是任务槽的 1.75 倍时,执行速度快的机器可以获得更多
的 Reduce 任务,因此可以使负载更加均衡,以提高任务的处理速度。
4. Combine 函数
MapReduce 框架运行用户写的 combine 函数用于本地合并,这会大大减少网
络 I/O 操作的消耗
1、建立视图
2、优化 sql 语句
3、分表、分库
4、存储过程
1、 用户文件 2 个属性 10 万行,课程文件 2 个属性 2 万行,日志文件 1 个属性很
大,这些属性可以任意的组合查询,每秒的请求数是 10000 个,请如何最快的方式查
询出数据?
2、给你 2 个字符串,字符串最后一个字符可以循环到最前面,只要一个字符串中每
一个字符在另一个字符串都有就是相等的,请用你的方法比较是否相等?
3、任意使用MR或者Storm或者hive根据日志表,求20150501当天每个用户访问页面次数的前10的页面,日志表如下:
Userid pageid viste date
Aa 222 20150501
Aa 333 20150501
Aa 222 20150501
Aa 222 20150502
Bb 333 20150501
Cc 333 20150502
4、Hbase的major compact和minor compact的区别
5、A表有三个字段,id,name,age,id为主键,去除该表中name重复的数据,用mysql语法实现(千万级别查询量、考虑Sql语法的复杂性)
6、算法:TB级别数据排序
1)单机实现 2)分布式实现
7、static synchronized final volatile
8、concurrentHashMap的数据结构和应用场景
9、多线程的3种实现,说明他们的优缺点
10、JVM的内存模型,GC在何时何地,做了什么事情
11、用java实现LRU缓存
12、实现单例,要求:线程安全、锁的性能
13、目录拷贝功能:目录下上万文件需要拷贝备份,拷贝同时输出进度
14、jps命令作用
15、a和b两个文件各存放80亿URL,每个URL64字节,内存限制为4G,如何找出共同的URL
16、start-hbase.sh为起点hbase的启动流程
17、hbase的compact
标签:最大 报错 继承 模式 transform 合并 oracl app environ
原文地址:https://www.cnblogs.com/qfjavabd/p/10863668.html