不再需要此程序。
默认情况下,bdutil 部署将包含 Snappy。
原答案供参考:
您的最后一个问题在一般情况下是最容易回答的,所以我将从这里开始。传送依赖项的一般指导是应用程序应利用分布式缓存将 JAR 和库分发给工作线程(Hadoop 1 或 2)。如果您的代码已经在使用 GenericOptionsParser,您可以使用 -libjars 标志来分发 JAR。可以在 Cloudera 的博客上找到更长的讨论,其中还讨论了 fat JAR:http://blog.cloudera.com/blog/2011/01/how-to-include-third-party-libraries-in-your-map-reduce-job/
为了安装和配置其他系统级组件,bdutil 支持扩展机制。扩展的一个很好的例子是与 bdutil 捆绑在一起的 Spark 扩展:extensions/spark/spark_env.sh。运行 bdutil 扩展时会添加 -e 标志,例如,使用 Hadoop 部署 Spark:
./bdutil -e extensions/spark/spark_env.sh deploy
关于您的第一个问题和第二个问题:在 GCE 上的 Hadoop 中处理 Snappy 时存在两个障碍。首先,Apache 构建并与 Hadoop 2 tarball 捆绑在一起的本机支持库是为 i386 构建的,而 GCE 实例是 amd64。 Hadoop 1 捆绑了两个平台的二进制文件,但如果不捆绑或修改环境,则无法定位 snappy。由于这种架构差异,在 Hadoop 2 中没有可用的本机压缩器(snappy 或其他方式),并且 Snappy 在 Hadoop 1 中不容易使用。第二个障碍是 libsnappy 本身默认情况下不安装。
克服这两个问题的最简单方法是创建您自己的 Hadoop tarball,其中包含 amd64 本机 Hadoop 库以及 libsnappy。以下步骤应该可以帮助您完成此操作并暂存生成的 tarball 供 bdutil 使用。
首先,使用 Debian Wheezy 向后移植映像启动新的 GCE VM,并授予 VM 服务帐户对 Cloud Storage 的读/写访问权限。我们将使用它作为我们的构建机器,一旦完成构建/存储二进制文件,我们就可以安全地丢弃它。
使用 Snappy 构建 Hadoop 1.2.1
通过 SSH 连接到您的新实例并运行以下命令,检查过程中是否有任何错误:
sudo apt-get update
sudo apt-get install pkg-config libsnappy-dev libz-dev libssl-dev gcc make cmake automake autoconf libtool g++ openjdk-7-jdk maven ant
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/
wget http://apache.mirrors.lucidnetworks.net/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz
tar zxvf hadoop-1.2.1.tar.gz
pushd hadoop-1.2.1/
# Bundle libsnappy so we don't have to apt-get install it on each machine
cp /usr/lib/libsnappy* lib/native/Linux-amd64-64/
# Test to make certain Snappy is being loaded and is working:
bin/hadoop jar ./hadoop-test-1.2.1.jar testsequencefile -seed 0 -count 1000 -compressType RECORD xxx -codec org.apache.hadoop.io.compress.SnappyCodec -check
# Create a new tarball of Hadoop 1.2.1:
popd
rm hadoop-1.2.1.tar.gz
tar zcvf hadoop-1.2.1.tar.gz hadoop-1.2.1/
# Store the tarball on GCS:
gsutil cp hadoop-1.2.1.tar.gz gs://<some bucket>/hadoop-1.2.1.tar.gz
使用 Snappy 构建 Hadoop 2.4.1
通过 SSH 连接到您的新实例并运行以下命令,检查过程中是否有任何错误:
sudo apt-get update
sudo apt-get install pkg-config libsnappy-dev libz-dev libssl-dev gcc make cmake automake autoconf libtool g++ openjdk-7-jdk maven ant
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/
# Protobuf 2.5.0 is required and not in Debian-backports
wget http://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz
tar xvf protobuf-2.5.0.tar.gz
pushd protobuf-2.5.0/ && ./configure && make && sudo make install && popd
sudo ldconfig
wget http://apache.mirrors.lucidnetworks.net/hadoop/common/hadoop-2.4.1/hadoop-2.4.1-src.tar.gz
# Unpack source
tar zxvf hadoop-2.4.1-src.tar.gz
pushd hadoop-2.4.1-src
# Build Hadoop
mvn package -Pdist,native -DskipTests -Dtar
pushd hadoop-dist/target/
pushd hadoop-2.4.1/
# Bundle libsnappy so we don't have to apt-get install it on each machine
cp /usr/lib/libsnappy* lib/native/
# Test that everything is working:
bin/hadoop jar share/hadoop/common/hadoop-common-2.4.1-tests.jar org.apache.hadoop.io.TestSequenceFile -seed 0 -count 1000 -compressType RECORD xxx -codec org.apache.hadoop.io.compress.SnappyCodec -check
popd
# Create a new tarball with libsnappy:
rm hadoop-2.4.1.tar.gz
tar zcf hadoop-2.4.1.tar.gz hadoop-2.4.1/
# Store the new tarball on GCS:
gsutil cp hadoop-2.4.1.tar.gz gs://<some bucket>/hadoop-2.4.1.tar.gz
popd
popd
更新 bdutil_env.sh 或 hadoop2_env.sh
一旦您拥有捆绑了正确本机库的 Hadoop 版本,我们就可以通过更新 Hadoop 1 的 bdutil_env.sh 或 Hadoop 2 的 hadoop2_env.sh 将 bdutil 指向新的 Hadoop tarball。无论哪种情况,打开相应的文件并查找沿着以下方向的块:
# URI of Hadoop tarball to be deployed. Must begin with gs:// or http(s)://
# Use 'gsutil ls gs://hadoop-dist/hadoop-*.tar.gz' to list Google supplied options
HADOOP_TARBALL_URI='gs://hadoop-dist/hadoop-1.2.1-bin.tar.gz'
并将指向的 URI 更改为我们在上面存储 tarball 的 URI:例如,
HADOOP_TARBALL_URI='gs://<some bucket>/hadoop-1.2.1.tar.gz'