Hadoop-读取数据的几种方式
2016-03-24 14:50
417 查看
1.Hadoop URL中读取数据
2.FileSystem读取数据
用的文本是一样的,所以读取出的数据也是一样的。
用FSDataInputStream代替InputStream
FileSystem.open()返回的实际上是FSDataInputStream,而不是标准的java.io类。
FSDataInputStream是DataInputStream的一个子类,支持随机访问,这样就可以从流的任意位置读取数据了。
注意:seek()是一个相对高开销的操作,需要谨慎使用。我们需要依靠流数据来构建应用访问模式(如使用MapReduce),而不是大量执行seek操作。
import java.io.IOException; import java.io.InputStream; import java.net.URL; import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; import org.apache.hadoop.io.IOUtils; public class URLReader { //重点。Java之所以能够识别Hadoop文件系统是URL的setURLStreamHandlerFactory设置成了FsUrlStreamHandlerFactory实例 //这种方法在java虚拟机中只能被调一次,因此一般都放在静态块中。 static{ URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); } public static void main(String[] args){ InputStream in =null; try { in=new URL("hdfs://master:9000/input/file2.txt").openStream(); IOUtils.copyBytes(in, System.out, 4096,false); } catch (IOException e) { e.printStackTrace(); }finally { IOUtils.closeStream(in); } } }
2.FileSystem读取数据
import java.io.InputStream; 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; public class FileSystemReader { public static void main(String[] args) throws Exception{ String uri="hdfs://master:9000/input/file2.txt"; Configuration conf=new Configuration(); FileSystem fs=FileSystem.get(URI.create(uri),conf); InputStream in=null; try{ in=fs.open(new Path(uri)); IOUtils.copyBytes(in, System.out, 4096,false); }finally{ IOUtils.closeStream(in); } } }
用的文本是一样的,所以读取出的数据也是一样的。
用FSDataInputStream代替InputStream
FileSystem.open()返回的实际上是FSDataInputStream,而不是标准的java.io类。
FSDataInputStream是DataInputStream的一个子类,支持随机访问,这样就可以从流的任意位置读取数据了。
import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; public class FSDataInputStreamReader { public static void main(String[] args) throws Exception{ String uri="hdfs://master:9000/input/file2.txt"; Configuration conf=new Configuration(); FileSystem fs=FileSystem.get(URI.create(uri),conf); FSDataInputStream in=null; try{ in=fs.open(new Path(uri)); IOUtils.copyBytes(in, System.out, 4096,false); //seek与skip不同之处是,并不只限定数据流当前位置之后,它可以移到文件中任意一个绝对位置。 //注意:如果seek定位大于文件长度的位置,会导致IOException异常。 in.seek(2); IOUtils.copyBytes(in, System.out, 4096,false); }finally{ IOUtils.closeStream(in); } } }
注意:seek()是一个相对高开销的操作,需要谨慎使用。我们需要依靠流数据来构建应用访问模式(如使用MapReduce),而不是大量执行seek操作。
相关文章推荐
- OptionParser命令参数介绍及使用
- Linux下Socket编程函数格式详解
- 禁止 一些地区的ip用户访问 网站
- Nginx限制某个IP同一时间段的访问次数
- Linux下date和timestamp互转
- 关于Activity无重写方法--菜单项onCreateOptionsMenu
- 机器学习基础(九)—— iterative optimization
- Copy List with Random Pointer
- mysql(5.7)在CentOs7下的安装、配置与应用
- Hadoop学习笔记: MapReduce二次排序
- linux 打开文件数 too many open files 解决方法
- 在Linux中设置共享目录
- CPU的内部架构和工作原理
- linux下安装java jdk后版本不对一例
- 学习网站
- 【原创】本地通过IIS设置开发的localhost网站的域名改为个性域名方法
- 机器学习基础(八)——感知机(iterative optimization)
- shell if else 用法 syntax error near unexpected token `then'
- linux服务器tomcat上传发布war包问题
- Apache 创建虚拟主机目录和设置默认访问页面