[求助] 如何用Hadoop Streaming with C/C++_Hadoop,ERP及大数据讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Hadoop,ERP及大数据讨论区 »
总帖数
4
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3032 | 回复: 3   主题: [求助] 如何用Hadoop Streaming with C/C++        上一篇   下一篇 
lanlanpiaoliu
注册用户
等级:上尉
经验:505
发帖:4
精华:0
注册:2015-10-21
状态:离线
发送短消息息给lanlanpiaoliu 加好友    发送短消息息给lanlanpiaoliu 发消息
发表于: IP:您无权察看 2015-11-27 22:05:37 | [全部帖] [楼主帖] 楼主

想请问C++在使用 Hadoop Streaming 的部分,本身的"mapper""reduce"中,可否加进开文件读文件的功能?

我修改C++ wordcount的程序,希望mapperreduce中可以fopen一个新文字文件,并且把<Key, Value>记录在这个文字文件中,实际直接测试C++的程序是OK的,但丢上Hadoop去执行,只有wordcount部分的结果可以成功执行,我在hdfs中的input/output都没有看到任何有关我开新的那一个文字文件的踪迹。想请问在hadoop streaming中,我用C++开档读档的这个动作,是否不被接受?

//Mapper.cpp

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;
int main() {
string key;
FILE *pFile;
//char* libvar;

pFile = fopen ("hadoop_mapper_cpp.txt", "wa+");
//libvar = (char*) "echo 1234567";

fprintf(pFile, "mapper\n");
if (pFile == NULL) {
printf ("FAILED\n");
return 0;
}
while(cin >> key) {
cout << key << "\t" << "1" << endl;
fprintf(pFile,"%s\n", key.c_str());
}
fclose (pFile);
return 0;
}
//


//Reducer.cpp

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;
int main() {
string cur_key, last_key, value;
FILE *pFile;

cin >> cur_key >> value;
last_key = cur_key;

int n = 1;

pFile = fopen ("hadoop_mapper_cpp.txt", "a+");
fprintf(pFile, "\n\nreducer\n\n");

while(cin >> cur_key) {
cin >> value;
if(last_key != cur_key) {
cout << last_key << "\t" << n << endl;
last_key = cur_key;
n = 1;
} else {
n++; 
}
fprintf(pFile,"5.Last Key: %s\t%d\n\n", last_key.c_str(), n);

}

 

谢谢!



该贴被蜀山战纪编辑于2015-12-4 10:07:18



赞(0)    操作        顶端 
可爱的龙八
注册用户
等级:中尉
经验:466
发帖:10
精华:2
注册:2015-10-9
状态:离线
发送短消息息给可爱的龙八 加好友    发送短消息息给可爱的龙八 发消息
发表于: IP:您无权察看 2015-11-28 13:43:12 | [全部帖] [楼主帖] 2  楼

这是一个观念上需要修改的地方。由于 HDFS 是一个抽象的档案系统,因此您必须透过 HDFS 的接口去写,而不能用操作系统的 fopen 等函数去进行读写。您的程序在 MapReduce 上执行时,会变成写在每一台 TaskTracker 的本机暂存区。假设您想验证一下观念的话,可以把路径写在 /tmp/ 底下。

pFile = fopen ("/tmp/hadoop_mapper_cpp.txt", "wa+");

会发现不是出现在 HDFS /tmp 而是出现在操作系统的 /tmp (如果是 Linux 的话)

(为什么要改路径呢?因为 MapReduce 在完成时,暂存区会被 TaskTracker 清掉,所以根本就不知道有写档案到本机操作系统 )

使用 C/C++ 想要存取 HDFS ,必须透过 Hadoop Pipes 的接口

 




赞(0)    操作        顶端 
lanlanpiaoliu
注册用户
等级:上尉
经验:505
发帖:4
精华:0
注册:2015-10-21
状态:离线
发送短消息息给lanlanpiaoliu 加好友    发送短消息息给lanlanpiaoliu 发消息
发表于: IP:您无权察看 2015-11-28 23:36:33 | [全部帖] [楼主帖] 3  楼

这是一个观念上需要修改的地方。由于 HDFS <span style="font-size: 1.....


谢谢,已经解决



赞(0)    操作        顶端 
可爱的龙八
注册用户
等级:中尉
经验:466
发帖:10
精华:2
注册:2015-10-9
状态:离线
发送短消息息给可爱的龙八 加好友    发送短消息息给可爱的龙八 发消息
发表于: IP:您无权察看 2015-11-29 23:32:27 | [全部帖] [楼主帖] 4  楼

~~~~



赞(0)    操作        顶端 
总帖数
4
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论