Hadoop(一)

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值