如何从非emr节点访问中的s3上的hbase

3ks5zfa0  于 2021-07-15  发布在  Hbase
关注(0)|答案(2)|浏览(780)

我正在尝试访问emr上的hbase,以便从运行在emr集群节点外部的java应用程序进行读写。工业工程;来自运行在ecs cluster/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 public 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。有什么办法可以解决这个问题吗?

w1e3prcc

w1e3prcc1#

我用s3a解决了这个问题。emr中使用的emrfs lib不是公共的,不能在emr之外使用。因此,我使用s3afilesystem从ecs集群访问s3上的hbase。添加 hadoop-aws 以及 aws-java-sdk-bundle 与hadoop版本相对应的maven依赖项。并在my 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://ncsdevhbase/</value>
  </property>

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

lnxxn5zx

lnxxn5zx2#

s3不是一个“真正的”文件系统—它没有hbase需要的两样东西
压缩所需的原子重命名
hsync()刷新/同步预写日志。
使用s3作为hbase后端
s3a有一个文件系统 Package 器,“hboss”完成压缩所需的锁定。
您必须仍然使用hdfs或其他一些真正的fs来实现wal
进一步阅读[https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/src/site/markdown/filesystem/outputstream.md]

相关问题