Incompatible namespaceID for journal Storage Directory /home/hkx/journaldata/ns2: NameNode has nsId ...

原因是因为你的hadoop.tmp.dir在/tmp目录下,而linux系统的/tmp文件夹内容能够是定时清理的,所以会导致你看hadoop使用不了了,就反复的格式化namenode会导致上述问题,也有可能是datanode长期没正常启动导致;
找了一下资料,有三个解决方案:
解決方法一:删除 datanode 的所有资料,主要指的是tmp目录和data目录,适用没存放过任何资料的HDFS;
解決方法二:修改 datanode 的 namespaceID
编辑每台 datanode 的 hadoop.tmp.dir/hadoop/hadoop-root/dfs/data/current/VERSION 把ID改为和namenode一致,重启datanode,数据会丢失;
解決方法三:修改 namenode 的 namespaceID(网上找到的)
编辑 namenode 的 hadoop.tmp.dir/hadoop/hadoop-root/dfs/name/current/VERSION 把ID改为和datanode一直,重启namenode,我测试了一下,第三种方法不行,我初步断定namespaceID生成的时候,里面可能有时间的随机数,我在测试中改了namenode的namespaceID,让namende和datanode一直,但是重启后他会自动的核对,他重新的修改回来,没办法,我只好采用了第二种方案,然后我仔细看了namenoe启动的日志,发现 有日志块注册的信息,注册完后,namenode发现datanode上有不属于自己的data,就发送了delete的命令

2012-10-19 16:57:20,980 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.registerDatanode: node registration from 192.168.80.84:50010 storage DS-584796903-192.168.80.84-50010-1350015221338
2012-10-19 16:57:21,142 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /default-rack/192.168.80.84:50010
2012-10-19 16:57:21,618 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.registerDatanode: node registration from 192.168.80.83:50010 storage DS-942449248-192.168.80.83-50010-1350015230758
2012-10-19 16:57:21,618 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /default-rack/192.168.80.83:50010
2012-10-19 16:57:21,866 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.processReport: block blk_-8214438839875239556_1105 on 192.168.80.84:50010 size 67108864 does not belong to any file.
2012-10-19 16:57:21,882 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.addToInvalidates: blk_-8214438839875239556 is added to invalidSet of 192.168.80.84:50010
2012-10-19 16:57:21,882 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.processReport: block blk_-4821437377619945111_1112 on 192.168.80.84:50010 size 4 does not belong to any file.
2012-10-19 16:57:21,882 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.addToInvalidates: blk_-4821437377619945111 is added to invalidSet of 192.168.80.84:500102012-10-19 16:57:21,618 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /default-rack/192.168.80.83:50010

转载于:https://www.cnblogs.com/huifeidezhuzai/p/10592077.html

<think>嗯,用户遇到了Qt for Android编译时链接FFmpeg库的问题,具体是报错"skipping incompatible libavfilter.dll.a"和"cannot find -lavfilter"。从错误信息看,核心问题是架构不兼容——用户可能在Windows平台下使用了为x86架构编译的FFmpeg库,但Android需要的是ARM架构的库。 用户提供的引用信息很有价值:引用[3]明确提到"编译的架构有问题",当出现"skipping incompatible"警告时,通常意味着编译器检测到库文件与目标平台不匹配。引用[2]和[4]展示了x86架构的配置示例,但用户需要的是ARM架构的配置。 用户可能混淆了三个关键点:第一,Windows平台的.dll/.dll.a文件不能直接用于Android;第二,Android需要.so动态库;第三,必须严格匹配目标设备的CPU架构(如armeabi-v7a/arm64-v8a)。从用户环境看(Qt 5.15.2+Win11),ta可能直接从Windows版FFmpeg复制了库文件。 解决方案需要分三步:重新编译ARM版FFmpeg库→正确部署到Qt项目→配置.pro文件。编译时要特别注意: 1. 使用Android NDK的交叉编译工具链 2. 配置参数需指定--target-os=android和--arch=arm64(或armeabi) 3. 生成.so文件而非.dll.a 部署时需确保: 1. .so文件放在android/libs/arm64-v8a等对应目录 2. pro文件用ANDROID_EXTRA_LIBS声明库 3. 包含正确的头文件路径 用户可能遇到的陷阱包括:NDK版本与Qt不兼容(建议用r21e)、忘记strip调试符号、未设置运行时库搜索路径(rpath)。可以建议ta先用android-libavfilter-test.cpp测试单个库的链接情况,再整合到主项目。 最后需要提醒用户:Qt for Android的FFmpeg集成涉及三个层面(C++编译/JNI封装/Java调用),当前问题仅处于最底层的C++链接阶段,后续可能还需要处理JNI封装问题。</think>根据您提供的错误信息和引用内容,问题核心在于**架构不兼容**。以下是系统级解决方案: ### 错误原因分析 1. **架构不匹配**:Qt编译Android应用时需使用ARM架构库(`armeabi-v7a`/`arm64-v8a`),但当前链接的`libavfilter.so`是x86或Windows平台库(如`.dll.a`文件),导致报错: ```bash skipping incompatible C:/.../libavfilter.so # 引用[1][3] error: cannot find -lavfilter ``` 2. **编译配置错误**:FFmpeg交叉编译时未正确指定Android目标架构和工具链(如`--arch=arm64` `--cross-prefix=aarch64-linux-android-`),引用[2][4]中x86配置示例不适用于ARM设备。 --- ### 解决方案(分三步) #### 步骤1:重新编译FFmpeg库(关键!) 使用Android NDK工具链重新编译ARM架构的FFmpeg: ```bash ./configure \ --arch=arm64 \ # ARM64架构 --cpu=armv8-a \ # CPU类型 --target-os=android \ # 目标系统 --cross-prefix=aarch64-linux-android- \ # 工具链前缀 --sysroot=$NDK/sysroot \ # NDK系统路径 --extra-cflags="-O3 -fPIC -DANDROID" \ --extra-ldflags="-Wl,-rpath-link=$NDK/sysroot/usr/lib" \ --enable-shared # 生成.so动态库 ``` > **必须验证输出**:编译后检查`file libavfilter.so`应显示 `ELF 64-bit LSB shared object, ARM aarch64` #### 步骤2:部署库文件到Qt项目 1. 将新编译的ARM架构`.so`文件放入项目目录: ``` your_project/ ├── android/ │ ├── libs/ │ │ ├── arm64-v8a/ # ARM64设备 │ │ │ ├── libavfilter.so │ │ │ └── ... # 其他FFmpeg库 │ │ └── armeabi-v7a/ # ARMv7设备 ``` 2. 在Qt的`.pro`文件中添加链接配置: ```qmake android { ANDROID_EXTRA_LIBS = \ $$PWD/android/libs/arm64-v8a/libavfilter.so \ $$PWD/android/libs/arm64-v8a/libavformat.so \ # 添加其他依赖库 } INCLUDEPATH += $$PWD/ffmpeg/include # FFmpeg头文件路径 ``` #### 步骤3:清理并重新构建 1. 删除原编译目录(如`build-*`文件夹) 2. 执行`qmake && make clean && make` 3. 部署到真机测试(模拟器可能有架构差异) --- ### 关键注意事项 1. **NDK版本匹配**:使用Qt 5.15.2官方推荐的NDK版本(如r21e),避免工具链不兼容[^2][^3] 2. **库文件类型**:Android仅支持`.so`动态库,Windows的`.dll.a`不可用 3. **架构一致性**:确保所有FFmpeg库(libavcodec/libavformat等)均为相同ARM架构编译 > **引用验证**:当出现`skipping incompatible`警告时,表示编译器检测到库文件与目标ABI不匹配,必须替换为正确架构的库文件[^1][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值