Hadoop学习2
练习1 编写Java程序实现以下函数:
1.向HDFS中上传文件
2.从HDFS下载文件到本地
3.显示文件目录
4.移动文件
5.新建文件夹
6.移除文件夹
package cn.itcast.hadoop.hdfs; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; import org.apache.commons.compress.utils.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 temp { static FileSystem fs = null;
/*
* initiation
*/
@Before
public void init() throws IOException{
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://zpfbuaa:9000/");
fs = FileSystem.get(configuration);
}
/*
* upload files
*/
@Test
public void upload() throws IOException{
init(); Path dstPath = new Path("hdfs://zpfbuaa:9000/aa/my.jar"); FSDataOutputStream os = fs.create(dstPath); FileInputStream is = new FileInputStream("/home/hadoop/download/my.jar"); IOUtils.copy(is, os);
}
/*
* upload files to HDFS
*/
@Test
public void upload2() throws IOException{
fs.copyFromLocalFile(new Path("/home/hadoop/download/my.jar"), new Path("hdfs://zpfbuaa:9000/aaa/bbb/ccc/my3.jar"));
}
/*
* download files to local
*/
public void download(){ }
/*
* list the information of files
*/
@Test
public void listfile() throws FileNotFoundException, IllegalArgumentException, IOException{ RemoteIterator<LocatedFileStatus> filesIterator = fs.listFiles(new Path("/"), true); while(filesIterator.hasNext()){
LocatedFileStatus fileStatus = filesIterator.next();
Path path = fileStatus.getPath();
String filename = path.getName();
System.out.println(filename);
} System.out.println("---------------------------------------------"); FileStatus[] listStatus = fs.listStatus(new Path("/"));
for(FileStatus status : listStatus){
String name = status.getPath().getName();
System.out.println(name + (status.isDirectory()?" is a dir":" is a file"));
}
}
/*
* make a new file
*/
@Test
public void makdir() throws IllegalArgumentException, IOException{
fs.mkdirs(new Path("/aaa/bbb/ccc")); }
/*
* delete a old file
*/ public void rm() throws IllegalArgumentException, IOException{
fs.delete(new Path("/aaa/bbb"), true);
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://zpfbuaa:9000/");
fs = FileSystem.get(configuration);
FSDataInputStream is = fs.open(new Path("/jdk-7u65-linux-i586.tar.gz")); FileOutputStream os = new FileOutputStream("/home/hadoop/download/my.jar"); IOUtils.copy(is,os);
} }
练习2 编写Java程序实现客户端和服务器端的socket信息交互以及函数调用
LoginServiceImpl.class 服务器实例类
package cn.itcast.hadoop.rpc;
public class LoginServiceImpl implements LoginServiceInterface{
@Override
public String Login(String username, String password) {
return username + " logged in successfully!";
}
}
package cn.itcast.hadoop.rpc;
public interface LoginServiceInterface {
public static final long versionID = 1L;
public String Login(String username,String password);
}
package cn.itcast.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.Server;
import org.apache.hadoop.ipc.RPC.Builder; public class starter { public static void main(String[] args) throws HadoopIllegalArgumentException, IOException { Builder builder = new RPC.Builder(new Configuration()); builder.setBindAddress("zpfbuaa").setPort(10000).setProtocol(LoginServiceInterface.class).setInstance(new LoginServiceImpl()); Server server = builder.build(); } }
LoginController登录类
package cn.itcast.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 proxy = RPC.getProxy(LoginServiceInterface.class, 1L, new InetSocketAddress("zpfbuaa", 10000), new Configuration()); String result = proxy.Login("zpfbuaa", "123456789"); System.out.println(result);
}
}
LoginServiceInterface 接口类
package cn.itcast.hadoop.rpc;
public interface LoginServiceInterface {
public static final long versionID = 1L;
public String Login(String username,String password);
}
需要注意的是:
1.为了进行远程调用的模仿,将LoginServiceImpl.class以及LoginServiceInterface.class接口类和 starter.class类放在虚拟机上。本地放LoginController类以及LoginServiceInterface接口类。
2.首先需要将服务器端的服务启动,上述例子会监听虚拟机的10000端口。
3.容易忽略的地方:版本号versionID. 对于不同的版本拥有不同的版本号。在上述例子中简单的均定义版本号为Long类型 并且为final类型 赋值为1L。
4.jar包的导入以及版本的控制。
5.本地以及服务器端的函数都要实现一样的接口类,但是为了防止调用时版本的不对应,所以在Build实例的时候需要将版本号也就是versionID声明清楚,这样调用的时候可以通过版本号的不同将函数进行区别开。
Hadoop自身的远程调用实现机制RPC主要步骤如下:
1.将本地socket以及接口类封装为一个proxy,生成动态本地代理实例。
2.该实例调用相对应的函数并且传入相应的参数。
3.本地socket得到动态代理调用的函数以及传入的参数。
4.使用网络传输协议实现本地socket与远程服务器的socket进行连接,实现信息传递。
5.服务器端socket得到调用的函数以及传入的参数,生成动态服务器端的代理实例。
6.该服务器端实例调用服务器端的函数,并且传入得到的参数。
7.函数调用结果返回给服务器端socket。
8.服务器端socket将返回结果通过网络传输协议传递给本地socket。
9.本地socket将返回结果传递给本地动态代理proxy。
RPC的优点:
1.实现了controller和implement的分离
2.利用RPC机制可以实现信息的有效传递。
3.保障数据的可靠性(DataNode需要定时向NameNode传递自身保存的blocks信息,以便NameNode进行blocks的维护)。
远程调用的底层实现机制:

查看FileSystem fs = FileSystem.get(new Configuration());
一步一步查看fs的生成过程!
加入断点后,逐步进行查看!

Hadoop学习2的更多相关文章
- Hadoop学习之旅二:HDFS
本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...
- Hadoop学习笔记—22.Hadoop2.x环境搭建与配置
自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我的一个博文系列<Hadoop学习笔 ...
- Hadoop学习之旅三:MapReduce
MapReduce编程模型 在Google的一篇重要的论文MapReduce: Simplified Data Processing on Large Clusters中提到,Google公司有大量的 ...
- [Hadoop] Hadoop学习历程 [持续更新中…]
1. Hadoop FS Shell Hadoop之所以可以实现分布式计算,主要的原因之一是因为其背后的分布式文件系统(HDFS).所以,对于Hadoop的文件操作需要有一套全新的shell指令来完成 ...
- Hadoop学习笔记—2.不怕故障的海量存储:HDFS基础入门
一.HDFS出现的背景 随着社会的进步,需要处理数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是却不方便管理和维护—>因此,迫切需要一种系统来管理多 ...
- Hadoop学习路线图
Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项目包括, ...
- Hadoop学习(5)-- Hadoop2
在Hadoop1(版本<=0.22)中,由于NameNode和JobTracker存在单点中,这制约了hadoop的发展,当集群规模超过2000台时,NameNode和JobTracker已经不 ...
- Hadoop学习总结之五:Hadoop的运行痕迹
Hadoop学习总结之五:Hadoop的运行痕迹 Hadoop 学习总结之一:HDFS简介 Hadoop学习总结之二:HDFS读写过程解析 Hadoop学习总结之三:Map-Reduce入门 Ha ...
- Hadoop学习笔记(7) ——高级编程
Hadoop学习笔记(7) ——高级编程 从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成 ...
- Hadoop学习笔记(6) ——重新认识Hadoop
Hadoop学习笔记(6) ——重新认识Hadoop 之前,我们把hadoop从下载包部署到编写了helloworld,看到了结果.现是得开始稍微更深入地了解hadoop了. Hadoop包含了两大功 ...
随机推荐
- angularjs 请求后端接口请求了两次
用angularjs的过程中发现,每次打开页面,请求后端的接口都请求了两次 如下图可以看到, http://192.168.1.109:8080/zdh/api/v1/goods/54 这个页面loa ...
- Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock
本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLo ...
- 从 github 上 fork repositories 后,如何和原仓库同步?
1. 首先要先确定一下是否建立了主repo的远程源: git remote -v 2. 如果里面只能看到你自己的两个源(fetch 和 push),那就需要添加主repo的源: git remote ...
- C++入门知识总结(1)
1.有符号数和无符号数. 这个问题其实是一个很细的问题,我们还要把问题追溯到“位”,针对不同的“位”,那么能表示的最大数的范围不同.因为计算机存储数据都是以二进制的方式去存储的,即0和1,比如 110 ...
- FineUI Grid控件高度自适应
引言 页面里使用f:Grid控件,添加分页功能,然后高度填充整个页面. 如何使用 使用FineUI 控件的每个页面都有一个f:PageManager控件,它包含属性:AutoSizePanelID,设 ...
- .NET环境下基于RBAC的访问控制
.NET环境下基于RBAC的访问控制 Access Control of Application Based on RBAC model in .NET Environment 摘 要:本文从目前信息 ...
- 重构sql server的sys.sp_helptext存储
本文目录列表: 1.sys.sp_helptext存储的功能和效果 2.重构sys.sp_helptext存储(命名为dbo.usp_helptext)提供直观的效果 3.sys.sp_helptex ...
- 利用Swashbuckle生成Web API Help Pages
利用Swashbuckle生成Web API Help Pages 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: ...
- 在MVC控制器里面使用dynamic和ExpandoObject,实现数据转义的输出
在很多时候,我们在数据库里面定义表字段和实际在页面中展示的内容,往往是不太匹配的,页面数据可能是多个表数据的综合体,因此除了我们在表设计的时候考虑周到外,还需要考虑数据展现的处理.如果是常规的处理,那 ...
- Asp.net 面向接口可扩展框架之核心容器(含测试代码下载)
新框架的容器部分终于调通了!容器实在太重要了,所以有用了一个名词叫“核心容器”. 容器为什么那么重要呢?这个有必要好好说道说道. 1.首先我们从框架名称面向接口编程说起,什么是面向接口编程?(这个度娘 ...