HDFS使用JavaAPI操作上传特定副本到datanode

一、首先自然是导包

   $HADOOP_HOME/share/hadoop/common/*.jar
   $HADOOP_HOME/share/hadoop/common/lib/*.jar
   $HADOOP_HOME/share/hadoop/hdfs/*.jar
   $HADOOP_HOME/share/hadoop/hdfs/lib/*.jar


二、代码如下

package com.stu.hdfs;
/*** * @author ysw28* HDFS的API操作*/import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.util.Arrays;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
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.apache.hadoop.io.IOUtils;
import org.junit.Test;public class TestDemo319 {@Test// 创建目录public void mkDir() {try {// 连接HDFS,设置副本数Configuration conf = new Configuration();conf.set("dfs.replication", "1");// 创建一个客户端FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");// 创建目录Path path = new Path("/Demo319");client.mkdirs(path);// 关闭客户端client.close();System.out.println("创建目录成功");} catch (Exception e) {e.printStackTrace();System.out.println("创建目录失败");}}@Test// 删除目录,删除文件同理public void delDir() {try {// 连接HDFSConfiguration conf = new Configuration();// 创建客户端FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");// 删除目录Path path = new Path("/Demo319");if (client.exists(path)) {client.delete(path, true);// 关闭客户端client.close();System.out.println("删除目录成功");} else {System.out.println("没有这个文件");}} catch (Exception e) {e.printStackTrace();System.out.println("删除目录失败");}}@Test// 上传文件public void copyFromLocal() {try {// 连接HDFS,指定副本数Configuration conf = new Configuration();conf.set("dfs.replication", "1");// 创建客户端FileSystem client = FileSystem.get(new URI("hdfs://Hp110:9000"), conf, "root");// 上传文件client.copyFromLocalFile(new Path("C:\\Users\\ysw28\\Desktop\\hadoop-2.8.5.tar.gz"), new Path("/Demo319"));// 关闭客户端client.close();System.out.println("上传文件成功");} catch (Exception e) {e.printStackTrace();System.out.println("上传文件失败");}}@Test// 下载文件public void copyToFrom() {try {// 连接HDFSConfiguration conf = new Configuration();// 创建客户端FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");// 下载文件client.copyToLocalFile(true, new Path("/Demo319/hadoop-2.8.5.tar.gz"), new Path("E://"), true);// 关闭客户端client.close();System.out.println("上传文件成功");} catch (Exception e) {e.printStackTrace();System.out.println("上传文件失败");}}@Test// 使用HDFS的IO流上传文件public void putFileToHdfs() {try {// 连接HDFS,指定副本数Configuration conf = new Configuration();conf.set("dfs.replication", "1");// 创建客户端FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");// 上传文件,构造一个输入流InputStream input = new FileInputStream("E:\\hadoop-2.8.5.tar.gz");// 构造一个输出流OutputStream output = client.create(new Path("/Demo319/hadoop.tar.gz"));// 构造一个缓存区byte buffer[] = new byte[1024];// 指定长度int len = 0;// 读取数据while ((len = input.read(buffer)) > 0) {// 写入数据output.write(buffer, 0, len);}// 刷新output.flush();// 关闭流output.close();input.close();// 关闭客户端client.close();System.out.println("通过HDFS的IO流上传文件成功");} catch (Exception e) {e.printStackTrace();System.out.println("通过HDFS的IO流上传文件失败");}}@Test// 使用HDFS的IO流下载文件public void getFileFromHdfs() {try {// 连接HDFSConfiguration conf = new Configuration();// 创建客户端FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");// 下载文件,构造一个输入流InputStream input = client.open(new Path("/Demo319/hadoop.tar.gz"));// 构造一个输出流OutputStream output = new FileOutputStream("E://1.tar.gz");// 使用工具类IOUtils.copyBytes(input, output, 1024);// 关闭客户端client.close();System.out.println("通过HDFS的IO流下载文件成功");} catch (Exception e) {e.printStackTrace();System.out.println("通过HDFS的IO流下载文件失败");}}@Test// 更改文件名,更改目录名同理public void reName() {try {// 连接HDFSConfiguration conf = new Configuration();// 创建客户端FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");// 更改文件名Path oldpath = new Path("/Demo319/1.txt");Path newPath = new Path("/Demo319/2.txt");client.rename(oldpath, newPath);// 关闭客户端client.close();System.out.println("更改文件名成功");} catch (Exception e) {e.printStackTrace();System.out.println("更改文件名失败");}}@Test// 写入数据public void writeFile() {try {// 连接HDFS,配置副本数Configuration conf = new Configuration();conf.set("dfs.replication", "1");// 创建客户端FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");// 写入数据FSDataOutputStream output = client.create(new Path("/Demo319/3.txt"));output.writeUTF("我喜欢大数据");// 关闭流output.close();// 关闭客户端client.close();System.out.println("写入文件成功");} catch (Exception e) {e.printStackTrace();System.out.println("写入文件失败");}}@Test// 读取文件public void readFile() {try {// 连接HDFSConfiguration conf = new Configuration();// 创建客户端FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");// 读取文件Path path = new Path("/Demo319/3.txt");if (client.exists(path)) {InputStream input = client.open(path);// 构造一个缓存区byte buffer[] = new byte[1024];int foot = 0;// 指定数组的下标int temp = 0;// 指定接受每次读取的字节数据while ((temp = input.read()) != -1) {buffer[foot++] = (byte) temp;}System.out.println(new String(buffer, 0, foot));// 关闭流input.close();// 关闭客户端client.close();System.out.println("读取文件成功");} else {System.out.println("没有这个文件");}} catch (Exception e) {e.printStackTrace();System.out.println("读取文件失败");}}@Test// 判断HDFS上是否存在某文件public void hdfsFileExists() {try {// 连接HDFS// 指定当前使用的用户是rootSystem.setProperty("HADOOP_USER_NAME", "root");// 配置参数,指定NameNode地址Configuration conf = new Configuration();conf.set("fs.defaultFS", "hdfs://HP110:9000");// 创建一个客户端FileSystem client = FileSystem.get(conf);// 判断是否存在某文件if (client.exists(new Path("/Demo/1.txt"))) {System.out.println("存在文件1.txt");} else {System.out.println("不存在文件1.txt");}System.out.println("没有出现错误");} catch (Exception e) {e.printStackTrace();System.out.println("出现错误");}}@Test// 查看文件信息public void getFileInfo() {try {// 连接HDFSConfiguration conf = new Configuration();// 创建客户端FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");// 查看文件信息Path path = new Path("/");RemoteIterator<LocatedFileStatus> listFiles = client.listFiles(path, true);while (listFiles.hasNext()) {LocatedFileStatus status = listFiles.next();System.out.println(status.getPath().getName()); // 获取文件名System.out.println(status.getGroup()); // 获取所在组System.out.println(status.getLen());// 文件大小System.out.println(status.getPermission());// 获取权限// 获取数据块信息BlockLocation[] blockLocations = status.getBlockLocations();for (BlockLocation blockLocation : blockLocations) {// 数据块所在主机名String[] hosts = blockLocation.getHosts();for (String host : hosts) {System.out.println(host);}// 数据块所在主机IPString[] names = blockLocation.getNames();for (String name : names) {System.out.println(name);}}System.out.println("这是一个分割线-----------------------------");}System.out.println("查看文件信息成功");} catch (Exception e) {e.printStackTrace();System.out.println("查看文件信息失败");}}@Test// 获取数据块信息public void getBlockInfo() {try {// 连接HDFS// 指定使用的用户是rootSystem.setProperty("HADOOP_USER_NAME", "root");// 配置参数,指明NameNode的地址Configuration conf = new Configuration();conf.set("fs.defaultFS", "hdfs://HP110:9000");// 创建一个客户端FileSystem client = FileSystem.get(conf);// 获取文件status信息FileStatus fileStatus = client.getFileStatus(new Path("/Demo/100.txt"));// 获取文件的数据块信息BlockLocation locaktions[] = client.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());/** 将数组转换为字符串 语法:Arrays.toString(数组名);*/for (BlockLocation blockLocation : locaktions) {System.out.println(Arrays.toString(blockLocation.getHosts()) + "\t" + Arrays.toString(blockLocation.getNames()));System.out.println(fileStatus);}// 关闭客户端client.close();System.out.println("获取数据块信息成功");} catch (Exception e) {e.printStackTrace();System.out.println("获取数据块信息失败");}}@Test// 查看HDFS中所有的文件和内容,想看具体的话就在/后面累加文件的名字public void getListFileInfo() {try {// 连接HDFS// 指定当前用户是rootSystem.setProperty("HADOOP_USER_NAME", "root");// 配置参数,指定NameNode地址Configuration conf = new Configuration();conf.set("fs.defaultFS", "hdfs://HP110:9000");// 创建一个客户端FileSystem client = FileSystem.get(conf);// 指定查看地址Path path = new Path("/Demo/100.txt");FileStatus list[] = client.listStatus(path);for (FileStatus fileStatus : list) {System.out.println(fileStatus);}System.out.println("查看文件成功");} catch (Exception e) {e.printStackTrace();System.out.println("查看文件失败");}}}

任何程序错误,以及技术疑问或需要解答的,请添加

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos php 版本升级 至5.3 wordpress3.7

今天换了主机&#xff0c;wordpress居然出现下面的错误&#xff1a; 您的服务器现在运行的PHP版本为5.1.6&#xff0c;但WordPress 3.7要求的最低版本为5.2.4。 http://www.webtatic.com/packages/php53/ 这里已经准备了 5.3的安装包, 包括相关的扩展 升级命令&#xff1a; rpm…

vuejs深入浅出—基础篇

一、从HelloWorld说起 任何语言的都是从Hello World开始的&#xff0c;VueJs也不例外&#xff0c;直接上代码&#xff1a; <script src"https://unpkg.com/vue/dist/vue.js"></script><div id"demo">{{hello}}</div><script&g…

近百家公司高级运维的面试题汇总

10月1日日考题 画出系统应用架构图写出LVS与nginx的区别当前数据库服务处理速度慢&#xff0c;你认为可能是什么原因导致的&#xff0c;并阐述一下对应的解决办法说一下你知道的存储引擎&#xff0c;建表时如何决定表使用存储引擎单张表过大有什么缺点&#xff0c;如何解决给你…

Linux idle基础

2019独角兽企业重金招聘Python工程师标准>>> Linux系统越来越受到电脑用户的欢迎&#xff0c;于是很多人开始学习Linux时&#xff0c;学习linux&#xff0c;你可能会遇到linux内核问题&#xff0c;这里将介绍linux内核中idle知识。 1. idle是什么 简单的说idle是一…

PowerDesigner版本控制器设置权限

PowerDesigner版本控制权限之前一直在Groups里面设置&#xff0c;一直没有效果&#xff0c;原因终于找出来了&#xff0c;PowerDesigner是要对每个库单独赋权限的&#xff0c;步骤如下&#xff1a; 连接上版本控制&#xff0c;在左侧菜单 Object Browser里面&#xff0c;找到你…

IT运维面试问题总结-运维工具、开源应用(Ansible、Ceph、Docker、Apache、Nginx等)

1、简述Ansible及其优势&#xff1f; Ansible是一款极其简单的开源的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具(puppet, cfengine, chef, func, fabric)的优点。实现了批量系统配置&#xff0c;批量程序部署&#xff0c;批量运行命令等功能。同…

程序员进阶之路—如何独当一面

今天和大家分享一下&#xff0c;程序员如何独当一面这个话题&#xff0c;这是一个很大的话题&#xff0c;我把他分成三部分来谈&#xff1a;  一、需求转换的能力或者叫理解需求的能力&#xff1b;  二、分配时间的能力&#xff1b;  三、开发质量的问题&#xff1b; 我…

html跨浏览器兼容性问题

之前写代码没注意到&#xff0c;这次学习了。 首先 img的width和height属性在IE浏览器中不起作用&#xff0c;可以设置一个div&#xff0c;让img标签在div块中&#xff0c;div中设置style:overflow:hidden,然后用div的宽和高来定义图片的宽和高。 第二个就是&#xff0c;clear:…

Spring经典面试题

文章目录 Spring概述&#xff08;10&#xff09; 什么是spring?Spring框架的设计目标&#xff0c;设计理念&#xff0c;和核心是什么Spring的优缺点是什么&#xff1f;Spring有哪些应用场景Spring由哪些模块组成&#xff1f;Spring 框架中都用到了哪些设计模式&#xff1f;详细…

JDBC 获取被插入数据的主键ID值

除了用存储过程还有以下方法可以获取&#xff1a; static int create() throws SQLException { Connection conn null; PreparedStatement ps null; ResultSet rs null; try { // 2.建立连接 conn JdbcUtils.getConnection(); // …

MySQL 5.6的新特性

MySQL 5.6是一个主要的版本发布&#xff0c;它在性能、可伸缩性、可靠性和可用性方面引入了多项重要改进和新特性。它在2013年发布&#xff0c;相比于它的前身MySQL 5.5&#xff0c;MySQL 5.6带来了以下关键升级&#xff1a; 优化的InnoDB存储引擎&#xff1a;MySQL 5.6中的Inn…

简易数字时钟软件详细制作过程

这是我自己用VS2010制作的简易数字时钟小软件&#xff0c;在制作过程中收获知识不少&#xff0c;希望和初学MFC编程的朋友分享一下。 一、其功能有一下三点&#xff1a; 1.打开软件后&#xff0c;其程序自动获取当前电脑系统的日期、时间和周次&#xff0c;并同步显示在主对 …

关于后台系统自动生成的一点思考

大量实践发现后台管理程序&#xff0c;其实90%的代码都是相同的&#xff0c;当然是在抛弃复杂逻辑业务的情况下&#xff0c;那么如何能高效的节约这些时间呢&#xff0c;那就是接下来我要说的&#xff0c;对于后台系统自动生成的一些思考。 适用情景&#xff1a; 1、表编号id为…

MFC定时器SetTimer函数用法总结

CWnd类的SetTimer成员函数只能在CWnd类或其派生类中调用&#xff0c;而API函数SetTimer则没有这个限制&#xff0c;这是一个很重要的区别。 1、启动定时器。 启动定时器就需要使用CWnd类的成员函数SetTimer。CWnd::SetTimer的原型如下&#xff1a; 参数nIDEvent指定一个非零的…

全网最全的Numpy开发入门教程(详细案例版)

概述 NumPy是一个Python库&#xff0c;每个数据科学专业人员都应该熟悉它这个全面的NumPy教程从头开始介绍NumPy&#xff0c;从基本的数学运算到NumPy如何处理图像数据本文中有大量的Numpy概念和Python代码 介绍 我非常喜欢Python中的NumPy库。在我的数据科学之旅中&#xff…

android开源库收集

1. google valley Android网络通信库 git clone https://android.googlesource.com/platform/frameworks/volley 介绍 http://www.cnblogs.com/bvin/p/3291611.html#2806770 http://liubin.org/2013/05/27/android-volley-at-a-glance/ 2.Afinal是一个android的ioc&#xff…

微信分享JSSDK-invalid signature签名错误的解决方案

核对官方步骤&#xff0c;确认签名算法。 确认签名算法正确&#xff0c;可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?tjsapisign 页面工具进行校验。确认config中nonceStr&#xff08;js中驼峰标准大写S&#xff09;, timestamp与用以签名中的对应noncestr, timesta…

MFC操作Excel2003的CRange类的Copy函数和Delete函数实现方法

一、CRange类的Copy函数实现方法 具体步骤&#xff1a; 1.实例化一个CRange类对象range1&#xff0c;关联你要拷贝的区域&#xff1b; 2.实例化一个CRange类对象range2&#xff0c;关联你要将要粘贴到的区域&#xff1b; 3.调用前一个range1对象的Copy函数&#xff0c;就可…

Django代码编写规范

1. 编码声明 在 Python 解释器执行代码时&#xff0c;需要告诉解释器代码的编码方式。Python 代码实际上是文本数据&#xff0c;如果代码的编码方式与解释器读取的编码方式不一致&#xff0c;将会因编码错误&#xff0c;代码无法执行。Python 2 解释器读取代码时&#xff0c;默…

Get sdcard directory by adb

解决方案&#xff1a; adb shell echo $EXTERNAL_STORAGE I am making an application, which pulls files(Saved by android app) from the device sdcard by adb. The problem is that different devices, have various sdcard directories i.e: sdcardsdcard/external_sdFi…