Taiwan Hadoop Forum

台灣 Hadoop 技術討論區
現在的時間是 2020-01-20, 11:50

所有顯示的時間為 UTC + 8 小時




發表新文章 回覆主題  [ 1 篇文章 ] 
發表人 內容
 文章主題 : hadoop fuse挂载问题
文章發表於 : 2011-10-04, 16:17 
離線

註冊時間: 2011-08-01, 11:40
文章: 15
大家好,我在用使用fuse-dfs挂载HDFS时使用命令 ./fuse_dfs_wrapper.sh dfs://10.10.102.41:9000 /tmp/hdfs 想要把HDFS mount到/tmp/hdfs下面,总是遇到port=9000,server=10.10.102.41 fuse-dfs didn't recognize /tmp/hdfs,-2的错误,请问该怎么解决这个问题,我的core-xml的dfs.default.name是用ip配置的端口也是9000但是就是挂载不了,请问jazz该怎么解决这个错误,Scientific 6.1+hadoop-0.21.0+fuse-2.7.4..谢谢!

大家好,还是上面的这个问题,依据上面的环境(Scientific 6.1+hadoop-0.21.0+fuse-2.7.4),我查看的/var/log/message 里的错误,每次使用命令 ./fuse_dfs_wrapper.sh dfs://10.10.102.41:9000 /tmp/hdfs 都能出现上面的fuse-dfs didn't recognize /tmp/hdfs,-2的错误,而在/var/log/message 日志文件里显示的是:ERROR: could not connect to 10.10.102.41:9000 in dfs_getattr.c
根据上面的错误我找到了源码,上面的错误出现在hadoop-0.21.0\hadoop-0.21.0\hdfs\src\contrib\fuse-dfs\src下面的fuse_impls_getattr.c源码中,如下面的显示的其中一段:
28. dfs_context *dfs = (dfs_context*)fuse_get_context()->private_data;

// check params and the context var
assert(dfs);
assert(path);
assert(st);

// if not connected, try to connect and fail out if we can't.
36. if (NULL == dfs->fs && NULL == (dfs->fs = hdfsConnect(dfs->nn_hostname,dfs->nn_port))) {
37. syslog(LOG_ERR, "ERROR: could not connect to %s:%d %s:%d\n", dfs->nn_hostname, dfs->nn_port,__FILE__, __LINE__);
return -EIO;
}

/var/log/message出现的错误在第37行,而在28行dfs_context *dfs = (dfs_context*)fuse_get_context()->private_data 那里我调试了程序,打印出了dfs->dfs->nn_hostname和dfs->nn_port的值都是匹配的,但是dfs->fs却是NULL
而在36行那里我修改为if(NULL == (dfs->fs = hdfsConnect(dfs->nn_hostname,dfs->nn_port)))进行了调试,获取得到的dfs->fs仍然还是为空,这也是一直出现 fuse-dfs didn't recognize /tmp/hdfs,-2错误的原因,因为dfs->fs一直未能获得HDFS的文件handle句柄.
我的疑问一:hdfsConnect(dfs->nn_hostname,dfs->nn_port)这个函数是否未得到执行,这个函数是在hdfs.h里面声明的,在hdfs.c里面实现的,是否hdfsConnect(dfs->nn_hostname,dfs->nn_port)未得到执行才导致如此,我该怎么解决。

起初,我以为是fuse-dfs里面的源码问题,于是我通过SVN更新了hadoop-0.21.0\hadoop-0.21.0\hdfs\src\contrib\fuse-dfs 进行重新的编译,编译成功后,进行了./fuse_dfs_wrapper.sh dfs://10.10.102.41:9000 /tmp/hdfs的挂载,虽然不在出现 fuse-dfs didn't recognize /tmp/hdfs,-2的错误,但是依旧是挂载不成功的,我再次查看了/var/log/message里的日志文件,找到了更新后的hadoop-0.21.0\hadoop-0.21.0\hdfs\src\contrib\fuse-dfs\src的错误源:
错误来自于下面的子函数中的98行:ERROR:Unable to create fs for user root (我用的是root挂载,用其他用户也是如此)
hdfsFS doConnectAsUser(const char *hostname, int port) {
uid_t uid = fuse_get_context()->uid;
char *user = getUsername(uid);
int ret;
hdfsFS fs = NULL;
if (NULL == user) {
goto done;
}

ret = pthread_mutex_lock(&tableMutex);
assert(0 == ret);

fs = findFs(user);
if (NULL == fs) {
96. fs = hdfsConnectAsUserNewInstance(hostname, port, user);
97. if (NULL == fs) {
98. ERROR("Unable to create fs for user %s", user);
goto done;
}
if (-1 == insertFs(user, fs)) {
ERROR("Unable to cache fs for user %s", user);
}
}
出错的原因在执行96: fs = hdfsConnectAsUserNewInstance(hostname, port, user);后得到的fs仍然我NULL,而hdfsConnectAsUserNewInstance也是声明在hdfs.h,实现在hdfs.c函数当中,但是当执行了上面的 fs = hdfsConnectAsUserNewInstance(hostname, port, user),参数hostname,port,user我调试了都是对应正确的,但是fs得到的值仍然是NULL,出错的本质跟上面未改变源码时的情况一样,依旧是无法获取到FS的句柄,我也看了hdfs.c和hdfs.h这两个文件,hdfs.h负责声明,hdfs.c负责实现,而在hadoop0.21.0中在未编译之前还有这个文件libhdfs.so的库文件,是否在执行过程中调用的是这个库文件去执行,而在我成功编译后在对应的编译目录也出现了libhdfs.so,libhdfs.so.0 libhdfs.so.0.0.0对应的库文件,
我的疑问二:上面的错误都出现在hdfs.c中的函数里,而出错的原因都是无法获取fs的句柄,而我防火墙确实是已经关了,但是fs依然是NULL,我猜想应该出错在hdfs.c这部分,因为不了解hdfs.h,hdfs.c,libhdfs.so这几个文件的原因不知道如何去解决这个问题,想问下群里的朋友,我该如何解决这个问题,或者说有相同经历的给我指引的方向..谢谢!


回頂端
 個人資料 E-mail  
 
顯示文章 :  排序  
發表新文章 回覆主題  [ 1 篇文章 ] 

所有顯示的時間為 UTC + 8 小時


誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
正體中文語系由 竹貓星球 維護製作