本项目主要实现Windows下利用代码实现Hadoop中文件上传至HDFS

实现上传文本文件中单词个数的计数

1、项目结构

2、相关代码

    1. CopyFromLocalFile
  1. 1 package com.hadoop.worldcount;
  2. 2
  3. 3 import java.io.FileInputStream;
  4. 4
  5. 5 import java.io.IOException;
  6. 6
  7. 7 import org.apache.hadoop.conf.Configuration;
  8. 8
  9. 9 import org.apache.hadoop.fs.FSDataOutputStream;
  10. 10
  11. 11 import org.apache.hadoop.fs.FileSystem;
  12. 12
  13. 13 import org.apache.hadoop.fs.Path;
  14. 14
  15. 15 public class CopyFromLocalFile {
  16. 16
  17. 17 /**
  18. 18
  19. 19 * 判断路径是否存在
  20. 20
  21. 21 */
  22. 22
  23. 23 public static boolean test(Configuration conf, String path) {
  24. 24
  25. 25 try (FileSystem fs = FileSystem.get(conf)) {
  26. 26
  27. 27 return fs.exists(new Path(path));
  28. 28
  29. 29 } catch (IOException e) {
  30. 30
  31. 31
  32. 32
  33. 33 e.printStackTrace();
  34. 34
  35. 35 return false;
  36. 36
  37. 37 }
  38. 38
  39. 39
  40. 40
  41. 41 }
  42. 42
  43. 43 /**
  44. 44
  45. 45
  46. 46
  47. 47 * 复制文件到指定路径 若路径已存在,则进行覆盖
  48. 48
  49. 49
  50. 50
  51. 51 */
  52. 52
  53. 53
  54. 54
  55. 55 public static void copyFromLocalFile(Configuration conf,
  56. 56
  57. 57 String localFilePath, String remoteFilePath) {
  58. 58
  59. 59 Path localPath = new Path(localFilePath);
  60. 60
  61. 61 Path remotePath = new Path(remoteFilePath);
  62. 62
  63. 63 try (FileSystem fs = FileSystem.get(conf)) {
  64. 64
  65. 65 /* fs.copyFromLocalFile 第一个参数表示是否删除源文件,第二个参数表示是否覆盖 */
  66. 66
  67. 67 fs.copyFromLocalFile(false, true, localPath, remotePath);
  68. 68
  69. 69 } catch (IOException e) {
  70. 70
  71. 71 e.printStackTrace();
  72. 72
  73. 73 }
  74. 74
  75. 75 }
  76. 76
  77. 77
  78. 78
  79. 79 /**
  80. 80
  81. 81
  82. 82
  83. 83 * 追加文件内容
  84. 84
  85. 85
  86. 86
  87. 87 */
  88. 88
  89. 89
  90. 90
  91. 91 public static void appendToFile(Configuration conf, String localFilePath,
  92. 92
  93. 93 String remoteFilePath) {
  94. 94
  95. 95 Path remotePath = new Path(remoteFilePath);
  96. 96
  97. 97 try (FileSystem fs = FileSystem.get(conf);
  98. 98
  99. 99 FileInputStream in = new FileInputStream(localFilePath);) {
  100. 100
  101. 101 FSDataOutputStream out = fs.append(remotePath);
  102. 102
  103. 103 byte[] data = new byte[1024];
  104. 104
  105. 105 int read = -1;
  106. 106
  107. 107 while ((read = in.read(data)) > 0) {
  108. 108
  109. 109 out.write(data, 0, read);
  110. 110
  111. 111 }
  112. 112
  113. 113 out.close();
  114. 114
  115. 115 } catch (IOException e) {
  116. 116
  117. 117 e.printStackTrace();
  118. 118
  119. 119 }
  120. 120
  121. 121 }
  122. 122
  123. 123
  124. 124
  125. 125 /**
  126. 126
  127. 127
  128. 128
  129. 129 * 主函数
  130. 130
  131. 131
  132. 132
  133. 133 */
  134. 134
  135. 135
  136. 136
  137. 137 public static void main(String[] args) {
  138. 138
  139. 139 Configuration conf = new Configuration();
  140. 140
  141. 141 conf.set("fs.defaultFS", "hdfs://localhost:9000");
  142. 142
  143. 143 String localFilePath = "/usr/hadoop/test/test.txt"; // 本地路径
  144. 144
  145. 145 String remoteFilePath = "/user/hadoop/test/test.txt"; // HDFS路径
  146. 146
  147. 147 String choice = "append"; // 若文件存在则追加到文件末尾
  148. 148
  149. 149 //String choice = "overwrite"; // 若文件存在则覆盖
  150. 150
  151. 151 try {
  152. 152
  153. 153 /* 判断文件是否存在 */
  154. 154
  155. 155 boolean fileExists = false;
  156. 156
  157. 157 if (CopyFromLocalFile.test(conf, remoteFilePath)) {
  158. 158
  159. 159 fileExists = true;
  160. 160
  161. 161 System.out.println(remoteFilePath + " 已存在.");
  162. 162
  163. 163 } else {
  164. 164
  165. 165 System.out.println(remoteFilePath + " 不存在.");
  166. 166
  167. 167 }
  168. 168
  169. 169 /* 进行处理 */
  170. 170
  171. 171 if (!fileExists) { // 文件不存在,则上传
  172. 172
  173. 173 CopyFromLocalFile.copyFromLocalFile(conf, localFilePath,
  174. 174
  175. 175 remoteFilePath);
  176. 176
  177. 177 System.out.println(localFilePath + " 已上传至 " + remoteFilePath);
  178. 178
  179. 179 } else if (choice.equals("overwrite")) { // 选择覆盖
  180. 180
  181. 181 CopyFromLocalFile.copyFromLocalFile(conf, localFilePath,
  182. 182
  183. 183 remoteFilePath);
  184. 184
  185. 185 System.out.println(localFilePath + " 已覆盖 " + remoteFilePath);
  186. 186
  187. 187 } else if (choice.equals("append")) { // 选择追加
  188. 188
  189. 189 CopyFromLocalFile.appendToFile(conf, localFilePath,
  190. 190
  191. 191 remoteFilePath);
  192. 192
  193. 193 System.out.println(localFilePath + " 已追加至 " + remoteFilePath);
  194. 194
  195. 195 }
  196. 196
  197. 197 } catch (Exception e) {
  198. 198
  199. 199
  200. 200
  201. 201 e.printStackTrace();
  202. 202
  203. 203 }
  204. 204
  205. 205 }
  206. 206
  207. 207 }
  • File
  1. package com.hadoop.worldcount;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.FileInputStream;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.net.URI;
  8.  
  9. import org.apache.hadoop.conf.Configuration;
  10. import org.apache.hadoop.fs.FileSystem;
  11. import org.apache.hadoop.fs.Path;
  12. import org.apache.hadoop.io.IOUtils;
  13. import org.apache.hadoop.util.Progressable;
  14.  
  15. public class File {
  16.  
  17. /**
  18. * @param args
  19. * @throws IOException
  20. */
  21.  
  22. public static void main(String[] args) throws Exception {
  23. String localSrc = "E:\\Hadoop\\work\\bashrc.txt";//本地文件
  24. String dst = "hdfs://localhost:9000/user/hadoop/test/bashrc.txt";//复制到hdfs目录下
  25. InputStream in = new BufferedInputStream(new FileInputStream(localSrc));
  26. Configuration conf = new Configuration();
  27. FileSystem fs = FileSystem.get(URI.create(dst), conf);
  28. OutputStream out = fs.create(new Path(dst), new Progressable() {//进度条信息
  29. public void progress() {
  30. System.out.print(".");
  31. }
  32. });
  33. IOUtils.copyBytes(in, out, 4096, true);//复制
  34. }
  35. }
  • MyWordCount
  1. 1 package com.hadoop.worldcount;
  2. 2
  3. 3 import java.io.IOException;
  4. 4 import java.util.StringTokenizer;
  5. 5 import org.apache.hadoop.conf.Configuration;
  6. 6 import org.apache.hadoop.fs.Path;
  7. 7 import org.apache.hadoop.io.IntWritable;
  8. 8 import org.apache.hadoop.io.LongWritable;
  9. 9 import org.apache.hadoop.io.Text;
  10. 10 import org.apache.hadoop.mapreduce.Job;
  11. 11 import org.apache.hadoop.mapreduce.Mapper;
  12. 12 import org.apache.hadoop.mapreduce.Reducer;
  13. 13 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  14. 14 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  15. 15
  16. 16 public class MyWordCount {
  17. 17
  18. 18 public static class TokenizerMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
  19. 19 /**
  20. 20 * Mapper中的map方法:
  21. 21 * void map(K1 key, V1 value, Context context)
  22. 22 * 映射一个单个的输入k/v对到一个中间的k/v对
  23. 23 * 输出对不需要和输入对是相同的类型,输入对可以映射到0个或多个输出对。
  24. 24 * Context:收集Mapper输出的<k,v>对。
  25. 25 * Context的write(k, v)方法:增加一个(k,v)对到context
  26. 26 * 程序员主要编写Map和Reduce函数.这个Map函数使用StringTokenizer函数对字符串进行分隔,通过write方法把单词存入word中
  27. 27 * write方法存入(单词,1)这样的二元组到context中
  28. 28 */
  29. 29 @Override
  30. 30 protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
  31. 31 throws IOException, InterruptedException {
  32. 32 StringTokenizer itr = new StringTokenizer(value.toString());
  33. 33 while (itr.hasMoreTokens()) {
  34. 34 context.write(new Text(itr.nextToken()), new IntWritable(1));
  35. 35 }
  36. 36 }
  37. 37 }
  38. 38
  39. 39 public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
  40. 40 /**
  41. 41 * Reducer类中的reduce方法:
  42. 42 * void reduce(Text key, Iterable<IntWritable> values, Context context)
  43. 43 * 中k/v来自于map函数中的context,可能经过了进一步处理(combiner),同样通过context输出
  44. 44 */
  45. 45 @Override
  46. 46 protected void reduce(Text key, Iterable<IntWritable> values,
  47. 47 Context context) throws IOException, InterruptedException {
  48. 48 int sum = 0;
  49. 49 for (IntWritable val : values) {
  50. 50 sum += val.get();
  51. 51 }
  52. 52 context.write(key, new IntWritable(sum));
  53. 53 }
  54. 54 }
  55. 55
  56. 56 public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
  57. 57 /**
  58. 58 * Configuration:map/reduce的j配置类,向hadoop框架描述map-reduce执行的工作
  59. 59 */
  60. 60 Configuration conf = new Configuration();
  61. 61 Job job = Job.getInstance(conf, "myWordCount"); //设置一个用户定义的job名称
  62. 62 job.setJarByClass(MyWordCount.class);
  63. 63 job.setMapperClass(TokenizerMapper.class); //为job设置Mapper类
  64. 64 job.setCombinerClass(IntSumReducer.class); //为job设置Combiner类
  65. 65 job.setReducerClass(IntSumReducer.class); //为job设置Reducer类
  66. 66 job.setOutputKeyClass(Text.class); //为job的输出数据设置Key类
  67. 67 job.setOutputValueClass(IntWritable.class); //为job输出设置value类
  68. 68
  69. 69 FileInputFormat.addInputPath(job, new Path("hdfs://localhost:9000/user/root/input/bashrc.txt"));
  70. 70 FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000/user/root/output"));
  71. 71
  72. 72 System.exit(job.waitForCompletion(true) ?0 : 1); //运行job
  73. 73 }
  74. 74
  75. 75 }

Hadoop 代码实现文件上传的更多相关文章

  1. Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (3)

    接上篇 Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (2) 7. 使用配置文件指定监听地址 打开 appsettings.json 文件,加入一行 "UseUrls&q ...

  2. django中使用FastDFS分布式文件系统接口代码实现文件上传、下载、更新、删除

    运维使用docker部署好之后FastDFS分布式文件系统之后,提供给我接口如下: fastdfs tracker 192.168.1.216 192.168.1.217 storage 192.16 ...

  3. Java代码实现文件上传(转载)

    刚刚发表了一篇Java发送电子邮件,以前真是没注意,commons里这么多常用项目,惭愧呀,直到现在回顾;要学习的真是太多了,还是缺少真正的学习能力... 这里用到的是commons-fileuplo ...

  4. Springboot 一行代码实现文件上传 20个平台!少写代码到极致

    大家好,我是小富~ 技术交流,公众号:程序员小富 又是做好人好事的一天,有个小可爱私下问我有没有好用的springboot文件上传工具,这不巧了嘛,正好我私藏了一个好东西,顺便给小伙伴们也分享一下,d ...

  5. 【Hadoop】hdfs文件上传流程图

  6. java代码实现ftp服务器的文件上传和下载

    java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools   工具类: ...

  7. Ceph RGW服务 使用s3 java sdk 分片文件上传API 报‘SignatureDoesNotMatch’ 异常的定位及规避方案

    import java.io.File;   import com.amazonaws.AmazonClientException; import com.amazonaws.auth.profile ...

  8. Java中实现文件上传下载的三种解决方案

    第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null ...

  9. 十六、Struts2文件上传与下载

    文件上传与下载 1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post& ...

随机推荐

  1. dart系列之:安全看我,dart中的安全特性null safety

    目录 简介 Non-nullable类型 Nullable List Of Strings 和 List Of Nullable Strings !操作符 late关键字 总结 简介 在Dart 2. ...

  2. 关于后端 Entity Model Domain 的分界线

    前言:在我们开发中经常用一种类型的值来接收来自Dao层的数据并将它传送给前端,或者作为逻辑处理,一般这种类型有三种 Entity  Model  Domain  我们该如何准确的应用这三种类型呢?这三 ...

  3. ftp:500 Illegal PORT command. 425

    局域网用FTP命令访问外网的FTP SERVER,执行任何命令(如dir,ls,put,get)总是报下面的错误ftp:500 Illegal PORT command. 425ftp:Use POR ...

  4. windows使用natapp教程

    这种免费的 有个缺点 过段时间就会连接不上,需要不定时更换域名地址 Linux系统参考:https://www.cnblogs.com/pxblog/p/10549847.html 官网地址:http ...

  5. 【LeetCode】962. Maximum Width Ramp 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调栈 日期 题目地址:https://leetco ...

  6. spoj-ORDERS - Ordering the Soldiers

    ORDERS - Ordering the Soldiers As you are probably well aware, in Byteland it is always the military ...

  7. 第九届河南理工大学算法程序设计大赛 正式赛L:最优规划(最小生成树)

    单测试点时限: 1.0 秒 内存限制: 512 MB 有很多城市之间已经建立了路径,但是有些城市之间没有路径联通.为了联通所有的城市,现在需要添加一些路径,为了节约,需要满足添加总路径是最短的. 输入 ...

  8. 为什么我的 WordPress 网站被封了?

    今年以来,一系列 "清朗" "护苗" "净网" 专项整治行动重拳出击,"清朗·春节网络环境"取消备案网站平台2300余家 ...

  9. MLP-Mixer: An all-MLP Architecture for Vision

    目录 概 主要内容 代码 Tolstlkhin I., Houlsby N., Kolesnikov A., Beyer L., Zhai X., Unterthiner T., Yung J., S ...

  10. Proximal Algorithms 5 Parallel and Distributed Algorithms

    目录 问题的结构 consensus 更为一般的情况 Exchange 问题 Global exchange 更为一般的情况 Allocation Proximal Algorithms 这一节,介绍 ...