Я пытаюсь прочитать файл из hadoop с помощью API файловой системы, я могу подключить hadoop и прочитать файл, однако чтение файла содержит искаженные символы.
Ниже приведен код:
public class HdfsToInfaWriter{
public static void main(String[] args)
{
//FileUtil futil;
String hdfsuri=args[0];
//String src=args[1];
String localuri=args[1];
String hdusername=args[2];
byte[] buffer=new byte[30];
char c;
Configuration conf=new Configuration();
conf.addResource(new Path("file:///etc/hadoop/conf/core-site.xml"));
conf.addResource(new Path("file:///etc/hadoop/conf/hdfs-site.xml"));
conf.set("hadoop.security.authentication", "kerberos");
conf.set("fs.defaultFS",hdfsuri);
conf.set("fs.hdfs.impl",org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
conf.set("fs.file.impl",org.apache.hadoop.fs.LocalFileSystem.class.getName());
//futil.copy(srcFS, src, dst, deleteSource, conf)
try {
UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab("**************",
"********************");
}catch(IOException e){
e.printStackTrace();
}
System.setProperty("HADOOP_USER_NAME",hdusername);
System.setProperty("hadoop.home.dir","/");
FSDataInputStream in1 = null;
try{
FileSystem fs = FileSystem.get(URI.create(hdfsuri),conf);
Path hdfsreadpath=new Path(hdfsuri);
CompressionCodecFactory factory = new CompressionCodecFactory(conf);
System.out.println("the class for codec is " +factory.getCodec(hdfsreadpath));
File src1=new File(localuri);
System.out.println("before copy");
FileUtil.copy(fs, hdfsreadpath, src1, false, conf);
}}}
Когда я использую команду hdfs hdfs dfs -cat /bigdatahdfs/datamart/trial.txt
, данные в файле представляют собой простой текстовый файл.
Но когда я использую команду cat /home/trial1.txt
и копирую файл в локальную систему, вывод будет таким, как показано ниже:
▒▒▒1K▒; ▒▒ = ▒ <▒▒▒ & ▒▒▒ </p>
ПРИМЕЧАНИЕ. - Я также пытался использовать IOUtils API, выводто же самое.