1、Hadoop是什么
Hadoop主要是由Doung Cutting和Mike Cafarella受到Google的两篇论文(GFS、MapReduce)的启发,采用Java编写的,用于实现海量数据存储和分析,由Apache基金会支持的一个处理大型数据的开源框架。Hadoop框架应用工程提供跨计算机集群的分布式存储和计算环境,其中两大核心为:HDFS(分布式文件存储系统)和MapReduce(加工计算),实现从单一服务器到上千台机器的扩展,每个机器都可以提供本地计算和存储。
2、Hadoop的架构
HDFS:是一个海量数据存储系统,它是分布式的,集群在多个节点上存储。
MapReduce:用于海量的数据分析,需要用户自己写分析逻辑调用HDFS中的数据。
YARN:集群中的资源管理调度(如CPU、内存等分配)。
Common Utilities:一些公共工具模块。
3、HDFS
HDFS主要包含两大块:NameNode和DataNode。
3.1 NameNode管理机制
3.2 DataNode
3.3 HDFS基本操作代码案例
HdfsUtil.java
package cn.ctgu.hadoop;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.junit.Before;
import org.junit.Test;
public class HdfsUtil {
FileSystem fs=null;
@Before
public void init() throws IOException, InterruptedException, URISyntaxException {
//读取classpath下的xxx-site.xml配置文件,并解析其内容,封装到conf对象中
Configuration conf=new Configuration();//获得hdfs的配置
//也可以在代码中对conf中的配置信息进行手动设置,会覆盖掉配置文件中读取的值
conf.set("fs.defaultFS", "hdfs://Master:9000/");
//根据配置信息,去获取一个具体文件系统的客户端操作实例对象
fs=FileSystem.get(new URI("hdfs://Master:9000"),conf,"hadoop");//获得客户端,第一个参数是hdfs的uri,第三个参数是该hdfs所属用户
}
/*
* 上传文件方式一
* */
@Test
public void upload() throws IOException {
Configuration conf=new Configuration();//获得hdfs的配置
FileSystem fs=FileSystem.get(conf);//获得客户端
Path dst=new Path("hdfs://Master:9000/aa.txt");//获取hdfs文件路径
FSDataOutputStream os=fs.create(dst);//获取输出流
FileInputStream is=new FileInputStream("K:/aa.txt");//获取输入流
IOUtils.copy(is, os);//利用hdfs的工具类完成文件的写操作
}
//上传文件方式二
@Test
public void upload2() throws IOException {
fs.copyFromLocalFile(new Path("K:/aa.txt") ,new Path("hdfs://Master:9000/aa2.txt"));
}
/*
* 下载文件
* */
@Test
public void download() throws IllegalArgumentException, IOException {
fs.copyToLocalFile(new Path("hdfs://Master:9000/aa2.txt") , new Path("K:/aa.txt"));
}
/*
* 查看文件信息
* */
@Test
public void lisfFiles() throws FileNotFoundException, IllegalArgumentException, IOException {
RemoteIterator<LocatedFileStatus>files=fs.listFiles(new Path("/"), true);//递归查看根目录下的文件信息,不会显示文件夹
while(files.hasNext()) {
LocatedFileStatus file=files.next();//获取文件
Path filepath=file.getPath();//获取文件路径
String fileName=filepath.getName();//获取文件名
System.out.println(fileName);
}
System.out.println("-----------------------------------");
//listStatus可以列出文件和文件夹的信息,但是不提供自带的递归遍历
FileStatus[] listStatus=fs.listStatus(new Path("/"));
for(FileStatus status:listStatus) {
String name=status.getPath().getName();
System.out.println(name+(status.isDirectory()?" is dir":" is file"));
}
}
/*
* 创建文件夹
* */
@Test
public void mkdir() throws IllegalArgumentException, IOException {
fs.mkdirs(new Path("/aa/bb/cc"));
}
/*
* 删除文件或文件夹
* */
@Test
public void rm() throws IllegalArgumentException, IOException {
fs.delete(new Path("/aa"), true);//递归删除aa目录下的文件
//fs.rename(arg0, arg1);//重命名
}
public static void main(String[] args) throws IOException {
Configuration conf=new Configuration();
conf.set("fs.defaultFS", "hdfs://Master:9000/");
FileSystem fs=FileSystem.get(conf);
FSDataInputStream is=fs.open(new Path("/jdk-7u65-linux-i586.tar.gz"));
FileOutputStream os=new FileOutputStream("K:/jdk.tgz");
IOUtils.copy(is, os);
}
}
4、MapReduce
5、搜索引擎框架
6、RPC原理
代码示例
服务端
LoginServiceInterface.java
package cn.ctgu.hadoop.rpc;
public interface LoginServiceInterface {
public static final long versionID=1L;//客户端的版本号
public String login(String username,String password);
}
LoginServiceImpl.java
package cn.ctgu.hadoop.rpc;
public class LoginServiceImpl implements LoginServiceInterface{
@Override
public String login(String username, String password) {
return username+"logged in successfully";
}
}
Starter.java
package cn.ctgu.hadoop.rpc;
import java.io.IOException;
import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Builder;
import org.apache.hadoop.ipc.Server;
public class Starter {
public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
/*
* 通过RPC产生一个生成器
*
* */
Builder builder=new RPC.Builder(new Configuration());
//设置服务端的IP地址、端口号、协议(即服务端和客户端共同实现的接口)、服务端实例对象(对接口的实现)
builder.setBindAddress("Master").setPort(10000)
.setProtocol(LoginServiceInterface.class)
.setInstance(new LoginServiceImpl());
//创建服务端
Server server=builder.build();
//开启服务端
server.start();
}
}
客户端
LoginController.java
package cn.ctgu.hadoop.rpc;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
//客户端的代码,客户端调用
public class LoginController {
public static void main(String[] args) throws IOException {
/*
*LoginServiceInterface.class:接口的字节码(服务端和客户端都得实现这个接口,才能保证RPC框架服务端和客户端都能调用动态代理对象)
* 1L:客户端版本号,写在接口中,保证客户端和服务端一样,这也是个校验的过程
* new InetSocketAddress("Master", 10000), new Configuration())
* 绑定服务端的IP地址和端口号,读取服务端的配置信息
* */
LoginServiceInterface proxy=RPC.getProxy(LoginServiceInterface.class, 1L, new InetSocketAddress("Master", 10000), new Configuration());
String result=proxy.login("angle", "1234565");//调用客户端想要调用的方法
System.out.println(result);
}
}