谁能给个用hdfs实现文件存储的例子啊
我想用hdfs实现文件的存储,用户可以上传或下载图片、音乐、视频等。是不是单个文件小于64M简单些吗?大于64M会困难很多吗吗?
最好能给个实际实现的例子啊,或者实现的方法也行啊。
向各位大侠请教了,望不吝赐教啊,谢谢!:) 我来简单说说我的感受吧。
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();
[*] }
[*] }
[*] }复制代码 《Hadoop开发者第二期》中的文章《HDFS在web开发中的应用》一文中实现的架构如下
为什么没有namenode节点吗?客户端直接和datanode节点交互吗?
我想的结构如下:不知道对不对啊吗?
HDFS客户端放在哪里吗?namenode节点吗吗?
客户端(用户)和HDFS客户端还要传输文件吗吗? 那个浏览器该不会是直接架在namenode上的吧吗?
要不就是这图画得比较简略,浏览器虽然没直接放namenode上,但那个框已经隐含了namenode。 肯定需要和NameNode通信的,图省略了这个,主要是展示了webserver和datanode间的数据通信,真正需要的数据都来自于datanode。 回复 5# eyjian
学习了,论坛还是不够火啊,希望大家多提想法和学习方法。 回复eyjian
学习了,论坛还是不够火啊,希望大家多提想法和学习方法。
skytracing 发表于 2010-9-28 09:26
http://bbs.hadoopor.com/images/common/back.gif
论坛不够火的一个可能原因是因为大家都在群里讨论去了,群的人气值是非常高的,一号群人气值马上就过9000了。 是否可以这样总结:将附件存入hdfs的做法:
1,先保存在namenode本地文件系统,
2,然后copy入 hdfs里面,
3,然后将namenode里面的本地的文件系统里面的附件删除,
4,要下载或删除时,直接用api去操作hdfs。 大致原理是懂了,就是没能实现出来,哎 最近用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]