Hadoop 代码实现文件上传
本项目主要实现Windows下利用代码实现Hadoop中文件上传至HDFS
实现上传文本文件中单词个数的计数
1、项目结构
2、相关代码
- CopyFromLocalFile
- 1 package com.hadoop.worldcount;
- 2
- 3 import java.io.FileInputStream;
- 4
- 5 import java.io.IOException;
- 6
- 7 import org.apache.hadoop.conf.Configuration;
- 8
- 9 import org.apache.hadoop.fs.FSDataOutputStream;
- 10
- 11 import org.apache.hadoop.fs.FileSystem;
- 12
- 13 import org.apache.hadoop.fs.Path;
- 14
- 15 public class CopyFromLocalFile {
- 16
- 17 /**
- 18
- 19 * 判断路径是否存在
- 20
- 21 */
- 22
- 23 public static boolean test(Configuration conf, String path) {
- 24
- 25 try (FileSystem fs = FileSystem.get(conf)) {
- 26
- 27 return fs.exists(new Path(path));
- 28
- 29 } catch (IOException e) {
- 30
- 31
- 32
- 33 e.printStackTrace();
- 34
- 35 return false;
- 36
- 37 }
- 38
- 39
- 40
- 41 }
- 42
- 43 /**
- 44
- 45
- 46
- 47 * 复制文件到指定路径 若路径已存在,则进行覆盖
- 48
- 49
- 50
- 51 */
- 52
- 53
- 54
- 55 public static void copyFromLocalFile(Configuration conf,
- 56
- 57 String localFilePath, String remoteFilePath) {
- 58
- 59 Path localPath = new Path(localFilePath);
- 60
- 61 Path remotePath = new Path(remoteFilePath);
- 62
- 63 try (FileSystem fs = FileSystem.get(conf)) {
- 64
- 65 /* fs.copyFromLocalFile 第一个参数表示是否删除源文件,第二个参数表示是否覆盖 */
- 66
- 67 fs.copyFromLocalFile(false, true, localPath, remotePath);
- 68
- 69 } catch (IOException e) {
- 70
- 71 e.printStackTrace();
- 72
- 73 }
- 74
- 75 }
- 76
- 77
- 78
- 79 /**
- 80
- 81
- 82
- 83 * 追加文件内容
- 84
- 85
- 86
- 87 */
- 88
- 89
- 90
- 91 public static void appendToFile(Configuration conf, String localFilePath,
- 92
- 93 String remoteFilePath) {
- 94
- 95 Path remotePath = new Path(remoteFilePath);
- 96
- 97 try (FileSystem fs = FileSystem.get(conf);
- 98
- 99 FileInputStream in = new FileInputStream(localFilePath);) {
- 100
- 101 FSDataOutputStream out = fs.append(remotePath);
- 102
- 103 byte[] data = new byte[1024];
- 104
- 105 int read = -1;
- 106
- 107 while ((read = in.read(data)) > 0) {
- 108
- 109 out.write(data, 0, read);
- 110
- 111 }
- 112
- 113 out.close();
- 114
- 115 } catch (IOException e) {
- 116
- 117 e.printStackTrace();
- 118
- 119 }
- 120
- 121 }
- 122
- 123
- 124
- 125 /**
- 126
- 127
- 128
- 129 * 主函数
- 130
- 131
- 132
- 133 */
- 134
- 135
- 136
- 137 public static void main(String[] args) {
- 138
- 139 Configuration conf = new Configuration();
- 140
- 141 conf.set("fs.defaultFS", "hdfs://localhost:9000");
- 142
- 143 String localFilePath = "/usr/hadoop/test/test.txt"; // 本地路径
- 144
- 145 String remoteFilePath = "/user/hadoop/test/test.txt"; // HDFS路径
- 146
- 147 String choice = "append"; // 若文件存在则追加到文件末尾
- 148
- 149 //String choice = "overwrite"; // 若文件存在则覆盖
- 150
- 151 try {
- 152
- 153 /* 判断文件是否存在 */
- 154
- 155 boolean fileExists = false;
- 156
- 157 if (CopyFromLocalFile.test(conf, remoteFilePath)) {
- 158
- 159 fileExists = true;
- 160
- 161 System.out.println(remoteFilePath + " 已存在.");
- 162
- 163 } else {
- 164
- 165 System.out.println(remoteFilePath + " 不存在.");
- 166
- 167 }
- 168
- 169 /* 进行处理 */
- 170
- 171 if (!fileExists) { // 文件不存在,则上传
- 172
- 173 CopyFromLocalFile.copyFromLocalFile(conf, localFilePath,
- 174
- 175 remoteFilePath);
- 176
- 177 System.out.println(localFilePath + " 已上传至 " + remoteFilePath);
- 178
- 179 } else if (choice.equals("overwrite")) { // 选择覆盖
- 180
- 181 CopyFromLocalFile.copyFromLocalFile(conf, localFilePath,
- 182
- 183 remoteFilePath);
- 184
- 185 System.out.println(localFilePath + " 已覆盖 " + remoteFilePath);
- 186
- 187 } else if (choice.equals("append")) { // 选择追加
- 188
- 189 CopyFromLocalFile.appendToFile(conf, localFilePath,
- 190
- 191 remoteFilePath);
- 192
- 193 System.out.println(localFilePath + " 已追加至 " + remoteFilePath);
- 194
- 195 }
- 196
- 197 } catch (Exception e) {
- 198
- 199
- 200
- 201 e.printStackTrace();
- 202
- 203 }
- 204
- 205 }
- 206
- 207 }
- File
- package com.hadoop.worldcount;
- import java.io.BufferedInputStream;
- import java.io.FileInputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.URI;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.FileSystem;
- import org.apache.hadoop.fs.Path;
- import org.apache.hadoop.io.IOUtils;
- import org.apache.hadoop.util.Progressable;
- public class File {
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws Exception {
- String localSrc = "E:\\Hadoop\\work\\bashrc.txt";//本地文件
- String dst = "hdfs://localhost:9000/user/hadoop/test/bashrc.txt";//复制到hdfs目录下
- InputStream in = new BufferedInputStream(new FileInputStream(localSrc));
- Configuration conf = new Configuration();
- FileSystem fs = FileSystem.get(URI.create(dst), conf);
- OutputStream out = fs.create(new Path(dst), new Progressable() {//进度条信息
- public void progress() {
- System.out.print(".");
- }
- });
- IOUtils.copyBytes(in, out, 4096, true);//复制
- }
- }
- MyWordCount
- 1 package com.hadoop.worldcount;
- 2
- 3 import java.io.IOException;
- 4 import java.util.StringTokenizer;
- 5 import org.apache.hadoop.conf.Configuration;
- 6 import org.apache.hadoop.fs.Path;
- 7 import org.apache.hadoop.io.IntWritable;
- 8 import org.apache.hadoop.io.LongWritable;
- 9 import org.apache.hadoop.io.Text;
- 10 import org.apache.hadoop.mapreduce.Job;
- 11 import org.apache.hadoop.mapreduce.Mapper;
- 12 import org.apache.hadoop.mapreduce.Reducer;
- 13 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
- 14 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
- 15
- 16 public class MyWordCount {
- 17
- 18 public static class TokenizerMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
- 19 /**
- 20 * Mapper中的map方法:
- 21 * void map(K1 key, V1 value, Context context)
- 22 * 映射一个单个的输入k/v对到一个中间的k/v对
- 23 * 输出对不需要和输入对是相同的类型,输入对可以映射到0个或多个输出对。
- 24 * Context:收集Mapper输出的<k,v>对。
- 25 * Context的write(k, v)方法:增加一个(k,v)对到context
- 26 * 程序员主要编写Map和Reduce函数.这个Map函数使用StringTokenizer函数对字符串进行分隔,通过write方法把单词存入word中
- 27 * write方法存入(单词,1)这样的二元组到context中
- 28 */
- 29 @Override
- 30 protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
- 31 throws IOException, InterruptedException {
- 32 StringTokenizer itr = new StringTokenizer(value.toString());
- 33 while (itr.hasMoreTokens()) {
- 34 context.write(new Text(itr.nextToken()), new IntWritable(1));
- 35 }
- 36 }
- 37 }
- 38
- 39 public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
- 40 /**
- 41 * Reducer类中的reduce方法:
- 42 * void reduce(Text key, Iterable<IntWritable> values, Context context)
- 43 * 中k/v来自于map函数中的context,可能经过了进一步处理(combiner),同样通过context输出
- 44 */
- 45 @Override
- 46 protected void reduce(Text key, Iterable<IntWritable> values,
- 47 Context context) throws IOException, InterruptedException {
- 48 int sum = 0;
- 49 for (IntWritable val : values) {
- 50 sum += val.get();
- 51 }
- 52 context.write(key, new IntWritable(sum));
- 53 }
- 54 }
- 55
- 56 public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
- 57 /**
- 58 * Configuration:map/reduce的j配置类,向hadoop框架描述map-reduce执行的工作
- 59 */
- 60 Configuration conf = new Configuration();
- 61 Job job = Job.getInstance(conf, "myWordCount"); //设置一个用户定义的job名称
- 62 job.setJarByClass(MyWordCount.class);
- 63 job.setMapperClass(TokenizerMapper.class); //为job设置Mapper类
- 64 job.setCombinerClass(IntSumReducer.class); //为job设置Combiner类
- 65 job.setReducerClass(IntSumReducer.class); //为job设置Reducer类
- 66 job.setOutputKeyClass(Text.class); //为job的输出数据设置Key类
- 67 job.setOutputValueClass(IntWritable.class); //为job输出设置value类
- 68
- 69 FileInputFormat.addInputPath(job, new Path("hdfs://localhost:9000/user/root/input/bashrc.txt"));
- 70 FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000/user/root/output"));
- 71
- 72 System.exit(job.waitForCompletion(true) ?0 : 1); //运行job
- 73 }
- 74
- 75 }
Hadoop 代码实现文件上传的更多相关文章
- Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (3)
接上篇 Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (2) 7. 使用配置文件指定监听地址 打开 appsettings.json 文件,加入一行 "UseUrls&q ...
- django中使用FastDFS分布式文件系统接口代码实现文件上传、下载、更新、删除
运维使用docker部署好之后FastDFS分布式文件系统之后,提供给我接口如下: fastdfs tracker 192.168.1.216 192.168.1.217 storage 192.16 ...
- Java代码实现文件上传(转载)
刚刚发表了一篇Java发送电子邮件,以前真是没注意,commons里这么多常用项目,惭愧呀,直到现在回顾;要学习的真是太多了,还是缺少真正的学习能力... 这里用到的是commons-fileuplo ...
- Springboot 一行代码实现文件上传 20个平台!少写代码到极致
大家好,我是小富~ 技术交流,公众号:程序员小富 又是做好人好事的一天,有个小可爱私下问我有没有好用的springboot文件上传工具,这不巧了嘛,正好我私藏了一个好东西,顺便给小伙伴们也分享一下,d ...
- 【Hadoop】hdfs文件上传流程图
- java代码实现ftp服务器的文件上传和下载
java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools 工具类: ...
- Ceph RGW服务 使用s3 java sdk 分片文件上传API 报‘SignatureDoesNotMatch’ 异常的定位及规避方案
import java.io.File; import com.amazonaws.AmazonClientException; import com.amazonaws.auth.profile ...
- Java中实现文件上传下载的三种解决方案
第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null ...
- 十六、Struts2文件上传与下载
文件上传与下载 1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post& ...
随机推荐
- dart系列之:安全看我,dart中的安全特性null safety
目录 简介 Non-nullable类型 Nullable List Of Strings 和 List Of Nullable Strings !操作符 late关键字 总结 简介 在Dart 2. ...
- 关于后端 Entity Model Domain 的分界线
前言:在我们开发中经常用一种类型的值来接收来自Dao层的数据并将它传送给前端,或者作为逻辑处理,一般这种类型有三种 Entity Model Domain 我们该如何准确的应用这三种类型呢?这三 ...
- ftp:500 Illegal PORT command. 425
局域网用FTP命令访问外网的FTP SERVER,执行任何命令(如dir,ls,put,get)总是报下面的错误ftp:500 Illegal PORT command. 425ftp:Use POR ...
- windows使用natapp教程
这种免费的 有个缺点 过段时间就会连接不上,需要不定时更换域名地址 Linux系统参考:https://www.cnblogs.com/pxblog/p/10549847.html 官网地址:http ...
- 【LeetCode】962. Maximum Width Ramp 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调栈 日期 题目地址:https://leetco ...
- spoj-ORDERS - Ordering the Soldiers
ORDERS - Ordering the Soldiers As you are probably well aware, in Byteland it is always the military ...
- 第九届河南理工大学算法程序设计大赛 正式赛L:最优规划(最小生成树)
单测试点时限: 1.0 秒 内存限制: 512 MB 有很多城市之间已经建立了路径,但是有些城市之间没有路径联通.为了联通所有的城市,现在需要添加一些路径,为了节约,需要满足添加总路径是最短的. 输入 ...
- 为什么我的 WordPress 网站被封了?
今年以来,一系列 "清朗" "护苗" "净网" 专项整治行动重拳出击,"清朗·春节网络环境"取消备案网站平台2300余家 ...
- MLP-Mixer: An all-MLP Architecture for Vision
目录 概 主要内容 代码 Tolstlkhin I., Houlsby N., Kolesnikov A., Beyer L., Zhai X., Unterthiner T., Yung J., S ...
- Proximal Algorithms 5 Parallel and Distributed Algorithms
目录 问题的结构 consensus 更为一般的情况 Exchange 问题 Global exchange 更为一般的情况 Allocation Proximal Algorithms 这一节,介绍 ...