HDFS实际应用场景之文件合并
来源:互联网 发布:qq群发软件sudm 编辑:程序博客网 时间:2024/05/16 07:02
①场景:合并小文件存放到HDFS上,列如,当需要分析来自许多服务其的Apache日志时,各个日志文件可能比较小,然而Hadoop更合适处理大文件,效率会更高,此时就需要合并分散文件。如果先将所有文件合并,在复制上传到HDFS上的话,需要占用用本地计算机的大量磁盘空间。采取在向HDFS复制上传文件的过程中将小文件进行合并,效果会更好。②开发程序
开发一个PutMerge程序,用于将合并文件后放入HDFS。
③命令getmerge
用于将一组HDFS文件在复制到本地计算机一起合并。
1)hadoop fs -put dataout1 daout daout6 /tmp
//将多个文件夹上同时传到HDFS /tmp目录下
2)hadoop fs -put trade_info.txt datain /sort1
//将trade_info.txt和datain文件同时上传到/sort1下
3)hadoop fs -getmerge /sort1 /root/yunfan1
//将这几个文件合并为一个文件
代码实现
文件的上传和下载就是字节字符流的读写操作。
读文件:输入流–>read
写文件:输出流 –>write
分析:
localFileSystem(本地)中的许多小文件上传到(合并)到HDFS
①本地每个文件打开输入流进行读取内容
②HDFS文件打开输出流,进行内容写入
③循环操作
④关闭流
public class PutMerge { /** * * @param LocalDir * 本地要上传的文件目录 * @param hdfsFile * HDFS上的文件名称,包括路径 * @throws Exception */ public static void put(String localDir,String hdfsFile) throws Exception{ //获取配置信息 Configuration conf = new Configuration(); //本地路径 Path localPath = new Path(localDir); //HDFS路径 Path hdfsPath = new Path(hdfsFile); //获取本地文件系统 FileSystem localFs = FileSystem.getLocal(conf); //获取HDFS FileSystem hdfs = FileSystem.get(conf); //本地文件系统中指定目录中所有文件 FileStatus[] status = localFs.listStatus(localPath); //打开HDFS文件的输出流 FSDataOutputStream fsDataOutputStream = hdfs.create(hdfsPath); //循环遍历本地文件 for(FileStatus fileStatus : status){ Path path = fileStatus.getPath(); System.out.println("文件为:" + path.getName()); //打开文件输入流 FSDataInputStream fsDataInputStream = localFs.open(path); //进行流的读写操作 byte[] buffer = new byte[1024]; int len =0; while((len = fsDataInputStream.read(buffer)) > 0 ){ fsDataOutputStream.write(buffer, 0, len); } //关闭输入流 fsDataInputStream.close(); } } public static void main(String[] args) throws Exception { String localDir = "F://hukairan1"; String hdfsFile = "hdfs://192.168.8.90:9000/nihao"; put(localDir,hdfsFile);
遇到的问题:类似:1.Exception in thread “main” java.lang.IllegalArgumentException: Wrong FS: hdfs://192.168.130.54:9000/user/hmail/output/part-00000, expected: file:///
2.
最后解决办法:1.hadoop需要把集群上的core-site.xml和hdfs-site.xml放到当前工程下。eclipse工作目录的bin文件夹下面。因为是访问远程的HDFS 需要通过URI来获得FileSystem.
2.弄清楚输入流和输出流。本来是关闭输入流fsDataInputStream.close();,结果我写错了fsDataOutputStream.close();
3.对于问题:eclipse看不到工程里面的bin目录看不到工程里面的bin目录及bin目录里面的class文件的解决办法是window->show view->navigator:
- HDFS实际应用场景之文件合并
- [Hadoop] 实际应用场景之 - 阿里
- [Hadoop] 实际应用场景之 - 百度
- [Hadoop] 实际应用场景之 - 百度
- [Hadoop] 实际应用场景之 - 阿里
- Redis实际应用场景
- Redis实际应用场景
- redis实际场景应用
- CountDownLatch实际应用场景
- HDFS应用场景分析
- HDFS文件的合并
- 合并 hdfs 文件
- HDFS文件合并问题
- HDFS合并文件
- hdfs 小文件合并
- Scala的实际应用场景
- Nosql的实际应用场景
- java Hashcode实际应用场景
- Qt的.pro工程文件语法学习
- 通过MSP430F1232最小系统测试单片机AD10程序
- java基础学习
- lamp环境安装(ubuntu)
- Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
- HDFS实际应用场景之文件合并
- Android为什么选择binder
- 关于键值编码(KVC)的介绍(ios)
- Framework层Ril控制流程分析
- 一个文本翻译工具的实现
- [图]图的邻接矩阵下的深搜广搜(超级简单写法)
- SVM(三),支持向量机,线性不可分和核函数
- 双向认证SSL原理
- C#委托与事件,通俗易懂详细解释