[HADOOP] Hadoop 2.0 API를 사용하여 Sequencefile 읽기 및 쓰기
HADOOPHadoop 2.0 API를 사용하여 Sequencefile 읽기 및 쓰기
시퀀스 파일을 읽고 쓰는 데 새 API를 사용하는 예제를 찾고 있습니다.
효과적으로 이러한 함수를 사용하는 방법을 알아야합니다.
createWriter(Configuration conf, org.apache.hadoop.io.SequenceFile.Writer.Option... opts)
이전 정의가 저를 위해 작동하지 않습니다 :
SequenceFile.createWriter( fs, conf, path, key.getClass(), value.getClass());
비슷하게 나는 다음과 같이 Sequence 파일을 읽는 코드가 무엇인지 알아야한다.
SequenceFile.Reader(fs, path, conf);
여기 같은 것을 사용하는 방법입니다 -
String uri = args[0];
Configuration conf = new Configuration();
Path path = new Path( uri);
IntWritable key = new IntWritable();
Text value = new Text();
CompressionCodec Codec = new GzipCodec();
SequenceFile.Writer writer = null;
Option optPath = SequenceFile.Writer.file(path);
Option optKey = SequenceFile.Writer.keyClass(key.getClass());
Option optVal = SequenceFile.Writer.valueClass(value.getClass());
Option optCom = SequenceFile.Writer.compression(CompressionType.RECORD, Codec);
writer = SequenceFile.createWriter( conf, optPath, optKey, optVal, optCom);
해결법
-
==============================
1.
public class SequenceFilesTest { @Test public void testSeqFileReadWrite() throws IOException { Configuration conf = new Configuration(); FileSystem fs = FileSystem.getLocal(conf); Path seqFilePath = new Path("file.seq"); SequenceFile.Writer writer = SequenceFile.createWriter(conf, Writer.file(seqFilePath), Writer.keyClass(Text.class), Writer.valueClass(IntWritable.class)); writer.append(new Text("key1"), new IntWritable(1)); writer.append(new Text("key2"), new IntWritable(2)); writer.close(); SequenceFile.Reader reader = new SequenceFile.Reader(conf, Reader.file(seqFilePath)); Text key = new Text(); IntWritable val = new IntWritable(); while (reader.next(key, val)) { System.err.println(key + "\t" + val); } reader.close(); } }
-
==============================
2.나는 1 년 넘게 답변을 하긴했지만 하둡 2.4.1부터 시작했습니다. :)
나는 1 년 넘게 답변을 하긴했지만 하둡 2.4.1부터 시작했습니다. :)
아래 코드는 누군가 유용 할 수 있습니다.
참고 : 여기에는 시퀀스 파일을 읽고 쓰는 주석 처리 된 1.x 코드가 포함됩니다. 어디서 파일 시스템을 선택하는지 궁금 해서요.하지만 클러스터에서 직접 실행했을 때 제대로 선택했습니다 (아마도 Configuration에서 언급 한 core-site.xml에서 알 수 있습니다).
import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.BytesWritable; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.SequenceFile; import org.apache.hadoop.io.SequenceFile.Reader.Option; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.Writable; import org.apache.hadoop.util.ReflectionUtils; public class SequenceFileOperator { private Configuration conf = new Configuration(); /*private FileSystem fs; { try { fs = FileSystem.get(URI.create("hdfs://cldx-1336-1202:9000"), conf); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }*/ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub if (args == null || args.length < 2) { System.out .println("Following are the possible invocations <operation id> <arg1> <arg2> ..."); System.out .println("1 <absolute path of directory containing documents> <HDFS path of the sequence file"); System.out.println("2 <HDFS path of the sequence file>"); return; } int operation = Integer.valueOf(args[0]); SequenceFileOperator docToSeqFileWriter = new SequenceFileOperator(); switch (operation) { case 1: { String docDirectoryPath = args[1]; String sequenceFilePath = args[2]; System.out.println("Writing files present at " + docDirectoryPath + " to the sequence file " + sequenceFilePath); docToSeqFileWriter.loadDocumentsToSequenceFile(docDirectoryPath, sequenceFilePath); break; } case 2: { String sequenceFilePath = args[1]; System.out.println("Reading the sequence file " + sequenceFilePath); docToSeqFileWriter.readSequenceFile(sequenceFilePath); break; } } } private void readSequenceFile(String sequenceFilePath) throws IOException { // TODO Auto-generated method stub /* * SequenceFile.Reader sequenceFileReader = new SequenceFile.Reader(fs, * new Path(sequenceFilePath), conf); */ Option filePath = SequenceFile.Reader.file(new Path(sequenceFilePath)); SequenceFile.Reader sequenceFileReader = new SequenceFile.Reader(conf, filePath); Writable key = (Writable) ReflectionUtils.newInstance( sequenceFileReader.getKeyClass(), conf); Writable value = (Writable) ReflectionUtils.newInstance( sequenceFileReader.getValueClass(), conf); try { while (sequenceFileReader.next(key, value)) { System.out .printf("[%s] %s %s \n", sequenceFileReader.getPosition(), key, value.getClass()); } } finally { IOUtils.closeStream(sequenceFileReader); } } private void loadDocumentsToSequenceFile(String docDirectoryPath, String sequenceFilePath) throws IOException { // TODO Auto-generated method stub File docDirectory = new File(docDirectoryPath); if (!docDirectory.isDirectory()) { System.out .println("Please provide an absolute path of a directory that contains the documents to be added to the sequence file"); return; } /* * SequenceFile.Writer sequenceFileWriter = * SequenceFile.createWriter(fs, conf, new Path(sequenceFilePath), * Text.class, BytesWritable.class); */ org.apache.hadoop.io.SequenceFile.Writer.Option filePath = SequenceFile.Writer .file(new Path(sequenceFilePath)); org.apache.hadoop.io.SequenceFile.Writer.Option keyClass = SequenceFile.Writer .keyClass(Text.class); org.apache.hadoop.io.SequenceFile.Writer.Option valueClass = SequenceFile.Writer .valueClass(BytesWritable.class); SequenceFile.Writer sequenceFileWriter = SequenceFile.createWriter( conf, filePath, keyClass, valueClass); File[] documents = docDirectory.listFiles(); try { for (File document : documents) { RandomAccessFile raf = new RandomAccessFile(document, "r"); byte[] content = new byte[(int) raf.length()]; raf.readFully(content); sequenceFileWriter.append(new Text(document.getName()), new BytesWritable(content)); raf.close(); } } finally { IOUtils.closeStream(sequenceFileWriter); } } }
-
==============================
3.독서 용으로 사용할 수 있습니다.
독서 용으로 사용할 수 있습니다.
Path path= new Path("/bar"); Reader sequenceFileReader = new SequenceFile.Reader(conf,SequenceFile.Reader.file(path));
-
==============================
4.SequenceFile을 입력 형식으로 설정해야합니다.
SequenceFile을 입력 형식으로 설정해야합니다.
job.setInputFormatClass(SequenceFileInputFormat.class);
여기서 SeequnceFile 형식의 HDFS를 읽는 예제를 찾을 수 있습니다.
from https://stackoverflow.com/questions/16070587/reading-and-writing-sequencefile-using-hadoop-2-0-apis by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 어떤 기준으로지도 제작 프레임 워크가 결합기를 시작할지 여부를 결정합니다. (0) | 2019.06.06 |
---|---|
[HADOOP] Hbase 클라이언트가 원격 Hbase 서버에 연결할 수 없습니다. (0) | 2019.06.06 |
[HADOOP] Hadoop namenode : 단일 장애 지점 (0) | 2019.06.06 |
[HADOOP] $ HADOOP_HOME은 더 이상 사용되지 않습니다. (0) | 2019.06.06 |
[HADOOP] 하둡 :«오류 : JAVA_HOME이 설정되지 않았습니다» (0) | 2019.06.06 |