如何通过 hadoop 集群为 Google Compute Engine 启用 Snappy/Snappy Codec

2023-12-04

我正在尝试针对我们位于 Google 云存储上的压缩数据在 Google 计算引擎上运行 Hadoop 作业。 在尝试通过 SequenceFileInputFormat 读取数据时,出现以下异常:

hadoop@hadoop-m:/home/salikeeno$ hadoop jar ${JAR} ${PROJECT} ${OUTPUT_TABLE}
14/08/21 19:56:00 INFO jaws.JawsApp: Using export bucket 'askbuckerthroughhadoop' as specified in 'mapred.bq.gcs.bucket'
14/08/21 19:56:00 INFO bigquery.BigQueryConfiguration: Using specified project-id 'regal-campaign-641' for output
14/08/21 19:56:00 INFO gcs.GoogleHadoopFileSystemBase: GHFS version: 1.2.8-hadoop1
14/08/21 19:56:01 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
14/08/21 19:56:03 INFO input.FileInputFormat: Total input paths to process : 1
14/08/21 19:56:09 INFO mapred.JobClient: Running job: job_201408211943_0002
14/08/21 19:56:10 INFO mapred.JobClient:  map 0% reduce 0%
14/08/21 19:56:20 INFO mapred.JobClient: Task Id : attempt_201408211943_0002_m_000001_0, Status : FAILED
java.lang.RuntimeException: native snappy library not available
        at org.apache.hadoop.io.compress.SnappyCodec.getDecompressorType(SnappyCodec.java:189)
        at org.apache.hadoop.io.compress.CodecPool.getDecompressor(CodecPool.java:125)
        at org.apache.hadoop.io.SequenceFile$Reader.init(SequenceFile.java:1581)
        at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1490)
        at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1479)
        at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1474)
        at org.apache.hadoop.mapreduce.lib.input.SequenceFileRecordReader.initialize(SequenceFileRecordReader.java:50)
        at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:521)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:415)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
        at org.apache.hadoop.mapred.Child.main(Child.java:249)
  1. SnappyCodec 似乎不可用。我应该如何在 Google 计算引擎上的 Hadoop 集群中包含/启用 Snappy?
  2. 在部署 Hadoop 集群时,我可以通过 bdutil 脚本部署 Snappy lib(如果必须)吗?
  3. 在 Google 计算引擎上部署的 Hadoop 集群上部署第三方库/jar 的最佳方法是什么?

多谢


不再需要此程序。

默认情况下,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'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 hadoop 集群为 Google Compute Engine 启用 Snappy/Snappy Codec 的相关文章

随机推荐

  • 委托的构造函数和成员函数在哪里定义?

    当我在看的时候ActionReflector 中的委托 我看到它有一个像这样的构造函数 public Action object object IntPtr method 但我找不到任何机构以及其他成员职能 例如Invoke BeginIn
  • MYSQLI准备语句bind_param类型不起作用

    我已经使用准备好的插入语句好几年了 并假设它正确绑定了参数 否则会给出错误 但它似乎不像以下 php 绑定并插入记录而没有任何错误 而是将应该是 int 的字符串更改为零 因此 它可能可以防止 SQL 注入攻击 但最终会在表中得到虚假记录
  • Monotouch:在 iPhone 上关闭飞行模式后 WebRequest 连接失败

    我的单点触控应用程序正在与网络服务进行定期后台同步 它运行完美并正确检测飞行模式 当我关闭 WiFi 时 它会自动开始使用 WWAN GPRS 3G 连接 到目前为止 我非常满意 但是 关闭飞行模式后 当没有可用的 WiFi 时 我的应用程
  • 类型错误:列表索引必须是整数,而不是 str Python [重复]

    这个问题在这里已经有答案了 list s 是一个字符串 为什么这不起作用 出现以下错误 类型错误 列表索引必须是整数 而不是 str list abc def map list for s in list t list s 1 map li
  • 如果数组包含值,Mongoose 查找文档

    所以我有这个模式 const Document new mongoose Schema id type Number creationDate type Date default Date now title String status t
  • 致命错误:未捕获错误:调用未定义的函数 sqlsrv_connect()

    我正在尝试连接到我们可以通过 Microsoft SQL Server Management Studio 访问的 SQL Server 我已经尝试了很多我在 SO 上看到的不同的东西 但没有任何效果 我收到错误Fatal error Un
  • 从 TFS 迁移到 VSTS - 减少 TPC 数据库大小

    我们计划很快从本地 TFS 实例迁移到 VSTS 在迁移之前 我们运行先决条件的验证任务并获得有关 TPC 数据库大小的以下输出报告 数据库当前为 191GB 这超出了使用 DACPAC 导入方法时建议的 150GB 大小 当前最大表大小为
  • 使用 CSS 淡入淡出 div

    http jsfiddle net LJdAU o transition color 3s ease out background 5s ease in out ms transition color 3s ease out backgro
  • 不使用 XAML 将子项添加到 ListView

    如何将子项目添加到ListView 我需要动态生成所有内容 但我找到的每个示例都使用 XAML 非 WPF 就这么简单 ListViewItem lvi listview items add wahtever lvi blah blah b
  • 如何实现从非托管DLL到.net应用程序的回调接口?

    在我的下一个项目中 我想为 C 中已有的代码实现一个 GUI 我的计划是将 C 部分包装在 DLL 中 并用 C 实现 GUI 我的问题是我不知道如何实现从非托管 DLL 到托管 C 代码的回调 我已经在 C 中完成了一些开发 但托管代码和
  • 如何使用 PHPUnit 获得 100% 代码覆盖率

    我正在编写一个 Zend Framework 应用程序并使用 PHPUnit 对其进行单元测试 总的来说 事情进展顺利 但是我在 PHPUnit 和代码覆盖率方面遇到了一个小但烦人的问题 它有时告诉我特定的行没有经过测试 而且我不知道如何强
  • xcode 中只有一个视图自动旋转?

    好吧 我目前有 3 个视图 我只需要其中一个自动旋转到任何方向 而其余的保持纵向 现在我的设置是一个splashviewcontroller淡入视图A 内部视图A是一个切换到视图B的按钮 我想要的只是视图B能够旋转到任何方向 当我在spla
  • 使用 Powershell 中的函数替换

    我正在尝试替换 Powershell 中的部分字符串 但是 替换字符串不是硬编码的 它是通过函数计算的 text the image is 12345 text text replace d This is the image 1 Writ
  • Servlet 给出错误 java.lang.NoClassDefFoundError

    我在我的应用程序的 servlet 中使用以下代码 java awt Image awtImg java awt Toolkit getDefaultToolkit createImage str1 当我运行应用程序并调用 servlet
  • Django 所有页面的默认上下文

    我想知道是否有任何方法可以为 django 中的所有页面发送默认上下文 例如无论其他上下文如何 用户总是传递到模板 对于我的特殊情况 我想将导航栏的上下文 例如类别和子类别 发送到所有页面 而无需发送所有视图 TIA 您可以通过创建上下文处
  • 如何在代理后面克隆 Codeplex Mercurial 存储库?

    我正在使用 TortoiseHG 版本 2 4 2 通过 Firefox 或 Internet Explorer 我可以很好地浏览以下 Codeplex 项目 https hg codeplex com oxyplot 问题是我无法在本地计
  • 网站在 Firefox 上显示“连接不安全”

    当我激活第三方主题时 我的网站在 Firefox 上显示 连接不安全 此外 关于这个主题的所有表格都写着 This connection is not secure Logins entered here could be compromi
  • build.gradle(项目)和build.gradle(模块)之间的区别

    我正在尝试将 Android 异步 Http 客户端的依赖项添加到我的项目中 所以有两个构建 gradle项目中的文件 根据我的理解 有不同类型的依赖关系 在根级别定义的一个构建 gradle 项目 我的应用程序 构建脚本中的一个构建 gr
  • 使用javascript将GMT转换为IST(印度标准时间)?

    我的日期格式是 GMT 或 UTC var mydate 2020 01 14T17 43 37 000Z 我想将此日期转换为 IST 格式 以便根据此日期我需要此格式的输出 var date 2020 Jan 15 12 45 您可以在传
  • 如何通过 hadoop 集群为 Google Compute Engine 启用 Snappy/Snappy Codec

    我正在尝试针对我们位于 Google 云存储上的压缩数据在 Google 计算引擎上运行 Hadoop 作业 在尝试通过 SequenceFileInputFormat 读取数据时 出现以下异常 hadoop hadoop m home s