如何从非EMR节点访问S3上的Hbase
How to access Hbase on S3 in from non EMR node
我正在尝试访问 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
核心-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”class 的罐子:
/usr/share/aws/emr/emrfs/lib/emrfs-hadoop-assembly-2.44.0.jar
此 jar 仅存在于 emr 节点上,不能作为 maven 依赖项包含在来自 maven public repo 的 java 项目中。对于 Map/Reduce 作业和 Spark 作业,在 class 路径中添加 jar 位置将达到目的。对于 emr 集群节点外的 java 应用程序 运行,将 jar 添加到 class 路径将不起作用,因为 ecs 实例中没有该 jar。手动将 jar 添加到 classpath 将导致以下错误。
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。是否有解决此问题的方法?
我使用 s3a 解决了这个问题。 emr 中使用的 EMRFS 库不是 public,不能在 EMR 之外使用。因此,我使用 S3AFileSystem 从我的 ecs 集群访问 S3 上的 hbase。添加 hadoop-aws
和 aws-java-sdk-bundle
对应你的hadoop版本的maven依赖。
并在我的核心中添加以下 属性-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 的更多详细信息,请参阅下面的 link。
https://hadoop.apache.org/docs/current/hadoop-aws/tools/hadoop-aws/index.html
S3 不是“真正的”文件系统 - 它没有 hbase 需要的两件事
- 压缩需要原子重命名
- hsync() 到 flush/sync 预写日志。
使用S3作为HBase后端
- S3a 周围有一个文件系统包装器“HBoss”,它执行压缩所需的锁定。
- 您仍然必须为 WAL 使用 HDFS 或其他一些真正的 FS
进一步阅读 [https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/src/site/markdown/filesystem/outputstream.md]
我正在尝试访问 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
核心-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”class 的罐子:
/usr/share/aws/emr/emrfs/lib/emrfs-hadoop-assembly-2.44.0.jar
此 jar 仅存在于 emr 节点上,不能作为 maven 依赖项包含在来自 maven public repo 的 java 项目中。对于 Map/Reduce 作业和 Spark 作业,在 class 路径中添加 jar 位置将达到目的。对于 emr 集群节点外的 java 应用程序 运行,将 jar 添加到 class 路径将不起作用,因为 ecs 实例中没有该 jar。手动将 jar 添加到 classpath 将导致以下错误。
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。是否有解决此问题的方法?
我使用 s3a 解决了这个问题。 emr 中使用的 EMRFS 库不是 public,不能在 EMR 之外使用。因此,我使用 S3AFileSystem 从我的 ecs 集群访问 S3 上的 hbase。添加 hadoop-aws
和 aws-java-sdk-bundle
对应你的hadoop版本的maven依赖。
并在我的核心中添加以下 属性-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 的更多详细信息,请参阅下面的 link。 https://hadoop.apache.org/docs/current/hadoop-aws/tools/hadoop-aws/index.html
S3 不是“真正的”文件系统 - 它没有 hbase 需要的两件事
- 压缩需要原子重命名
- hsync() 到 flush/sync 预写日志。
使用S3作为HBase后端
- S3a 周围有一个文件系统包装器“HBoss”,它执行压缩所需的锁定。
- 您仍然必须为 WAL 使用 HDFS 或其他一些真正的 FS
进一步阅读 [https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/src/site/markdown/filesystem/outputstream.md]