hadoop 编码实现文件传输、查看等基本文件控制
hadoop集群搭建参考:https://www.cnblogs.com/asker009/p/9126354.html
1、创建一个maven工程,添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.home</groupId>
<artifactId>FileSystemCat</artifactId>
<version>1.0-SNAPSHOT</version> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version> <maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
</project>
2、实现cat、copy、filestatus等基本代码,代码可以在windows的IDE环境中正常运行(参考上篇在windows里调试hadoop),也可以打成jar包放入远程hadoop集群上执行。
如果对hadoop的端口不熟悉,在测试环境可以关闭hadoop集群上的防火墙。
import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils; import java.io.*;
import java.net.URI;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId; /**
* @Author: xu.dm
* @Date: 2019/1/31 14:39
* @Description:
*/
public class FileSystemCat { private static String HDFSUri = "hdfs://bigdata-senior01.home.com:9000"; public static void main(String[] args) throws Exception {
long startTime = System.currentTimeMillis();
//文本文件cat
// fileCat(args); //文件copy
fileCopyWithProgress(args); //file status
// fileStatus(args); // file status pattern
// filePattern(args); long endTime = System.currentTimeMillis();
long timeSpan = endTime - startTime;
System.out.println("耗费时间:" + timeSpan + "毫秒");
} private static FileSystem getFileSystem() {
Configuration conf = new Configuration(); //文件系统
FileSystem fs = null;
String hdfsUri = HDFSUri;
if (StringUtils.isBlank(hdfsUri)) {
//返回默认文件系统,如果在hadoop集群下运行,使用此种方法可直接获取默认文件系统;
try {
fs = FileSystem.get(conf);
} catch (IOException e) {
e.printStackTrace();
}
} else {
//返回指定的文件系统,如果在本地测试,需要此种方法获取文件系统;
try {
URI uri = new URI(hdfsUri.trim());
fs = FileSystem.get(uri, conf);
} catch (Exception e) {
e.printStackTrace();
}
}
return fs;
} ///hadoop输出文本文件内容
private static void fileCat(String[] args) throws Exception {
String uri = args[0];
Configuration conf = new Configuration();
// conf.set("fs.hdfs.impl",org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
conf.set("fs.defaultFS","hdfs://bigdata-senior01.home.com:9000");
FileSystem fs = FileSystem.get(URI.create(uri), conf);
// InputStream in = null;
// FSDataInputStream继承 java.io.DataInputStream,支持随机访问
FSDataInputStream in = null;
try {
in = fs.open(new Path(uri));
IOUtils.copyBytes(in, System.out, 4096, false);
in.seek(0);
IOUtils.copyBytes(in, System.out, 4096, false);
} finally {
IOUtils.closeStream(in);
}
} //将本地文件拷贝到hadoop文件系统上
//需要开通datanode用于数据传输端口:9866
private static void fileCopyWithProgress(String[] args) throws Exception {
String locaSrc = args[0];
String dst = args[1]; //从windows环境提交的时候需要设置hadoop用户名
//在linux的其他用户环境下估计也需要
System.setProperty("HADOOP_USER_NAME","hadoop"); Configuration conf = new Configuration();
// conf.set("fs.DefaultFs", "hdfs://bigdata-senior01.home.com:9000"); //因为涉及到两个文件系统的数据传输,如果dst不是全路径的话(带不带hdfs的头)用这种方式取到的还是本地文件系统
//如果不涉及两个文件系统,dst写短路径是没问题的
// FileSystem fs = FileSystem.get(URI.create(dst), conf); FileSystem fs = FileSystem.get(URI.create(HDFSUri),conf); // fs.copyFromLocalFile(new Path(locaSrc),new Path(dst));
// fs.close();
// System.out.println("copyFromLocalFile...done"); InputStream in = new BufferedInputStream(new FileInputStream(locaSrc)); FSDataOutputStream out = null; out = fs.create(new Path(dst), () -> System.out.print(".")); IOUtils.copyBytes(in, out, 4096, true);
} //查找文件,递归列出给定目录或者文件的属性
private static void fileStatus(String[] args) throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://bigdata-senior01.home.com:9000");
Path file = new Path(args[0]);
FileSystem fs = null;
try {
// fs = FileSystem.get(URI.create(args[0]),conf);
fs = FileSystem.get(conf); // fs = getFileSystem(); //对单个文件或目录
// FileStatus fileStatus = fs.getFileStatus(file); //对单个文件或目录下所有文件和目录
FileStatus[] fileStatuses = fs.listStatus(file); //FileUtil封装了很多文件功能
//FileStatus[] 和 Path[]转换
// Path[] files = FileUtil.stat2Paths(fileStatuses); for (FileStatus fileStatus : fileStatuses) {
System.out.println("-------------->");
System.out.println("是否目录:" + fileStatus.isDirectory());
System.out.println("path:" + fileStatus.getPath().toString());
System.out.println("length:" + fileStatus.getLen());
System.out.println("accessTime:" + LocalDateTime.ofInstant(Instant.ofEpochMilli(fileStatus.getAccessTime()), ZoneId.systemDefault()));
System.out.println("permission:" + fileStatus.getPermission().toString());
//递归查找子目录
if (fileStatus.isDirectory()) {
FileSystemCat.fileStatus(new String[]{fileStatus.getPath().toString()});
}
}
} finally {
if (fs != null)
fs.close();
}
} //查找文件,通配模式,不能直接用于递归,应该作为递归的最外层,不进入递归
private static void filePattern(String[] args) throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://bigdata-senior01.home.com:9000");
FileSystem fs = null;
try {
fs = FileSystem.get(conf);
//输入参数大于1,第二个参数作为排除参数
//例如:hadoop jar FileSystemCat.jar /demo ^.*/demo[1-3]$ 排除/demo1,/demo2,/demo3
//例如:hadoop jar FileSystemCat.jar /demo/wc* ^.*/demo/wc3.*$ 排除/demo下wc3开头所有文件
FileStatus[] fileStatuses = null;
if (args.length > 1) {
System.out.println("过滤路径:" + args[1]);
fileStatuses = fs.globStatus(new Path(args[0]), new RegexExcludePathFilter(args[1]));
} else {
fileStatuses = fs.globStatus(new Path(args[0]));
} for (FileStatus fileStatus : fileStatuses) {
System.out.println("-------------->");
System.out.println("是否目录:" + fileStatus.isDirectory());
System.out.println("path:" + fileStatus.getPath().toString());
System.out.println("length:" + fileStatus.getLen());
System.out.println("modificationTime:" + LocalDateTime.ofInstant(Instant.ofEpochMilli(fileStatus.getModificationTime()), ZoneId.systemDefault()));
System.out.println("permission:" + fileStatus.getPermission().toString());
if (fileStatus.isDirectory()) {
FileSystemCat.fileStatus(new String[]{fileStatus.getPath().toString()});
}
}
} finally {
if (fs != null)
fs.close();
}
} }
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.PathFilter; /**
* @Author: xu.dm
* @Date: 2019/2/1 13:38
* @Description:
*/
public class RegexExcludePathFilter implements PathFilter { private final String regex; public RegexExcludePathFilter(String regex) {
this.regex = regex;
} @Override
public boolean accept(Path path) {
return !path.toString().matches(this.regex);
}
}
hadoop 编码实现文件传输、查看等基本文件控制的更多相关文章
- java文件传输之文件编码和File类的使用
---恢复内容开始--- 我们知道,在用户端和服务端之间存在一个数据传输的问题,例如下载个电影.上传个照片.发一条讯息.在这里我们 就说一下文件的传输. 1.文件编码 相信大家小时候玩过积木(没玩过也 ...
- 在本机eclipse中创建maven项目,查看linux中hadoop下的文件、在本机搭建hadoop环境
注意 第一次建立maven项目时需要在联网情况下,因为他会自动下载一些东西,不然突然终止 需要手动删除断网前建立的文件 在eclipse里新建maven项目步骤 直接新建maven项目出了错 ...
- 在Vim中查看文件编码和文件编码转换
在Vim中查看文件编码和文件编码转换 风亡小窝 关注 0.2 2016.09.26 22:43* 字数 244 阅读 5663评论 0喜欢 2 在Vim中查看文件编码 :set fileencodi ...
- linux下常用文件传输命令 (转)
因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...
- 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)
目录[-] 一.TCP/IP协议 二.TCP与UDP 三.Socket是什么 四.Java中的Socket 五.基本的Client/Server程序 六.多客户端连接服务器 七.信息共享 八.文件传输 ...
- 循序渐进Socket网络编程(多客户端、信息共享、文件传输)
循序渐进Socket网络编程(多客户端.信息共享.文件传输) 前言:在最近一个即将结束的项目中使用到了Socket编程,用于调用另一系统进行处理并返回数据.故把Socket的基础知识总结梳理一遍. 1 ...
- Python 字符编码及其文件操作
本章节内容导航: 1.字符编码:人识别的语言与机器机器识别的语言转化的媒介. 2.字符与字节:字符占多少个字节,字符串转化 3.文件操作:操作硬盘中的一块区域:读写操作 注:浅拷贝与深拷贝 用法: d ...
- TCP协议,UDP,以及TCP通信服务器的文件传输
TCP通信过程 下图是一次TCP通讯的时序图.TCP连接建立断开.包含大家熟知的三次握手和四次握手. 在这个例子中,首先客户端主动发起连接.发送请求,然后服务器端响应请求,然后客户端主动关闭连接.两条 ...
- python tcp黏包和struct模块解决方法,大文件传输方法及MD5校验
一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...
随机推荐
- DSP28335的上手试用LED灯闪烁-第一篇
1. 本次以三兄弟的DSP28335开发板为例,看下JTAG接口,EMU0,EMU1的用途,不是很懂,不深入研究,用到再说 EMU0/1是TI芯片的JTAG才有的信号,本身不属于JTAG标准里的信号, ...
- 全局脚手架了解一下【fle-cli】
本文来自网易云社区 介绍 fle-cli旨在帮助我们从复杂繁琐的编译配置中解放出来,全身心地投入业务开发中,提高开发效率. 它是真正意义上的全局脚手架,区别于市面上其他的全局脚手架,它不会在项目工程中 ...
- Ruby 基础教程 1-2
1.数组 创建 arrayname=[] arrayname=["1",12,"23"] 访问 arrayname[index] 更新 arrayname[in ...
- vim分屏功能总结
vim的分屏功能 总结起来,基本都是ctrl+w然后加上某一个按键字母,触发一个功能.(1)在shell里打开几个文件并且分屏: vim -On file1 file2 ... vim -on fil ...
- http性能测试点滴
WeTest 导读 在服务上线之前,性能测试必不可少.本文主要介绍性能测试的流程,需要关注的指标,性能测试工具apache bench的使用,以及常见的坑. 什么是性能测试 性能测试是通过自动化的测试 ...
- 后台可以用layui快速开发
后台可以用layui快速开发
- 【paging_Class 分页类】使用说明
类名:paging_Class 说明:分页类 注意: 1) 支持百万级数据分页 2) 支持多种类型的SQL语法,比如 Left Join 等. 3) 自动保存查询中的错误情况,记录保存在:/Cache ...
- Navicat和DBeaver的查询快捷键
1.Navicat for MySQL(连接MySQL数据库的工具) ctrl + r 执行查询页中所有的sql语句 ctrl + shift + r 只运行选中的sql语句 2.DBeaver(支持 ...
- Dev c++ 调试步骤
不能调试的时候,修改下列地方: 1.在“工具”->编译选项->”Add following commands when calling complier”下面的编辑框里写入:-g3 2.在 ...
- 学霸系统PipeLine功能规格说明书
学霸系统PipeLine功能规格说明书共分为以下三部分: 1.产品面向用户群体 2.用户使用说明 3.产品功能具体实现 1.产品面向用户群体 我们这组的项目并不是传统意义上能发布并进行展示的项目,因此 ...