Hadoop下将大量小文件生成一个sequenceFile文件
2013-06-26 16:51
330 查看
1)遇到的问题,因为是在集群上运行,代码中String seqFsUrl = "hdfs://localhost:9000/user/mjiang/target-seq/sdfgz.seq";的localhost错误,
于是老是出现连接不上的问题,(Retrying connect to server: localhost/127.0.0.1:8020. Already tried 0 time(s).)
所以运行程序时出现连接不上Hadoop的问题时,考虑是不是程序写错了。
2)sequenceFile中虽然是按文件名(或其他任何值)为键,文件内容为值来存储的。但用SequenceFileAsTextInputFormat来读取时,键值还是会被读到文件的第一行
没分析源码,不清楚原因
3)sequenceFile可以处理.gz文件(没有实验出不行,按说.gz文件是不可以分块存储的???逻辑上还是一个)
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.File;
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.io.NullWritable;
import org.apache.Hadoop.io.SequenceFile;
import org.apache.Hadoop.io.Text;
public class sequeneceFile{
public static void main(String[] args) throws IOException {
//String seqFsUrl = "hdfs://localhost:9000/user/mjiang/target-seq/sdfgz.seq";
String seqFsUrl = "user/mjiang/target-seq/sdfgz.seq";
Configuration conf = new Configuration();
//conf.set("fs.default.name", "hdfs://venus:9000");
//conf.set("Hadoop.job.user", "mjiang");
//conf.set("mapred.job.tracker", "venus:9001");
FileSystem fs = FileSystem.get(URI.create(seqFsUrl),conf);
Path seqPath = new Path(seqFsUrl);
//Text key = new Text();
Text value = new Text();
String filesPath = "/home/mjiang/java/eclipse/Hadoop/sequenceFile/data/sdfgz/";
File gzFilesDir = new File(filesPath);
String[] gzFiles = gzFilesDir.list();
int filesLen=gzFiles.length;
SequenceFile.Writer writer = null;
try {//返回一个SequenceFile.Writer实例 需要数据流和path对象 将数据写入了path对象
writer = SequenceFile.createWriter(fs, conf, seqPath,NullWritable.class, value.getClass());
//for (int i=0;i<2;i++){
while (filesLen>0){
File gzFile = new File(filesPath+gzFiles[filesLen-1]);
InputStream in = new BufferedInputStream(new FileInputStream(gzFile));
long len = gzFile.length();
byte[] buff = new byte[(int)len];
if ((len = in.read(buff))!= -1) {
value.set(buff);
writer.append(NullWritable.get(), value);//将每条记录追加到SequenceFile.Writer实例的末尾
}
//process
System.out.println(gzFiles[filesLen-1]);
//key.clear();
value.clear();
IOUtils.closeStream(in);
filesLen--;//!!
}
//filesLen = 2; }
} finally {
IOUtils.closeStream(writer);
}
}
}
于是老是出现连接不上的问题,(Retrying connect to server: localhost/127.0.0.1:8020. Already tried 0 time(s).)
所以运行程序时出现连接不上Hadoop的问题时,考虑是不是程序写错了。
2)sequenceFile中虽然是按文件名(或其他任何值)为键,文件内容为值来存储的。但用SequenceFileAsTextInputFormat来读取时,键值还是会被读到文件的第一行
没分析源码,不清楚原因
3)sequenceFile可以处理.gz文件(没有实验出不行,按说.gz文件是不可以分块存储的???逻辑上还是一个)
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.File;
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.io.NullWritable;
import org.apache.Hadoop.io.SequenceFile;
import org.apache.Hadoop.io.Text;
public class sequeneceFile{
public static void main(String[] args) throws IOException {
//String seqFsUrl = "hdfs://localhost:9000/user/mjiang/target-seq/sdfgz.seq";
String seqFsUrl = "user/mjiang/target-seq/sdfgz.seq";
Configuration conf = new Configuration();
//conf.set("fs.default.name", "hdfs://venus:9000");
//conf.set("Hadoop.job.user", "mjiang");
//conf.set("mapred.job.tracker", "venus:9001");
FileSystem fs = FileSystem.get(URI.create(seqFsUrl),conf);
Path seqPath = new Path(seqFsUrl);
//Text key = new Text();
Text value = new Text();
String filesPath = "/home/mjiang/java/eclipse/Hadoop/sequenceFile/data/sdfgz/";
File gzFilesDir = new File(filesPath);
String[] gzFiles = gzFilesDir.list();
int filesLen=gzFiles.length;
SequenceFile.Writer writer = null;
try {//返回一个SequenceFile.Writer实例 需要数据流和path对象 将数据写入了path对象
writer = SequenceFile.createWriter(fs, conf, seqPath,NullWritable.class, value.getClass());
//for (int i=0;i<2;i++){
while (filesLen>0){
File gzFile = new File(filesPath+gzFiles[filesLen-1]);
InputStream in = new BufferedInputStream(new FileInputStream(gzFile));
long len = gzFile.length();
byte[] buff = new byte[(int)len];
if ((len = in.read(buff))!= -1) {
value.set(buff);
writer.append(NullWritable.get(), value);//将每条记录追加到SequenceFile.Writer实例的末尾
}
//process
System.out.println(gzFiles[filesLen-1]);
//key.clear();
value.clear();
IOUtils.closeStream(in);
filesLen--;//!!
}
//filesLen = 2; }
} finally {
IOUtils.closeStream(writer);
}
}
}
相关文章推荐
- Hadoop下将大量小文件生成一个sequenceFile文件
- hadoop生成序列化文件(SequenceFile)的程序
- hadoop下将大量小文件生成一个sequenceFile文件
- spark中saveAsTextFile如何最终生成一个文件
- Hadoop使用CombineFileInputFormat处理大量小文件接口实现(Hadoop-1.0.4)
- xcode 下创建文件夹,并在文件夹下创建文件时没有弹出选择界面,直接生成了一个 file
- SequenceFile 解决hadoop小文件问题
- Object-C 如何生成一个固定大小的File,文件存储到指定的路径下
- Hadoop Core 学习笔记(一) SequenceFile文件写入和读取Writable数据
- Hadoop 写SequenceFile文件 源代码
- Hadoop序列化文件SequenceFile
- hadoop序列文件读与写 (SequenceWriteReadFile)
- hadoop编程小技巧(6)---处理大量小数据文件CombineFileInputFormat应用
- 每小时自动生成一个SQL Server Profiler文件(Auto Generate an Hourly SQL Server Profiler Trace File)
- Hadoop Core 学习笔记(一) SequenceFile文件写入和读取Writable数据
- Hadoop 写SequenceFile文件 源代码
- Hadoop中CombineFileInputFormat详解——处理大量小文件
- C# winform应用程序运行后,bin文件夹中会自动生成3个文件和一个应用程序
- 一个简单生成Excel文件格式的java包。
- 用jsp<html:file>实现一个文件上传的例子,而且有验证