Hadoop文件系统操作之读取写入数据
2016-10-14 14:34
633 查看
一.从hadoop文件系统hdfs读取文件
读取hdfs文件有两种方法:
1.使用java.net.URL对象打开数据流,从中读取代码
要想让java程序能识别Hadoop的hdfs URL必须通过FsUrlStreamHandlerFactory实例调用java.net.URL对象的setURLStreamHandlerFactory方法,然而每个java虚拟机只能调用一次这个方法,这意味着如果如果程序的其他组件已经声明了一个URLStreamHandlerFactory对象,将无法用这种方法从hadoop读取文件
2.通过调用FileSystem API 读取数据
Configuration 对象封装了客户端或者服务端的配置
public static FileSystem.get(URI uri,Configuration conf)通过给定的URL来确定要使用的文件系统
Public FSDateInputStream open(Path f) throws IOException用来获取文件的输入流
FSDateInputStream类继承了Seekable接口和PositionedReadable接口,因此可以从流的随意位置读取数据,Seelable接口提供的seek()类是一个相对高开销的操作,需要谨慎使用
二.向hadoop文件系统hdfs写入数据
使用运行参数:"/home/hadoop/Desktop/1.txt" "hdfs://localhost/user/hadoop/output/1.txt"
程序在运行时可能会出现错误:
Exception in thread "main" java.net.ConnectException: Call From thewolf/127.0.1.1 to localhost:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
原因:是没有指定访问分布式文件系统的端口号:即配置文件里面设定的文件系统端口,执行程序会根据默认的8020端口去访问文件系统,而访问不到出现上述错误。
解决方法:指定访问hdfs的端口号(自己配置的端口号,我配置的是9000):更改运行参数为:"/home/hadoop/Desktop/1.txt" "hdfs://localhost:9000/user/hadoop/output/1.txt"
public FSDataOutputStream create(Path f) throws IOException 能够为需要写入切当前不存在的文件创建父文件目录,可先用exists()方法检查父目录是否存在;append()方法用于在一个已经存在的文件末尾追加数据
FSDataInputStream继承了借口Syncable,可用getPos()方法查询文件当前位置,但是FSDataInputStream类不允许在文件中定位,因为HDFS只允许对一个已打开文件顺序写入,或者在现有文件后面追加数据。
Progressable用于传递回调接口,每次Hadoop将64KB数据写入datanode管线后都会调用Progressable接口的progress
读取hdfs文件有两种方法:
1.使用java.net.URL对象打开数据流,从中读取代码
import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import org.apache.commons.compress.utils.IOUtils; import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; public class URLCat { static { URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); } public static void main(String [] args) throws MalformedURLException, IOException { try(InputStream in = new URL(args[0]).openStream();) { IOUtils.copy(in, System.out); } } }
要想让java程序能识别Hadoop的hdfs URL必须通过FsUrlStreamHandlerFactory实例调用java.net.URL对象的setURLStreamHandlerFactory方法,然而每个java虚拟机只能调用一次这个方法,这意味着如果如果程序的其他组件已经声明了一个URLStreamHandlerFactory对象,将无法用这种方法从hadoop读取文件
2.通过调用FileSystem API 读取数据
import java.io.*; import java.net.URI; import org.apache.commons.compress.utils.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class FileSystemCat { public static void main(String [] args) throws IOException { String uri = args[0]; Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(uri),conf); try(InputStream in = fs.open(new Path(uri))) { IOUtils.copy(in,System.out); //((FSDataInputStream) in).seek(0); //IOUtils.copy(in, System.out); } } }
Configuration 对象封装了客户端或者服务端的配置
public static FileSystem.get(URI uri,Configuration conf)通过给定的URL来确定要使用的文件系统
Public FSDateInputStream open(Path f) throws IOException用来获取文件的输入流
FSDateInputStream类继承了Seekable接口和PositionedReadable接口,因此可以从流的随意位置读取数据,Seelable接口提供的seek()类是一个相对高开销的操作,需要谨慎使用
二.向hadoop文件系统hdfs写入数据
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import org.apache.commons.compress.utils.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.util.Progressable; public class FileCopyWithProgress { public static void main(String[] args) throws IOException { String localsrc = args[0]; String dst = args[1]; InputStream in = new BufferedInputStream(new FileInputStream(localsrc)); Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(dst),conf); try (OutputStream out = fs.create(new Path(dst),new Progressable(){ public void progress() { System.out.print(".");//用于显示文件复制进度 } })) { IOUtils.copy(in, out); } } }
使用运行参数:"/home/hadoop/Desktop/1.txt" "hdfs://localhost/user/hadoop/output/1.txt"
程序在运行时可能会出现错误:
Exception in thread "main" java.net.ConnectException: Call From thewolf/127.0.1.1 to localhost:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
原因:是没有指定访问分布式文件系统的端口号:即配置文件里面设定的文件系统端口,执行程序会根据默认的8020端口去访问文件系统,而访问不到出现上述错误。
解决方法:指定访问hdfs的端口号(自己配置的端口号,我配置的是9000):更改运行参数为:"/home/hadoop/Desktop/1.txt" "hdfs://localhost:9000/user/hadoop/output/1.txt"
public FSDataOutputStream create(Path f) throws IOException 能够为需要写入切当前不存在的文件创建父文件目录,可先用exists()方法检查父目录是否存在;append()方法用于在一个已经存在的文件末尾追加数据
FSDataInputStream继承了借口Syncable,可用getPos()方法查询文件当前位置,但是FSDataInputStream类不允许在文件中定位,因为HDFS只允许对一个已打开文件顺序写入,或者在现有文件后面追加数据。
Progressable用于传递回调接口,每次Hadoop将64KB数据写入datanode管线后都会调用Progressable接口的progress
public interface Progressable { public void progress(); }
相关文章推荐
- Hadoop实验:按规则读取HDFS文件系统写入到本地
- Hadoop Core 学习笔记(一) SequenceFile文件写入和读取Writable数据
- 文件操作ofstream,open,close,ifstream,fin,按照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件
- 文件操作ofstream,open,close,ifstream,fin,依照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件
- ios开发系列之文件的写入读取,NSUserDefaults存储数据,NSFileManager操作文件和文件夹
- 表数据文件DBF的读取和写入操作
- Hadoop学习笔记——1.java读取Oracle中表的数据,创建新文件写入Hdfs
- 什么是沙盒模型?怎么写入、读取沙盒路径文件数据,哪些操作是属于私有api范畴
- java读写properties文件,解决系统找不到指定路径,解决写入后读取正常,但文件数据未更新问题
- Hadoop实验:按规则读取本地文件写入HDFS文件系统
- nodejs-操作文件系统读取写入文件
- Asp.Net 文件操作基类(读取,删除,批量拷贝,批量删除,写入)
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)(二)
- jsp文件操作(新建,删除,读取,写入)
- [导入]Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)(二)
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- [例题]VB操作Excel (1)[用VB创建一个xls文件][并向里面写入一个数据]
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)