xukunddp 发表于 2013-10-25 10:44:26

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

我想用hdfs实现文件的存储,用户可以上传或下载图片、音乐、视频等。
是不是单个文件小于64M简单些吗?大于64M会困难很多吗吗?
最好能给个实际实现的例子啊,或者实现的方法也行啊。
向各位大侠请教了,望不吝赐教啊,谢谢!:)

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、贴个代码,就是入数据文件的方法,比较粗糙,你凑合看看吧
[*]/**
[*]         * 移动本地文件到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();
[*]                        }
[*]                }
[*]      }复制代码

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

http://bbs.hadoopor.com/images/common/back.gif

论坛不够火的一个可能原因是因为大家都在群里讨论去了,群的人气值是非常高的,一号群人气值马上就过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的文本[*]#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;
[*]                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;
[*]}复制代码
页: [1]
查看完整版本: 谁能给个用hdfs实现文件存储的例子啊