分享

谁能给个用hdfs实现文件存储的例子啊

xukunddp 发表于 2013-10-25 10:44:26 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 9 8867
我想用hdfs实现文件的存储,用户可以上传或下载图片、音乐、视频等。
是不是单个文件小于64M简单些吗?大于64M会困难很多吗吗?
最好能给个实际实现的例子啊,或者实现的方法也行啊。
向各位大侠请教了,望不吝赐教啊,谢谢!:)

已有(9)人评论

跳转到指定楼层
nextuser 发表于 2013-10-25 10:44:26
我来简单说说我的感受吧。
1、hdfs可以存放数据文件(文本、图片等),你可以编写代码来实现将文件上传到HDFS中。一般来说可以采用org.apache.hadoop.fs.FileSystem类中的copyFromLocalFile方法(里面有很多方法,自己可以关注一下)
2、你说的64M是HDFS默认的block的size,这个是可以设置的,一般来说,上传的文件要大于block size,否则入进的数据就是小数据文件。hadoop对小文件的处理比较麻烦,但是也可以做。
3、贴个代码,就是入数据文件的方法,比较粗糙,你凑合看看吧
[ol]
  • /**
  •          * 移动本地文件到hdfs文件系统中
  •          *
  •          * @param src
  •          * @param dst
  •          */
  •         public static void copyFromLocalFileToHDFS(String src, String dst) {
  •                 Configuration conf = new Configuration();
  •                 FileSystem fs = null;
  •                 try {
  •                         fs = FileSystem.get(conf);
  •                         Path srcPath = new Path(src);
  •                         Path dstPath = new Path(dst);
  •                         fs.copyFromLocalFile(srcPath, dstPath);
  •                         System.out.println("Move " + src + " to hdfs://" + dst + " successful!");
  •                 } catch (Exception e) {
  •                         System.err.println("Move file fail!");
  •                         e.printStackTrace();
  •                 } finally {
  •                         try {
  •                                 fs.close();
  •                         } catch (IOException e) {
  •                                 System.err.println("Close FileSystem fail!");
  •                                 e.printStackTrace();
  •                         }
  •                 }
  •         }[/ol]复制代码
  • 回复

    使用道具 举报

    qz2003 发表于 2013-10-25 10:44:26
    《Hadoop开发者第二期》中的文章《HDFS在web开发中的应用》一文中实现的架构如下
    为什么没有namenode节点吗?客户端直接和datanode节点交互吗?
    我想的结构如下:不知道对不对啊吗?
    HDFS客户端放在哪里吗?namenode节点吗吗?
    客户端(用户)和HDFS客户端还要传输文件吗吗?
    回复

    使用道具 举报

    top_gloria 发表于 2013-10-25 10:44:26
    那个浏览器该不会是直接架在namenode上的吧吗?
    要不就是这图画得比较简略,浏览器虽然没直接放namenode上,但那个框已经隐含了namenode。
    回复

    使用道具 举报

    atsky123 发表于 2013-10-25 10:44:26
    肯定需要和NameNode通信的,图省略了这个,主要是展示了webserver和datanode间的数据通信,真正需要的数据都来自于datanode。
    回复

    使用道具 举报

    fylanyu 发表于 2013-10-25 10:44:26
    回复 5# eyjian
        学习了,论坛还是不够火啊,希望大家多提想法和学习方法。
    回复

    使用道具 举报

    goldtimes 发表于 2013-10-25 10:44:26
    回复  eyjian
        学习了,论坛还是不够火啊,希望大家多提想法和学习方法。
    skytracing 发表于 2010-9-28 09:26



      论坛不够火的一个可能原因是因为大家都在群里讨论去了,群的人气值是非常高的,一号群人气值马上就过9000了。
    回复

    使用道具 举报

    bob007 发表于 2013-10-25 10:44:26
    是否可以这样总结:将附件存入hdfs的做法:
    1,先保存在namenode本地文件系统,
    2,然后copy入 hdfs里面,
    3,然后将namenode里面的本地的文件系统里面的附件删除,
    4,要下载或删除时,直接用api去操作hdfs。
    回复

    使用道具 举报

    lijian123841314 发表于 2013-10-25 10:44:26
    大致原理是懂了,就是没能实现出来,哎
    回复

    使用道具 举报

    wscl1213 发表于 2013-10-25 10:44:26
    最近用libhdfs写入的测试代码,test.txt为300M的文本[ol]
  • #include
  • #include "hdfs.h"
  • int main(int argc, char **argv) {
  •         hdfsFS fs = hdfsConnect("name.node", 8020);
  •         const char* writePath = "test.txt";
  •         hdfsFile writeFile = hdfsOpenFile(fs, writePath, O_WRONLY|O_CREAT, 0, 0, 0);
  •         if(!writeFile) {
  •                 fprintf(stderr, "Failed to open %s for writing!\n", writePath);
  •                 exit(-1);
  •         }
  •         const char* pszInFile = "/tmp/test.txt";
  •         FILE* fp = fopen(pszInFile, "r+");
  •         if (fp != NULL)
  •         {
  •                 char szBuffer[40960];
  •                 int nReadLen = 0;
  •                 tSize offset = 0;
  •                 do {
  •                         nReadLen = fread(szBuffer, 1, sizeof(szBuffer), fp);
  •                         hdfsSeek(fs, writeFile, offset);
  •                         tSize num_written_bytes = hdfsWrite(fs, writeFile, (void*)szBuffer, nReadLen);
  •                         offset += nReadLen;
  •                 } while(nReadLen > 0);
  •         }
  •         if (hdfsFlush(fs, writeFile)) {
  •                 fprintf(stderr, "Failed to 'flush' %s\n", writePath);
  •                 exit(-1);
  •         }
  •         hdfsCloseFile(fs, writeFile);
  •         return 0;
  • }[/ol]复制代码
  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐上一条 /2 下一条