当前位置: 首页 > 知识库问答 >
问题:

java - 为什么 hbase 无法运行在 docker 中?

东郭承业
2023-07-18

我需要让 hbase 跑在 arm 上

而且想用 docker

所以我写了下面的 Dockerfile

FROM python:3.10-buster RUN . /etc/os-release && cat > /etc/apt/sources.list <<EOF    deb http://mirrors.tuna.tsinghua.edu.cn/debian/ ${VERSION_CODENAME} main contrib non-free    deb http://mirrors.tuna.tsinghua.edu.cn/debian/ ${VERSION_CODENAME}-updates main contrib non-free    deb http://mirrors.tuna.tsinghua.edu.cn/debian/ ${VERSION_CODENAME}-backports main contrib non-free    deb http://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-freeEOFRUN apt-get updateRUN apt-get install -y vimRUN apt-get install -y openjdk-11-jdkRUN apt-get install -y wgetWORKDIR /rootRUN wget -P /root https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.4.17/hbase-2.4.17-src.tar.gzRUN tar xvf /root/hbase-2.4.17-src.tar.gz
我先跑在 x86 上,看看 ok 不 ok ,所以上面的 java home 是 amd64 的

但是不行

╰─➤  docker run --rm -it ponponon/hbase-arm bash               root@97bc49430241:~# cd /root/hbase-2.4.17root@97bc49430241:~/hbase-2.4.17# root@97bc49430241:~/hbase-2.4.17# root@97bc49430241:~/hbase-2.4.17# HBASE_HOME=/root/hbase-2.4.17 JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar bash bin/hbase-daemon.sh start master running master, logging to /root/hbase-2.4.17/logs/hbase--master-97bc49430241.out/root/hbase-2.4.17/bin/hbase-daemon.sh: line 92: kill: (29) - No such processCaused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.master.HMaster

在我的虚拟机上,直接 JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 bash bin/hbase-daemon.sh start master 就行了!

我的虚拟机是 ubuntu18.04,可以直接 sudo apt install openjdk-8-jdk,所以有 jdk8,但是用的 debian10 已经没有 debian8 了,我就用 jdk11 了

https://hbase.apache.org/book.html#java

图片.png

不知道是不是因为 jdk11 引起的


应该不是 jdk 的问题,因为我换成 ubuntu20 的镜像之后,安装 jdk8 之后也是不行

FROM ubuntu:focalRUN . /etc/os-release && cat > /etc/apt/sources.list <<EOFdeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiversedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiversedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiversedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverseEOFRUN apt-get updateRUN apt-get install -y vimRUN apt-get install -y openjdk-8-jdkRUN apt-get install -y wgetWORKDIR /rootRUN wget -P /root https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.4.17/hbase-2.4.17-src.tar.gzRUN tar xvf /root/hbase-2.4.17-src.tar.gzRUN echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64" | tee -a /etc/profile >/dev/null
注意,这是 arm 版本

docker run --rm -it ponponon/hbase-arm-focal bash

root@d36c7ca4a53d:~/hbase-2.4.17# JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64 bash bin/hbase-daemon.sh start masterrunning master, logging to /root/hbase-2.4.17/bin/../logs/hbase--master-d36c7ca4a53d.out/root/hbase-2.4.17/bin/hbase-daemon.sh: line 92: kill: (267) - No such process

不是用 harisekhon/hbase 是因为在 apple arm mac 上会报错 TTransportException: TTransportException(type=4, message='TSocket read 0 bytes')

version: "3"services:  hbase:    container_name: hbase    image: harisekhon/hbase:2.1    restart: always    ports:      - "2181:2181"      - "8080:8080"      - "8085:8085"      - "9090:9090"      - "9095:9095"      - "16000:16000"      - "16010:16010"      - "16201:16201"      - "16020:16020"      - "16030:16030"      - "16301:16301"

启动容器

─➤  docker-compose up -d                             [+] Building 0.0s (0/0)                                                                                                                           [+] Running 1/0 ⠿ Container hbase                                                                                                                                [+] Running 1/2.1s  ⠿ Container hbase                                                                                                                                [+] Running 1/2.2s  ⠿ Container hbase                                                                                                                                [+] Running 2/2.3s  ✔ Container hbase                                                                                                                                      Started0.3s  ! hbase The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested 0.0s 

使用下面的 python 脚本连接

import happybase# 定义HBase连接信息host = '192.168.38.191'  # HBase主机名或IP地址host = '127.0.0.1'  # HBase主机名或IP地址port = 9090  # HBase端口,默认为9090# 建立HBase连接connection = happybase.Connection(host=host, port=port)# 获取所有表名table_names = connection.tables()# 删除所有表print('删除所有表')for table_name in table_names:    connection.delete_table(table_name, disable=True)table_name = 'my_table'  # 表名column_families = {    'cf1': dict(),  # 第一个列族    'cf2': dict()   # 第二个列族}# 建立HBase连接connection = happybase.Connection(host=host, port=port)# 创建表print('创建表')connection.create_table(table_name, column_families)# 获取表对象table = connection.table(table_name)# 插入数据print('插入数据')row_key = 'row1'data = {    'cf1:column1': 'value1',    'cf1:column2': 'value2',    'cf2:column3': 'value3'}table.put(row_key, data)# 获取数据row = table.row(row_key)print(row)# 扫描数据print('读取数据')scan_result = table.scan(row_start=row_key, row_stop=row_key)for key, value in scan_result:    print(key, value)# 删除数据table.delete(row_key)# 关闭连接connection.close()

会报错

─➤  python -u "/Users/ponponon/Desktop/code/me/ideaboom/5.py"Traceback (most recent call last):  File "/Users/ponponon/Desktop/code/me/ideaboom/5.py", line 14, in <module>    table_names = connection.tables()  File "/Users/ponponon/.local/share/virtualenvs/ideaboom-B0dr_aXc/lib/python3.10/site-packages/happybase/connection.py", line 242, in tables    names = self.client.getTableNames()  File "/Users/ponponon/.local/share/virtualenvs/ideaboom-B0dr_aXc/lib/python3.10/site-packages/thriftpy2/thrift.py", line 219, in _req    return self._recv(_api)  File "/Users/ponponon/.local/share/virtualenvs/ideaboom-B0dr_aXc/lib/python3.10/site-packages/thriftpy2/thrift.py", line 231, in _recv    fname, mtype, rseqid = self._iprot.read_message_begin()  File "thriftpy2/protocol/cybin/cybin.pyx", line 463, in cybin.TCyBinaryProtocol.read_message_begin  File "thriftpy2/protocol/cybin/cybin.pyx", line 68, in cybin.read_i32  File "thriftpy2/transport/buffered/cybuffered.pyx", line 65, in thriftpy2.transport.buffered.cybuffered.TCyBufferedTransport.c_read  File "thriftpy2/transport/buffered/cybuffered.pyx", line 69, in thriftpy2.transport.buffered.cybuffered.TCyBufferedTransport.read_trans  File "thriftpy2/transport/cybase.pyx", line 61, in thriftpy2.transport.cybase.TCyBuffer.read_trans  File "/Users/ponponon/.local/share/virtualenvs/ideaboom-B0dr_aXc/lib/python3.10/site-packages/thriftpy2/transport/socket.py", line 131, in read    raise TTransportException(type=TTransportException.END_OF_FILE,thriftpy2.transport.base.TTransportException: TTransportException(type=4, message='TSocket read 0 bytes')

共有2个答案

步浩壤
2023-07-18

解决了,可看: 借助 Docker 在 Arm 设备上运行 Hbase

尹凌龙
2023-07-18

你直接使用hbase的基础镜像不就行了

docker run -d -h 127.0.0.1 -p 2181:2181 -p 8080:8080 -p 8085:8085 -p 9090:9090 -p 9000:9000  -p 9095:9095  -p 16000:16000  -p 16010:16010  -p 16201:16201  -p 16301:16301 -p 16020:16020 --name hbase  harisekhon/hbase

如果想自己改造就
Dockerfile

FROM harisekhon/hbasexxxxxxx.......
 类似资料:
  • 问题内容: 我目前正在尝试从管道中将groovy脚本作为节点之一运行,但是遇到了以下错误: 另外,我尝试以Groovy的方式安装插件,但由于某种原因,它将无法安装。每当我刷新工具页面时,安装程​​序就会消失。我安装groovy错误吗?请帮忙! 编辑:相关数据 而且ideainspect.groovy文件是shebang的可执行文件,这可能是问题所在。 问题答案: 您的jenkins用户在使用它时会

  • 问题内容: 我的脚本无法执行并抛出 。为什么这样? Dockerfile: docker-entrypoint.sh: 作品 Dockerfile: 问题答案: 该图像不包含您尝试用shebang调用的图像。您应该将其更改为脚本,或者将其删除。

  • 问题内容: 我正在尝试确定elasticsearch实例是否正在运行,但它似乎不是: 和 和 UPD 我的elasticsearch.log: 问题答案: 当启动失败时,Elasticsearch服务初始化脚本不会在控制台或日志文件上显示任何错误信息,而是荒谬地显示。 您必须使用与初始化脚本相同的用户和参数来手动运行elaticsearch,以检查出了什么问题。错误消息将打印在控制台上。 在安装了

  • 我在进行容器化部署过程中,配置完镜像后发现无法重启docker,一直在重启中,具体如下图所示。 尝试以下三种解决方案,都无法解决问题: 1、通过ps -ef | grep docker 并通过 kill -9 杀死相关进程。 2、重启服务器。 3、通过百度搜索相关资料。

  • 但是只有使用运行它才允许用户通过终端与容器化进程交互。所以我想知道,“分配一个伪tty”是什么意思,因为即使在没有的情况下运行,进程写入的内容也会传递到终端(进程将有一个管道作为stdout,而不是tty)? 我读到这个答案说,您可以运行来获得“终端支持”,例如文本着色等。我已经做了以下实验: 并运行此映像,不使用。因为我是从终端运行它(总是从某个终端运行,不是吗?)我能看到一个红色的“你好世界”

  • 我使用以以下命令开头mysql映像 当docker在后台运行时,另一个应用程序连接到端口3306大约需要一分钟的时间。 之后,我用停止这个容器,然后用启动它。在第二种情况下,使用start命令,应用程序可以连接到端口3306,仅在5秒后。 现在我用从停止的容器中获取快照,并用运行它,但是在这种情况下,应用程序可以在一分钟后连接到mysql2! 所以, 是否有任何方法在运行容器后采取快照,可以在10