【问题标题】:How to access Hbase on S3 in from non EMR node如何从非 EMR 节点访问 S3 上的 Hbase
【发布时间】:2021-03-29 17:32:02
【问题描述】:

我正在尝试访问 EMR 上的 hbase 以从在 EMR 集群节点外部运行的 Java 应用程序进行读写。即;来自在 ECS 集群/EC2 实例上运行的 docker 应用程序。 hbase 根文件夹类似于s3://<bucketname/。我需要获取 hadoop 和 hbase 配置对象以使用 core-site.xml、hbase-site.xml 文件访问 hbase 数据以进行读写。如果 hbase 数据存储在 hdfs 中,我可以访问它。

但是当它是 S3 上的 hbase 并尝试实现相同时,我遇到了异常。

Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.amazon.ws.emr.hadoop.fs.EmrFileSystem not found
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2195)
    at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2638

core-site.xml 文件包含以下属性。

<property>
  <name>fs.s3.impl</name>
  <value>com.amazon.ws.emr.hadoop.fs.EmrFileSystem</value>
</property>

<property>
  <name>fs.s3n.impl</name>
  <value>com.amazon.ws.emr.hadoop.fs.EmrFileSystem</value>
</property>

下面是包含“com.amazon.ws.emr.hadoop.fs.EmrFileSystem”类的jar: /usr/share/aws/emr/emrfs/lib/emrfs-hadoop-assembly-2.44.0.jar 此 jar 仅存在于 emr 节点上,不能作为 maven 依赖项包含在来自 maven 公共 repo 的 java 项目中。对于 Map/Reduce 作业和 Spark 作业,在类路径中添加 jar 位置将达到目的。对于在 emr 集群节点外运行的 java 应用程序,将 jar 添加到类路径将不起作用,因为 jar 在 ecs 实例中不可用。手动将 jar 添加到类路径会导致以下错误。

2021-03-26 10:02:39.420  INFO 1 --- [           main] c.a.ws.emr.hadoop.fs.util.PlatformInfo   : Unable to read clusterId from http://localhost:8321/configuration , trying extra instance data file: /var/lib/instance-controller/extraInstanceData.json
2021-03-26 10:02:39.421  INFO 1 --- [           main] c.a.ws.emr.hadoop.fs.util.PlatformInfo   : Unable to read clusterId from /var/lib/instance-controller/extraInstanceData.json, trying EMR job-flow data file: /var/lib/info/job-flow.json
2021-03-26 10:02:39.421  INFO 1 --- [           main] c.a.ws.emr.hadoop.fs.util.PlatformInfo   : Unable to read clusterId from /var/lib/info/job-flow.json, out of places to look
2021-03-26 10:02:45.578  WARN 1 --- [           main] c.a.w.e.h.fs.util.ConfigurationUtils     : Cannot create temp dir with proper permission: /mnt/s3

我们使用的是 emr 版本 5.29。有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: java hbase amazon-emr


    【解决方案1】:

    S3 不是一个“真正的”文件系统——它没有 hbase 需要的两件事

    • 压缩需要原子重命名
    • hsync() 刷新/同步预写日志。

    使用 S3 作为 HBase 后端

    1. S3a 周围有一个文件系统包装器“HBoss”,它执行压缩所需的锁定。
    2. 您仍必须为 WAL 使用 HDFS 或其他一些真正的 FS

    延伸阅读[https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/src/site/markdown/filesystem/outputstream.md]

    【讨论】:

      【解决方案2】:

      我能够通过使用 s3a 解决这个问题。 emr 中使用的 EMRFS 库不是公共的,不能在 EMR 之外使用。因此,我使用 S3AFileSystem 从我的 ecs 集群访问 S3 上的 hbase。添加与您的hadoop版本对应的 hadoop-awsaws-java-sdk-bundle maven依赖项。 并在我的 core-site.xml 中添加以下属性。

      <property>
        <name>fs.s3a.impl</name>
        <value>org.apache.hadoop.fs.s3a.S3AFileSystem</value>
        <description>The implementation class of the S3A Filesystem</description>
      </property>
      

      然后将hbase-site.xml中的hbase根目录url修改如下。

        <property>
          <name>hbase.rootdir</name>
          <value>s3a://bucketname/</value>
        </property>
      

      您还可以设置其他与 s3a 相关的属性。有关 s3a 的更多详细信息,请参阅以下链接。 https://hadoop.apache.org/docs/current/hadoop-aws/tools/hadoop-aws/index.html

      【讨论】:

      • 1.您不需要设置 fs.s3a.impl 值;在 hadoop-common/core-default/xml 中完成
      猜你喜欢
      • 2018-11-02
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 2020-04-23
      相关资源
      最近更新 更多