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 ...
随机推荐
- pip源设置 & pandas安装
pip的官方源python.pypi.org貌似被墙,换用国内安装源 网上的设置方法都是基于Unix的,Windows下的设置略麻烦. 更新..\Lib\site-packages\pip下的cmdo ...
- 2019年猪年海报PSD模板-第二部分
14套精美猪年海报,免费猪年海报,下载地址:百度网盘,https://pan.baidu.com/s/1sH0U5oU-LQlaxnaWxPCrrg
- selenium,unittest——两个class连续运行
将多个class放在一个文件内一起运行,这是一个多用例不同网站进行测试的方法 #encoding=utf-8from selenium import webdriverimport time,unit ...
- 【setUp-tearDown】线程组开始,结束各执行一次
使用setUp线程组的方式 ——> 开始 使用tearDown线程组 的方式 ——>结束
- 安卓客户端浏览器ajax注意
这两天被一个bug搞疯了,就是公司安卓app上我负责的网页死活不进ajax,一开始我用的是post方式提交的,但是参数那一栏没写,直接把参数写在url上了,后来老大跟我说post不写参数会出问题,后来 ...
- python—IDLE的shell上下翻看历史
Alt+p和Alt+n,分别向上(history previous)和向下(history next)调出使用过的历史命令.
- Ubuntu—查看进程并关闭进程
环境:Ubuntu终端 命令:ps -aux 功能:查看进程信息 命令:kill 进程号(PID) 功能:杀死进程
- [堆+贪心]牛客练习赛40-B
传送门:牛客练习赛40 题面: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费 x_i 的时间,同时完成第 i 个任务的时间不 ...
- leetcode个人题解——#24 Swap Nodes in Pairs
因为不太熟悉链表操作,所以解决方法烦了点,空间时间多有冗余. 代码中l,r分别是每一组的需要交换的左右指针,temp是下一组的头指针,用于交换后链接:res是交换后的l指针,用于本组交换后尾指针在下一 ...
- HDU 2490 Parade(DPの单调队列)(2008 Asia Regional Beijing)
Description Panagola, The Lord of city F likes to parade very much. He always inspects his city in h ...