设为首页 收藏本站
查看: 1154|回复: 0

[经验分享] Hadoop初学指南(4)--使用java操作HDFS

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-5-3 16:31:13 | 显示全部楼层 |阅读模式
本文主要介绍了如何使用java的api来对HDFS进行操作。

(1)URL方式访问Hadoop中的文件
①为了方便修改本机C盘的windows/system32/drivers/etc下的hosts文件
wKioL1NfE_PAMDWYAAAYvU7xfDE055.jpg
前一个为虚拟机的ip地址,后一个为虚拟机的主机名
②打开eclipse,新建一个Java工程,在src下建立一个hdfs的文件夹
wKiom1NfFJTgpd-oAACWB3ivTvk343.jpg
③导入hadoop-1.1.2源码包中主目录以及lib目录中的jar包
④新建一个java类,这里命令为App1
wKiom1NfFb7RNqtaAABiL9AaOU4520.jpg
⑤开始编程
代码如下:


package hdfs;
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
public class App1 {
    static final String PATH="hdfs://myhadoop:9000/hello";

    public static void main(String[] args) throws Exception{
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
        URL url = new URL(PATH);
        InputStream in =url.openStream();
        IOUtils.copyBytes(in, System.out, 1024, true);

    }
}
这里IOUtils中的四个参数分别表示输入流,输出流,缓存大小以及在传输结束后是否关闭流。
代码写完后执行即可看到HDFS中/hello的内容:
wKioL1NfFqSDsofzAACJOAXENhg701.jpg
这是直接用shell查看/hello的内容:
wKioL1NfFvLDld43AABhJR8XMh0060.jpg
内容完全一致。

(2)利用hadoop自身的api进行操作
如果涉及到上传,创建,删除等操作,那么URL的方式就显得力不从心了,这时就需要用到hadoop自身提供的api进行操作。

在操作之前需要建立一个跟HDFS连接的FileSystem:
static final String PATH="hdfs://myhadoop:9000/";
FileSystem fileSystem = FileSystem.get(new URI(PATH),new Configuration());
创建完这个FileSystem之后,就可以用这个FileSystem进行操作
①创建文件夹
代码如下:

fileSystem.mkdirs(new Path("/d1"));
可以看见/d1文件夹已经创建好了。
wKiom1NfH5fCOiiyAADO8eHjkA8157.jpg
②删除文件夹
代码如下:
fileSystem.delete(new Path("/d1"),true);
这里要注意一下第二个参数,如果第一个参数为目录,那么此时必须为true;如果第一个参数为文件,那么true和false都可以。
③上传文件
代码如下:


FSDataOutputStream out = fileSystem.create(new Path("/d1/hello"));
FileInputStream in = new FileInputStream("H:/readme.txt");
IOUtils.copyBytes(in, out, 1024,true);

上传完成之后,查看/d1下的hello内容如下:

wKiom1NfIcPAYYYfAAByXoJ8EiE852.jpg

④下载文件
FSDataInputStream in1 = fileSystem.open(new Path("/d1/hello"));

IOUtils.copyBytes(in1, System.out, 1024,true);
这里的out可以指定到本地硬盘,这里演示就直接输出到控制台了:
wKioL1NfIfnBorNnAACIlWKPKIo383.jpg
⑤浏览文件夹
代码如下:
FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));
for (FileStatus fileStatus : listStatus) {
        String isDir=fileStatus.isDir()?"文件夹":"文件";
        String permission = fileStatus.getPermission().toString();
        short replication = fileStatus.getReplication();//副本数
        long len = fileStatus.getLen();
        String path = fileStatus.getPath().toString();
        System.out.println(isDir+"        "+permission+"        "+replication+"        "+len+"        "+path);
}

这里的permission表示权限,replication表示副本数,len表示长度,path表示路径,结果如下:

wKiom1NfItfCGjcxAAEtJMnAMQY155.jpg
当然,可以看到,这里不支持递归查询。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-18518-1-1.html 上篇帖子: Hadoop初学指南(3)--HDFS的体系结构 下篇帖子: Hadoop初学指南(5)--MapReduce入门
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表