运行Hadoop Pipes代码遇x86_64架构符号未找到错误求助
解决Hadoop Pipes编译时x86_64架构符号缺失问题
兄弟,我之前在MacOS 10.13.3上跑Hadoop 2.7.3的Pipes代码时,一模一样碰到过这个ld: symbol(s) not found for architecture x86_64错误!折腾了好一阵才搞定,给你几个靠谱的排查和解决方向:
1. 先检查你的编译命令是不是漏了链接Hadoop库
这个错误90%是编译时没正确链接Hadoop的Pipes相关库导致的。你需要明确指定头文件路径、库路径,还要把必要的库都链上。比如正确的编译命令应该是这样的(用g或者clang都行):
clang++ -arch x86_64 -std=c++11 your_mapper_code.cpp -o max_temp_executable \ -I$HADOOP_HOME/include \ -L$HADOOP_HOME/lib/native \ -lhadoop -lhadooppipes -lhadooputils -lprotobuf
-arch x86_64是强制指定编译架构,避免Mac默认的架构和Hadoop库不匹配;-I后面是Hadoop头文件的路径,-L是native库的路径;-l后面的是要链接的库名,别漏了hadooppipes和hadooputils,这俩是Pipes核心库。
2. 确认Hadoop native库的架构是否适配x86_64
Hadoop 2.7.3默认带的native库可能不是针对Mac x86_64编译的,你可以用lipo命令检查一下:
lipo -info $HADOOP_HOME/lib/native/libhadooppipes.dylib
如果输出里没有x86_64,那你得自己编译适配的native库。先装依赖:用brew安装protobuf、cmake、openssl这些工具,然后下载Hadoop 2.7.3的源码,执行编译命令:
mvn clean package -DskipTests -Pnative
编译完把生成的native库替换掉$HADOOP_HOME/lib/native下的文件就行。
3. 检查代码里的Mapper接口签名是否正确
你的代码里继承了HadoopPipes::Mapper,一定要确保map方法的签名完全匹配,比如:
void map(HadoopPipes::MapContext& context) override { // 你的业务逻辑代码 }
要是签名错了(比如少了override,或者参数类型不对),链接器会找不到对应的虚函数符号,也会报这个错。
4. 确认环境变量设置正确
别漏了设置HADOOP_HOME,而且要确保编译时能读到这个变量。终端里敲echo $HADOOP_HOME看看路径对不对,要是路径错了,编译时肯定找不到头文件和库。
内容的提问来源于stack exchange,提问作者Joon
相关产品推荐
相关产品推荐

