使用 PHP 透過 Thrift 協定存取 HDFS,需編譯 Thrift PHP 擴展並啟動 Hadoop Thrift Server。本文記錄完整建置流程與實遇錯誤排查。
# 1. 安裝 Thrift 0.9.0
wget https://dist.apache.org/repos/dist/release/thrift/0.9.0/thrift-0.9.0.tar.gz
tar zxvf thrift-0.9.0.tar.gz && cd thrift-0.9.0
yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel
./configure --prefix=/usr/local/thrift && make && make install
# 2. 複製 PHP 擴展與 Hadoop 產生的 gen-php
cp -R ./lib/php/ /usr/local/thrift/lib/
cp -R /tmp/hadoop-1.0.4/src/contrib/thriftfs/gen-php/ /usr/local/thrift/lib/php/src/packages/hadoopfs/
# 3. 編譯安裝 thrift_protocol PHP 擴展
cd ./lib/php/src/ext/thrift_protocol/
yum install php-devel
phpize && ./configure && make && make install
# 4. 啟動 Hadoop Thrift Server
cd /tmp/hadoop-1.0.4/src/contrib/thriftfs/scripts/
./start_thrift_server.sh
log4j:ERROR Could not instantiate class [org.apache.hadoop.log.metrics.EventCounter]
java.lang.ClassNotFoundException: org.apache.hadoop.log.metrics.EventCounter
...
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
start_thrift_server.sh 中 CLASSPATH 是否包含 hadoop-core-*.jar、hadoop-common-*.jarlog4j.properties 中 EventCounter 類別在新版 Hadoop 已移除/重命名cURL 操作,無需 Thrift 編譯shell_exec('hdfs dfs -put ...')Thrift 整合複雜度高、版本敏感,生產環境建議優先評估 REST API 方案。