大数据是目前IT技术中最火热的话题,也是将来的行业方向,愈来愈多的人参与到大数据的学习行列中。从最基础的伪分布式环境搭建,再到分布式环境搭建,再进入代码的编写工做。这时候码农和大牛的分界点已经出现了,所谓的码农就是你让我作什么我就作什么,我只负责实现,无论原理,也不想知道原理。大牛就开始不听的问本身why?why?why?因而乎,很天然的去看源码了。然而像hadoop这样的源码N多人参与了修改和完善,看起来很是的吃力。而后无论如何大牛就是大牛,再硬的骨头也要啃。目前作大数据的80%都是从WEB开发转变过来的,什么spring mvc框架、SSH框架很是熟悉,其实无论你作了多少年的WEB开发,你不多接触到hadoop中java代码编写的风格,有些人根本就看不懂什么意思。下面我来介绍下hadoop源码怎么看。java
hadoop体现的是分布式框架,所以全部的通讯都基于RPC来操做,关于RPC的操做后续再介绍。hadoop源码怎么看系列分多个阶段介绍,下面重点介绍下JAVA基础知识。程序员
1、多线程编程spring
在hadoop源码中,咱们能看到大量的相似这样的代码编程
return executor.submit(new Callable<String>() {多线程
@Overridemvc
public String call() throws Exception {框架
//方法类分布式
}ide
下面简单介绍下java的多线程编程oop
启动一个线程可使用下列几种方式
一、建立一个Runnable,来调度, 返回结果为空。
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(new Runnable() {
@Override
public void run() {
System.out.println("runnable1 running.");
}
});
这种方式启动一个线程后,在后台运行,不用等到结果,由于也不会返回结果
二、建立一个Callable,来调度,有返回结果
Future<String> future1 = executor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
//具体执行一些内部操做
return "返回结果了!";
}
});
System.out.println("task1: " + future1.get());
这种启动方式一直等到call的方法体执行完毕后,并返回结果了才继续执行下面的代码
2、内部类实现
hadoop中一样能看到大量这样形式的代码
status = ugi.doAs(new PrivilegedExceptionAction<JobStatus>() {
public JobStatus run() throws IOException, InterruptedException,
ClassNotFoundException {
return submitter.submitJobInternal(Job.this, cluster);
}
});
这是一个典型的内部类实现,PrivilegedExceptionAction是一个接口,里面有一个run方法须要实现,程序调用的时候,会执行里面的submitter.submitJobInternal方法体
为了方便你们理解,我写了一个模拟程序来演示
先定义一个接口类
public interface TransactionAction {
void execute() throws Exception;
}
再定义一些模板方法,参数对象是一个接口来处理相关业务
public class TemplateAction {
public void transactionProcess(TransactionAction action, ActionEvent event){
System.out.println("lock");
try {
action.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("unlock");
}
}
调用过程
public void doSome(){
TemplateAction t=new TemplateAction();
//public void transactionProcess(TransactionAction action, ActionEvent event)
event2 =new ActionEvent ();
event2.setMsg("内部类");
final DoAction doaction=new DoAction();
t.transactionProcess(new TransactionAction() {
@Override
public void execute() throws Exception {
// TODO Auto-generated method stub
doaction.sayWhatEvent(event2);
}
}, new ActionEvent());
}
运行结果以下:
lock
say:内部类
unlock
上面的内部类执行过程很明确,到底execute什么时候执行不是由dosome来设定,而是由TemplateAction中的transactionProcess来肯定
3、枚举类型
枚举类型比较容易理解,例如在咱们习惯定义一些常量,
static int ACTION_TYPE=0; //0表示初始,1表示启动,2表示运行中 3表示中止
程序中咱们这样判断
if(ACTION_TYPE==1){
doSomeThing()
}
例如:
// TODO Auto-generated method stub
JobState state = JobState.DEFINE;
if(state==JobState.RUNNING){
System.out.println("运行状态");
}else{
System.out.println("初始状态");
}
if(jobType==0){
System.out.println("初始状态");
}else if(jobType==1){
System.out.println("启动状态");
}