0


【李老师云计算】HBase+Zookeeper部署及Maven访问(HBase集群实验)

索引

前言

本篇博客内容大部分参考了涛哥的博客,在此基础上进行了整合、补充以及融合了我自己的操作,向学长表示敬意!

本次操作,为什么说是操作不是实验呢,因为这个不算课内的作业,而是必须要完成的额外任务,是在完成了【李老师云计算】实验一:Hadoop伪分布式集群部署与Eclipse访问Hadoop进行单词计数统计的前提下进行的。
后来又布置了一个新的实验也添加上了。

共分成四大部分,第一部分是Zookeeper的搭建,第二部分是HBase的搭建,第三部分是Maven访问,以及第四部分HBase集群实验。

带★的是可能遇到的问题可以看一下,以防后续操作出问题。

内容可能来自博主自己手搓、吸取同学的经验、网络上内容的整合等等,仅供参考,更多内容可以查看大三下速通指南专栏。

1. Zookeeper

ZooKeeper是一个分布式应用程序协调服务,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

1.1 主机下载Zookeeper安装包

Apache官方下载地址

我下载的版本是

  1. apache-zookeeper-3.7.1-bin.tar

image.png

1.2 主机解压Zookeeper

将下载好的文件放到Master节点下的

  1. /usr/local/

目录下

image.png

在该目录下右键打开终端(确保路径是

  1. local

)使用以下指令:

  1. tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz

(根据自己下载的版本修改)

image.png

之后再继续使用以下指令:

  1. mv apache-zookeeper-3.7.1-bin zookeeper

来把目录的版本号去掉(方便之后的操作)

当然上面的操作也可以直接右键文件夹重命名为

  1. zookeeper

。总之就是最终把解压出来的文件重命名为

  1. zookeeper

即可。

image-20230413155002291.png

1.3 ★解决解压后文件缺失

如果从桌面向虚拟机拖文件,可能压缩包没有完全的导入。

如果出现了下面的错误反而不会导入失败,只需要点击重试就可以了。

image.png

如果说压缩包的大小不一样就说明导入时出现错误了,可以尝试多导入几次或者用其他方法通过虚拟机获取。

image.png

1.4 主机配置Zookeeper文件

1.4.1 配置zoo_sample.cfg文件

进入到

  1. /usr/local/zookeeper/conf

目录下。

首先把

  1. zoo_sample.cfg

重命名为

  1. zoo.cfg

,同样两种方法,使用下面的指令(确保此时终端位置是

  1. conf

):

  1. cp zoo_sample.cfg zoo.cfg

或者直接右键重命名都可以。

编辑

  1. zoo.cfg

文件,将第12行的

  1. dataDir=/tmp/zookeeper

并修改为

  1. dataDir=/usr/local/zookeeper/data/


然后在文件末尾添加以下内容(注意把slave改成自己的slave主机名):

  1. server.1=0.0.0.0:2881:3881
  2. server.2=slave1-60:2881:3881
  3. server.3=slave2-60:2881:3881

上面本机是

  1. 0.0.0.0:2881:3881

,另外两台机器都是

  1. 主机名:2881:3881

1.4.2 配置/data/myid文件

创建并配置

  1. /data/myid

文件,执行以下指令即可:

  1. mkdir -p /usr/local/zookeeper/data
  2. cd /usr/local/zookeeper/data
  3. touch myid
  4. vi myid

打开

  1. myid

文件后写入数字

  1. 1

**注意保证

  1. myid

文件中只有数字

  1. 1

没有多余的内容(包括空格、换行、注释等),如果之后出现错误,请查看此文件。**

1.5 主机传输Zookeeper文件到从机

因为配置Hadoop时已经关闭了防火墙,这里默认已经关闭了。

上面把master配置完了,我们可以直接把所有的文件都传输给从机,包括Zookeeper及其配置文件等。

把下面

  1. slave1-xx

以及

  1. slave2-xx

修改为自己的即可。

  1. scp -r /usr/local/zookeeper slave1-60:/usr/local
  2. scp -r /usr/local/zookeeper slave2-60:/usr/local

1.6 从机修改Zookeeper文件

虽然传过来了配置文件,但是还是要进行修改!

1.6.1 修改zoo.cfg文件

文件的路径是

  1. /usr/local/zookeeper/conf/zoo.cfg

打开以后

  1. dataDir

我们已经在主机修改过了就不需要修改了。

把刚才在文件末尾添加的三行修改为以下内容(根据自己的slave主机名修改)

slave1:

  1. server.1=master60:2881:3881
  2. server.2=0.0.0.0:2881:3881
  3. server.3=slave2-60:2881:3881

slave2:

  1. server.1=master60:2881:3881
  2. server.2=slave1-60:2881:3881
  3. server.3=0.0.0.0:2881:3881

1.6.2 修改myid文件

文件的路径是

  1. /usr/local/zookeeper/data/myid

在slave1中内容修改为数字

  1. 2

,在slave2中内容修改为数字

  1. 3

**注意保证

  1. myid

文件中只有数字

  1. 2

  1. 3

没有多余的内容(包括空格、换行、注释等),如果之后出现错误,请查看此文件。**

1.7 设置环境变量

三台虚拟机上都进行以下的操作:

  1. vi ~/.bashrc

进入

  1. .bashrc

文件。

在文件末尾添加以下内容并

  1. wq

保存退出:

  1. export PATH=$PATH:/usr/local/zookeeper/bin

最后使用

  1. source ~/.bashrc

来刷新环境变量。

在三台虚拟机都完成了以上操作之后进行下一步。

1.8 启动Zookeeper

Zookeeper的命令如下:

  1. 启动命令 zkServer.sh start
  2. 重启命令 zkServer.sh restart
  3. 关闭命令 zkServer.sh stop
  4. 状态命令 zkServer.sh status

三台虚拟机上都使用指令打开Zookeeper:

  1. zkServer.sh start

如果每个节点都显示以下提示说明到这里为止没什么问题。

PotPlayerMini64_Ey7GFVctiV.png

使用

  1. zkServer.sh status

查看状态可以发现其中一个是

  1. Mode:leader

另外两个是

  1. Mode:follower

,谁是

  1. leader

无所谓不必在意。

1.9 ★解决无法启动Zookeeper

Zookeeper运行产生的data数据都在刚才创建的

  1. /usr/local/zookeeper/data/

目录中,如果没有使用

  1. zkServer.sh stop

关闭Zookeeper而关闭虚拟机可能会产生问题,此时删除该目录下除

  1. myid

以外的所有文件即可。

1.10 验证Zookeeper安装成功

在master使用以下指令(修改为自己的master主机名):

  1. zkCli.sh -server master60:2181

之后会出现以下的命令框:

image.png

依次使用下面指令对照下图即可:

  1. create /nihao nihao!
  2. get /nihao
  3. quit

image.png

至此,Zookeeper成功安装。

1.11 ★解决找不到JAVA_HOME

如果没有遇到这个问题就别改

找到一个JDK路径添加进去

  1. vi /etc/profile

(不要直接复制粘贴下面的)
注意区别JDK和JRE,JDK的目录里有bin文件也有JRE文件,然后JRE里还有一个bin文件。

我这里用的应该是当时用yum指令生成的另一个JDK。在里面添加:

  1. JAVA_HOME=java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64
  2. JRE_HOME=java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64/jre
  3. PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
  4. CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

地址一定是JDK而不是JRE。JDK文件里有一个bin并且有一个jre并且jre里也有一个bin,具体什么是JDK什么是JRE请参考菜鸟教程。

  1. source /etc/profile

刷新。

2. HBase

2.1 主机下载HBase

Apache官方下载地址

我下载的版本是

  1. hbase-2.2.2-bin.tar.gz

chrome_05oBAMOM0K.png

2.2 主机解压HBase

将下载好的文件放到Master节点下的

  1. /usr/local/

目录下.

在该目录下右键打开终端(确保路径是

  1. local

)使用以下指令:

  1. tar -zxvf hbase-2.2.2-bin.tar.gz

(根据自己下载的版本修改)

之后再继续使用以下指令:

  1. mv /usr/local/hbase-2.2.2 /usr/local/hbase

来把目录的版本号去掉(方便之后的操作)

当然上面的操作也可以直接右键文件夹重命名为

  1. hbase

。总之就是最终把解压出来的文件重命名为

  1. hbase

即可。

image.png

2.3 主机配置HBase文件

目录的路径是

  1. /usr/local/hbase/conf

,直接通过GUI进行操作即可。

2.3.1 hbase-env.sh文件

文件末尾添加以下内容,根据自己的情况修改。

  1. export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64
  2. export HBASE_CLASSPATH=/user/hadoop/hadoop-3.3.1/etc/hadoop
  3. export HBASE_MANAGES_ZK=false
  1. JAVA_HOME

之前配置过,如

  1. Hadoop

  1. /etc/hadoop

  1. hadoop-env.sh

中有出现过。·

  1. HBASE_CLASSPATH

后面是

  1. Hadoop/etc/hadoop

请根据自己

  1. Hadoop

的路径修改。

2.3.2 hbase-site.xml文件

文件末尾添加以下内容,根据自己的情况修改。注意!

  1. configuration

标签在文件中已经给出,请覆盖掉,否则会出现错误。

主要是把

  1. value

标签内的东西给修改成自己的!!

  1. <configuration><property><name>hbase.cluster.distributed</name><value>true</value></property><property><name>hbase.rootdir</name><value>hdfs://Master60:9000/hbase</value></property><property><name>hbase.zookeeper.quorum</name><value>Master60,Slave1-60,Slave2-60</value><description>The directory shared by RegionServers. </description></property><property><name>hbase.unsafe.stream.capability.enforce</name><value>false</value></property><property><name>hbase.zookeeper.property.dataDir</name><value>/usr/local/zookeeper</value></property></configuration>
  1. hdfs://Master60:9000/hbase

的端口一般就是

  1. 9000

,如果在

  1. Hadoop

中修改过,请查看

  1. Hadoop/etc/hadoopcore-site.xml

文件。

2.3.3 regionservers文件

删掉原有的

  1. localhost

,添加两台从机的主机名

  1. slave1-60
  2. slave2-60

2.4 主机配置环境变量

使用指令

  1. vi ~/.bashrc

添加下面的内容:

  1. export HBASE_HOME=/usr/local/hbase
  2. export PATH=$HBASE_HOME/bin:$PATH
  3. export PATH=$HBASE_HOME/lib:$PATH

  1. source ~/.bashrc

刷新。

2.5 主机最后的调整

使用

  1. hbase version

指令,可能出现的错误有以下两种:

image.png

下面依次讲解如何解决以上错误

2.5.1 ★解决错误:找不到或无法加载主类 org.apache.hadoop.hbase.util.GetJavaProperty

进入到

  1. usr/local/hbase/bin

目录下,我们来修改

  1. hbase

文件。

共修改四处。

首先在大概327行附近修改两处

image.png

第一处在

  1. if [ -n "${HADOOP_IN_PATH}" ] && [ -f "${HADOOP_IN_PATH}" ]; then

下面添加的代码如下:

  1. # If built hbase, temporarily add hbase-server*.jar to classpath for GetJavaProperty
  2. # Exclude hbase-server*-tests.jar
  3. temporary_cp=
  4. for f in "${HBASE_HOME}"/lib/hbase-server*.jar; do
  5. if [[ ! "${f}" =~ ^.*\-tests\.jar$ ]]; then
  6. temporary_cp=":$f"
  7. fi
  8. done

第二处将

  1. HADOOP_JAVA_LIBRARY_PATH=$(HADOOP_CLASSPATH="$CLASSPATH" "${HADOOP_IN_PATH}" \

修改为

  1. HADOOP_JAVA_LIBRARY_PATH=$(HADOOP_CLASSPATH="$CLASSPATH${temporary_cp}" "${HADOOP_IN_PATH}" \

最后第三处、第四处在大概187行附近

image.png

第三处在下面代码的下面

  1. add_to_cp_if_exists "${HBASE_HOME}/hbase-server/target"
  2. fi
  3. fi

添加以下内容:

  1. # Needed for GetJavaProperty check below
  2. add_to_cp_if_exists "${HBASE_HOME}/hbase-server/target/classes"

第四处把一段代码删除,要删除的代码如下:

  1. #add the hbase jars for each module
  2. for f in $HBASE_HOME/hbase-jars/hbase*.jar; do
  3. if [[ $f = *sources.jar ]]
  4. then
  5. : # Skip sources.jar
  6. elif [ -f $f ]
  7. then
  8. CLASSPATH=${CLASSPATH}:$f;
  9. fi
  10. done

2.5.2 ★解决SLF4J:…

具体原因就是hadoop和hbase都有同一个jar包所以产生了冲突,因此只需要删除其中一个就可以了,这里删除hbase的文件。

因为

  1. rm -rf

指令删除无法恢复请确保路径正确!如果错误删除只能重新解压HBase开始做。

后面的路径最好是直接复制报错中出现的

  1. rm -rf /usr/local/hbase/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar

image.png

2.6 主机传输HBase文件到从机

先把

  1. HBase

传给从机(改为自己的主机名):

  1. scp -r /usr/local/hbase slave1-60:/usr/local/
  2. scp -r /usr/local/hbase slave2-60:/usr/local/

把配置文件也传给从机:

  1. scp -r ~/.bashrc slave1-60:~
  2. scp -r ~/.bashrc slave2-60:~

记得给从机刷新一下配置文件:

  1. source ~/.bashrc

2.7 主机启动HBase

一定要记住这条常用的命令:

  • 启动HBase集群: start-hbase.sh
  • 关闭HBase集群: stop-hbase.sh

在主机启动HBase。

  1. jps

看一下主机有没有

  1. HMaster

以及

  1. QuorumPeerMain

从机有没有

  1. QuorumPeerMain

以及

  1. HRegionServer

2.8 Hbase Shell

使用指令

  1. hbase shell

在内置命令行输入

  1. version

以及

  1. status

来测试。

image.png

2.9 终极HBase测试

打开浏览器,输入网址

  1. 192.168.64.60:16010

(主机名或IP:16010),能打开这个并且看到两台机器就没啥问题了。

image.png

还能看到Zookeeper的设置

image.png

2.10 ★遇到解决不了的问题

当你肯定自己的配置文件一点问题也没有,但是还是无法成功运行。
重启三台虚拟机然后再(3.9)

打开Hadoop 主机使用

  1. start-all.sh

打开Zookeeper 三台虚拟机使用

  1. zkServer.sh start

;

打开HBase 主机使用

  1. start-hbase.sh

3.Maven访问HBase

3.1 主机下载Maven

Apache官方下载地址

我下载的版本是

  1. apache-maven-3.6.3-bin.tar.gz

image.png

3.2 主机解压Maven

将下载好的文件放到Master节点下的

  1. /usr/local/

目录下.

在该目录下右键打开终端(确保路径是

  1. local

)使用以下指令:

  1. tar -zxvf apache-maven-3.6.3-bin.tar.gz

(根据自己下载的版本修改)

之后再继续使用以下指令:

  1. mv /usr/local/apache-maven-3.6.3 /usr/local/maven

来把目录的版本号去掉(方便之后的操作)

当然上面的操作也可以直接右键文件夹重命名为

  1. maven

。总之就是最终把解压出来的文件重命名为

  1. maven

即可。

image.png

3.3 配置环境变量

使用指令

  1. vi /etc/profile

文件末尾添加:

  1. MAVEN_HOME=/usr/local/maven
  2. PATH=$PATH:$MAVEN_HOME/bin
  3. export PATH MAVEN_HOME

刷新

  1. source /etc/profile

查看一下

  1. mvn -version

image.png

3.4 设置阿里云镜像

这个是为了加快依赖包的下载。

此时的文件路径是

  1. /usr/local/maven/conf/

打开

  1. settings.xml

,大概在151行附近的

  1. mirrors

标签中添加以下内容:

  1. <mirror>
  2. <id>aliyunmaven</id>
  3. <mirrorOf>*</mirrorOf>
  4. <name>阿里云公共仓库</name>
  5. <url>https://maven.aliyun.com/repository/public</url>
  6. </mirror>

image.png

3.5 Maven项目

这一步可以只做3.5.1后面的想试一下也可以。3.6的开始会把3.5.1以外产生的文件全部清除。

3.5.1 创建项目

创建一个工作目录

  1. mkdir -p ~/workspace/source

Typora_hep1nTkNUX.png

进入

  1. workspace/source

中右键终端。

使用指令

  1. mvn archetype:generate

如果提示没有

  1. mvn

,再用一遍

  1. source /etc/profile


首先会出现第一个暂停的点,在这个7后面直接回车。
image.png

之后会让你手动输入几个参数:

包括

  1. gtoupId

  1. artifactId

  1. version

  1. package

我分别用的

  1. com.test

  1. maven_test

、回车、

  1. main

(用maven-archetype-quickstart没编译成功,因此后面改成了main)

image.png
最后会出现一个

  1. Y

,直接回车就可以,最后看到

  1. BUILD SUCCESS

image.png

最终成功之后我们可以看到

  1. source

里出现了一个新的目录,目录名是刚才设置的

  1. artifactId

参数。

image.png
如果想了解一下具体Maven模板是什么可以看菜鸟教程。

3.5.2 如何编译项目

进入生成的目录,具体路径是

  1. /workspace/source/maven_test

右键打开终端,输入指令

  1. mvn compile

我这边总是莫名奇妙用不了

  1. mvn

然后刷新一次才可以用。

image.png

可以看到生成了一个

  1. target

目录

image.png

3.5.3 如何测试项目

路径仍然是

  1. /workspace/source/maven_test

右键终端使用指令

  1. mvn test

image.png

  1. target

目录里又会生成

  1. test-classes

目录。

image.png

3.5.4 如何打包项目

路径仍然是

  1. /workspace/source/maven_test

右键终端使用指令

  1. mvn package

image.png

  1. target

目录内生成了

  1. maven_test-1.0-SNAPSHOT.jar

压缩包

image.png

3.5.5 如何安装项目

路径仍然是

  1. /workspace/source/maven_test

右键终端使用指令

  1. mvn install

image.png

安装到的路径如上红框所示。

3.6 Eclipse打开Maven项目

路径仍然是

  1. /workspace/source/maven_test

右键终端使用指令

  1. mvn clean

image.png

此时

  1. targer

目录被清除。

执行下面两条指令:

  1. cd ~/.m2
  2. chmod 777 repository

之后我们打开eclipse,进入以后

image.png

之后

image.png

这里的

  1. User Settings

打开的是maven的

  1. conf/settings.xml

,如果按照上面来,位置应该是

  1. /usr/local/maven/conf/settings.xml

点击

  1. Apply

继续下一个设置。

image.png

这里的路径是maven所在的位置。

然后选择刚创建的这个

image.png

最后我们去给当时创建Maven项目时自动产生的

  1. App.java

修改权限。

  1. chmod 777 App.java

image.png

3.7 Maven访问HBase

先把hbase拷贝一份给maven的工作目录

  1. cp -a /usr/local/hbase ~/workspace/source/maven_test/HBase/

然后再Eclipse中打开项目。

image.png

之后打开这个

  1. maven_test

项目

image.png

再继续配置

image.png

把所有jar包给加载了,如果你有

  1. class xx

  1. model xx

,导入到

  1. class

里,我这里是没有这两个文件夹的。

image.png

可以先

  1. ctrl+A

全选

  1. ctrl+鼠标左键

把目录(没有文件大小的)给取消了,然后就可以导入了。

然后再打开目录把目录里的jar包也给导入了。

  1. maven_test

建一个

  1. conf

目录复制一份文件(直接复制也行)

  1. cp -a ~/workspace/source/maven_test/HBase/conf/hbase-site.xml ~/workspace/source/maven_test/conf/

image.png

  1. pom.xml

开个权限

  1. chmod 777 ~/workspace/source/maven_test/pom.xml

按照下图再添加一下

image.png

image.png

image.png

如果找不到,右键项目文件(maven_test)然后刷新(Refresh)。

重新回到Eclipse,在

  1. pom.xml

中新加一个dependency标签

  1. <dependency>
  2. <groupId>org.slf4j</groupId>
  3. <artifactId>slf4j-simple</artifactId>
  4. <version>1.7.25</version>
  5. <scope>compile</scope>
  6. </dependency>

image.png

打开

  1. App.java

键入以下代码:

里面有一个主机名,修改成自己的。

  1. packagemain;importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.HBaseConfiguration;importorg.apache.hadoop.hbase.HColumnDescriptor;importorg.apache.hadoop.hbase.HTableDescriptor;importorg.apache.hadoop.hbase.TableName;importorg.apache.hadoop.hbase.client.Admin;importorg.apache.hadoop.hbase.client.Connection;importorg.apache.hadoop.hbase.client.ConnectionFactory;importorg.apache.hadoop.hbase.client.HTable;importorg.apache.hadoop.hbase.client.Put;importorg.apache.hadoop.hbase.regionserver.BloomType;importorg.apache.hadoop.hbase.util.Bytes;publicclassApp{staticConfiguration conf=HBaseConfiguration.create();staticConnection connection;publicstaticvoidmain(String[] args ){String tablename="hbase_tb";try{App.getConnect();App.createTable(tablename);App.addData(tablename);}catch(Exception e){ e.printStackTrace();}}publicstaticvoidgetConnect()throwsIOException{
  2. conf.set("hbase.zookeeper.quorum","master60");
  3. conf.set("hbase.zookeeper.property.clientPort","2181");//conf.set("zookeeper.znode.parent", "/hbase");try{ connection=ConnectionFactory.createConnection(conf);}catch(IOException e){}}//创建一张表,通过HBaseAdmin HTableDescriptor来创建 publicstaticvoidcreateTable(String tablename)throwsException{TableName tableName=TableName.valueOf(tablename);Admin admin = connection.getAdmin();if(admin.tableExists(tableName)){
  4. admin.disableTable(tableName);
  5. admin.deleteTable(tableName);System.out.println(tablename +" table Exists, delete ......");}@SuppressWarnings("deprecation")HTableDescriptor desc =newHTableDescriptor(tableName);@SuppressWarnings("deprecation")HColumnDescriptor colDesc =newHColumnDescriptor("cf1");
  6. colDesc.setBloomFilterType(BloomType.ROWCOL);
  7. desc.addFamily(colDesc);
  8. desc.addFamily(newHColumnDescriptor("cf2"));
  9. admin.createTable(desc); admin.close();System.out.println("create table success!");}publicstaticvoidaddData(String tablename)throwsException{HTable table =(HTable)connection.getTable(TableName.valueOf(tablename));Put p1=newPut(Bytes.toBytes("row1"));//row key
  10. p1.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes("name"),Bytes.toBytes("Tom"));
  11. p1.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes("age"),Bytes.toBytes("12"));
  12. p1.addColumn(Bytes.toBytes("cf2"),Bytes.toBytes("math"),Bytes.toBytes("80"));
  13. p1.addColumn(Bytes.toBytes("cf2"),Bytes.toBytes("english"),Bytes.toBytes("90"));
  14. table.put(p1);
  15. table.close();}}

其中向这个分布式数据库中添加的数据是:

image.png

最终呈现的结果是:

vmware_ioRAkdocBe.png

最后检查一下,终端输入

  1. hbase shell

,之后使用

  1. get "hbase_tb","row1"

来获取数据库内容。

image.png

3.8 ★解决代码爆红

比较玄学,我也没搞明白,我再

  1. pom.xml

里添加了两个依赖,不爆红了但是不能运行,然后我又删了,也不爆红也能运行了……

  1. <dependency>
  2. <groupId>org.apache.hbase</groupId>
  3. <artifactId>hbase-server</artifactId>
  4. <version>1.3.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.hbase</groupId>
  8. <artifactId>hbase-client</artifactId>
  9. <version>1.3.1</version>
  10. </dependency>

3.9 ★虚拟机重启后需要进行的操作

打开Hadoop 主机使用

  1. start-all.sh

打开Zookeeper 三台虚拟机使用

  1. zkServer.sh start

;

打开HBase 主机使用

  1. start-hbase.sh

4. HBase集群实验

下面是实验的描述,分的小标题混乱、不知所云,也不知从哪里冒出一个学生信息(下面代码里没写);表内容写的也抽象,后来才明白,是一班的同学写教师表,二班的同学写辅导员表,下面给出的是教师表,用辅导员表的同学只需要改一下参数就好了没有很大的难度。

  1. 1. 搭建HBase集群,一主两从,给出网页的截屏15分。
  2. 2. Eclispe/Idea Maven项目访问HBase
  3. 2.1 表内容
  4. 1班:教师,基本信息:年龄、性别、职称、职务,科研信息:发表文章数、横向项目数、纵向项目数。注意职务和科研信息中的所有属性根据实际确定。
  5. 2班:辅导员,基本信息:年龄、性别、职称、职务,业绩信息:红旗班次数、考研率超额次数、就业率超额次数。注意业绩信息根据实际填写。
  6. 2. 源程序评分
  7. 2.0 导入包和程序结构10
  8. 2.1 创建表源程序和运行结果的截屏10
  9. 2.2 添加三个典型行记录的源程序和运行结果后在HBase shell中看到的结果截屏20
  10. 2.3 浏览所有记录的源程序和运行结果后HBase看到的结果截屏10
  11. 3. HBase Shell浏览所有的学生信息10
  12. 4. 根据浏览到的信息解释HBase的逻辑结构和物理结构15
  13. 5. 分析HBase的插入和MySQL的插入有何不同10分。

4.1 一班的代码

实际上就是上面代码的一个改进版,然后又多加了一个Teacher类(二班同学应该是Counselor类)。先给出一个项目栏的截图:
image.png
新建一个Teacher Class,这里直接用的

  1. public String

是为了减少麻烦。

  1. packagemain;publicclassTeacher{publicString name;publicString age;publicString gender;publicString title;publicString position;publicString articleCount;publicString horizontalProjectCount;publicString verticalProjectCount;// 构造函数publicTeacher(String name,String age,String gender,String title,String position,String articleCount,String horizontalProjectCount,String verticalProjectCount){this.name = name;this.age = age;this.gender = gender;this.title = title;this.position = position;this.articleCount = articleCount;this.horizontalProjectCount = horizontalProjectCount;this.verticalProjectCount = verticalProjectCount;}// getter 和 setter 方法// ...}

以及App.java的内容

  1. packagemain;importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.HBaseConfiguration;importorg.apache.hadoop.hbase.HColumnDescriptor;importorg.apache.hadoop.hbase.HTableDescriptor;importorg.apache.hadoop.hbase.TableName;importorg.apache.hadoop.hbase.client.Admin;importorg.apache.hadoop.hbase.client.Connection;importorg.apache.hadoop.hbase.client.ConnectionFactory;importorg.apache.hadoop.hbase.client.HTable;importorg.apache.hadoop.hbase.client.Put;importorg.apache.hadoop.hbase.regionserver.BloomType;importorg.apache.hadoop.hbase.util.Bytes;publicclassApp{staticConfiguration conf=HBaseConfiguration.create();staticConnection connection;publicstaticvoidmain(String[] args ){String tablename="Teacher";try{App.getConnect();App.createTable(tablename);Teacher t1 =newTeacher("Jack","54","m","AssociateProfessor","Teacher","2","2","2");Teacher t2 =newTeacher("Amy","45","m","AssociateProfessor","Teacher","4","4","4");Teacher t3 =newTeacher("Mike","40","m","Professor","Teacher","6","6","6");App.addData(tablename,t1,"row1");App.addData(tablename,t2,"row2");App.addData(tablename,t3,"row3");}catch(Exception e){ e.printStackTrace();}}publicstaticvoidgetConnect()throwsIOException{
  2. conf.set("hbase.zookeeper.quorum","master60");
  3. conf.set("hbase.zookeeper.property.clientPort","2181");//conf.set("zookeeper.znode.parent", "/hbase");try{ connection=ConnectionFactory.createConnection(conf);}catch(IOException e){}}//创建一张表,通过HBaseAdmin HTableDescriptor来创建 publicstaticvoidcreateTable(String tablename)throwsException{TableName tableName=TableName.valueOf(tablename);Admin admin = connection.getAdmin();if(admin.tableExists(tableName)){
  4. admin.disableTable(tableName);
  5. admin.deleteTable(tableName);System.out.println(tablename +" table Exists, delete ......");}@SuppressWarnings("deprecation")HTableDescriptor desc =newHTableDescriptor(tableName);@SuppressWarnings("deprecation")HColumnDescriptor colDesc =newHColumnDescriptor("basic_info");
  6. colDesc.setBloomFilterType(BloomType.ROWCOL);
  7. desc.addFamily(colDesc);
  8. desc.addFamily(newHColumnDescriptor("research_info"));
  9. admin.createTable(desc); admin.close();System.out.println("create table success!");}publicstaticvoidaddData(String tablename,Teacher t,String key)throwsException{HTable table =(HTable)connection.getTable(TableName.valueOf(tablename));Put p=newPut(Bytes.toBytes(key));//row key
  10. p.addColumn(Bytes.toBytes("basic_info"),Bytes.toBytes("name"),Bytes.toBytes(t.name));
  11. p.addColumn(Bytes.toBytes("basic_info"),Bytes.toBytes("age"),Bytes.toBytes(t.age));
  12. p.addColumn(Bytes.toBytes("basic_info"),Bytes.toBytes("gender"),Bytes.toBytes(t.gender));
  13. p.addColumn(Bytes.toBytes("basic_info"),Bytes.toBytes("title"),Bytes.toBytes(t.title));
  14. p.addColumn(Bytes.toBytes("basic_info"),Bytes.toBytes("position"),Bytes.toBytes(t.position));
  15. p.addColumn(Bytes.toBytes("research_info"),Bytes.toBytes("articleCount"),Bytes.toBytes(t.articleCount));
  16. p.addColumn(Bytes.toBytes("research_info"),Bytes.toBytes("horizontalProjectCount"),Bytes.toBytes(t.horizontalProjectCount));
  17. p.addColumn(Bytes.toBytes("research_info"),Bytes.toBytes("verticalProjectCount"),Bytes.toBytes(t.verticalProjectCount));
  18. table.put(p);
  19. table.close();}}

4.2 二班的代码

二班可以用以下的代码来运行,然后剩下的操作和
Counselor 类

  1. packagemain;publicclassCounselor{publicString name;publicString age;publicString gender;publicString title;publicString position;publicString flagCount;publicStringPostgraduateCount;publicString employmentCount;// 构造函数publicCounselor(String name,String age,String gender,String title,String position,String flagCount,StringPostgraduateCount,String employmentCount){this.name = name;this.age = age;this.gender = gender;this.title = title;this.position = position;this.flagCount = flagCount;this.PostgraduateCount=PostgraduateCount;this.employmentCount = employmentCount;}}

App 类

  1. packagemain;importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.HBaseConfiguration;importorg.apache.hadoop.hbase.HColumnDescriptor;importorg.apache.hadoop.hbase.HTableDescriptor;importorg.apache.hadoop.hbase.TableName;importorg.apache.hadoop.hbase.client.Admin;importorg.apache.hadoop.hbase.client.Connection;importorg.apache.hadoop.hbase.client.ConnectionFactory;importorg.apache.hadoop.hbase.client.HTable;importorg.apache.hadoop.hbase.client.Put;importorg.apache.hadoop.hbase.regionserver.BloomType;importorg.apache.hadoop.hbase.util.Bytes;publicclassApp{staticConfiguration conf=HBaseConfiguration.create();staticConnection connection;publicstaticvoidmain(String[] args ){String tablename="Counselor";try{App.getConnect();App.createTable(tablename);Counselor t1 =newCounselor("Jack","33","m","lecturer","Counselor","2","2","2");Counselor t2 =newCounselor("Amy","30","m","assistant","Counselor","4","4","4");Counselor t3 =newCounselor("Mike","27","m","assistant","Counselor","6","6","6");App.addData(tablename,t1,"row1");App.addData(tablename,t2,"row2");App.addData(tablename,t3,"row3");}catch(Exception e){ e.printStackTrace();}}publicstaticvoidgetConnect()throwsIOException{
  2. conf.set("hbase.zookeeper.quorum","master78");
  3. conf.set("hbase.zookeeper.property.clientPort","2181");//conf.set("zookeeper.znode.parent", "/hbase");try{ connection=ConnectionFactory.createConnection(conf);}catch(IOException e){}}//创建一张表,通过HBaseAdmin HTableDescriptor来创建 publicstaticvoidcreateTable(String tablename)throwsException{TableName tableName=TableName.valueOf(tablename);Admin admin = connection.getAdmin();if(admin.tableExists(tableName)){
  4. admin.disableTable(tableName);
  5. admin.deleteTable(tableName);System.out.println(tablename +" table Exists, delete ......");}@SuppressWarnings("deprecation")HTableDescriptor desc =newHTableDescriptor(tableName);@SuppressWarnings("deprecation")HColumnDescriptor colDesc =newHColumnDescriptor("basic_info");
  6. colDesc.setBloomFilterType(BloomType.ROWCOL);
  7. desc.addFamily(colDesc);
  8. desc.addFamily(newHColumnDescriptor("research_info"));
  9. admin.createTable(desc); admin.close();System.out.println("create table success!");}publicstaticvoidaddData(String tablename,Counselor t,String key)throwsException{HTable table =(HTable)connection.getTable(TableName.valueOf(tablename));Put p=newPut(Bytes.toBytes(key));//row key
  10. p.addColumn(Bytes.toBytes("basic_info"),Bytes.toBytes("name"),Bytes.toBytes(t.name));
  11. p.addColumn(Bytes.toBytes("basic_info"),Bytes.toBytes("age"),Bytes.toBytes(t.age));
  12. p.addColumn(Bytes.toBytes("basic_info"),Bytes.toBytes("gender"),Bytes.toBytes(t.gender));
  13. p.addColumn(Bytes.toBytes("basic_info"),Bytes.toBytes("title"),Bytes.toBytes(t.title));
  14. p.addColumn(Bytes.toBytes("basic_info"),Bytes.toBytes("position"),Bytes.toBytes(t.position));
  15. p.addColumn(Bytes.toBytes("research_info"),Bytes.toBytes("flagCount"),Bytes.toBytes(t.flagCount));
  16. p.addColumn(Bytes.toBytes("research_info"),Bytes.toBytes("PostgraduateCount"),Bytes.toBytes(t.PostgraduateCount));
  17. p.addColumn(Bytes.toBytes("research_info"),Bytes.toBytes("employmentCount"),Bytes.toBytes(t.employmentCount));
  18. table.put(p);
  19. table.close();}}

4.3 代码的一点解释

以一班的代码为例,其中:
image.png
信息是通过构造函数直接搞得,在这里修改成自己的内容!还有表名也在这里修改↑
image.png
这里也改成自己的!
最后打开进入

  1. hbase shell

使用指令

  1. scan 'Teacher'

来查看
image.png

4.3 解释HBase的逻辑结构和物理结构

  1. 1. 逻辑结构:
  2. - 表(Table):HBase 数据库中的基本单元,由多行和多列族组成,每行有唯一的行键(Row Key),每个列族包含多个列(Column)。
  3. - 行(Row):HBase 表中的数据按行存储,每行都有唯一的行键,行键按照字典序排序,可以通过行键查找数据。
  4. - 列族(Column Family):HBase 表中的数据按列族组织,每个列族包含多个列,每个列都有一个唯一的列名(Column Name),列名和列值一起构成了列。
  5. - 列(Column):HBase 表中的数据由多个列组成,每个列由列名、时间戳和列值组成,列名和列值都是字节数组,时间戳是 long 类型的整数。
  6. 2. 物理结构:
  7. - Region ServerHBase 的数据存储和查询都是通过 Region Server 来完成的,Region Server HBase 集群中的一个节点,每个 Region Server 管理多个 Region
  8. - RegionHBase 表的数据被分为多个 Region 存储,每个 Region 是一段连续的行,每个 Region 包含一个主列族和多个次列族,Region 的大小由 HBase 的配置参数决定,通常在几百 MB 到几 GB 之间。
  9. - HFileHBase 数据在磁盘上是按 HFile 的格式存储的,HFile HBase 中的一个重要的数据结构,它是一个稠密的、可变长的文件格式,用于存储一段连续的行。
  10. - WALHBase 中的写操作会先写入 Write Ahead LogWAL),WAL 是一种顺序写入的、不可修改的日志,用于保证数据写入的可靠性和一致性。

4.4 分析HBase的插入和MySQL的插入有何不同10分

  1. 1. 数据模型:
  2. - MySQL 是关系型数据库,其数据存储在表格中,每个表格由一组列和行组成,每行代表一个记录,每列代表一个属性。
  3. - HBase 是基于列族的 NoSQL 数据库,其数据存储在表格中,每个表格由多个列族和行组成,每行代表一个记录,每个列族下包含多个列,每个列可以包含多个版本。
  4. 2. 插入方式:
  5. - MySQL 的插入操作是通过 SQL 语句实现的,使用 INSERT INTO 语句将数据插入到指定的表格中。
  6. - HBase 的插入操作是通过 Java API HBase shell 命令实现的,使用 Put 操作将数据插入到指定的表格中。
  7. 3. 数据存储:
  8. - MySQL 的数据是存储在硬盘中的,每次插入数据时,MySQL 会将数据写入磁盘。
  9. - HBase 的数据是存储在内存中和硬盘中的,每次插入数据时,HBase 会将数据先写入内存中的 MemStore,当 MemStore 中的数据达到一定大小时,会将数据写入硬盘中的 HFile 中。
  10. 4. 性能:
  11. - MySQL 的插入操作通常比 HBase 的插入操作更快,因为 MySQL 的数据存储方式更简单,且 MySQL 的数据通常是存储在本地磁盘上的,而 HBase 的数据存储在内存中和硬盘中,写入操作需要更多的计算资源和磁盘 I/O
  12. - HBase 的查询操作通常比 MySQL 的查询操作更快,因为 HBase 的数据存储方式更适合于大规模数据的存储和查询,且 HBase 支持快速的随机读取和扫描操作。

后记

这一篇博客比上一篇要简单一些,但仍然步步是坑,有同学遇到而我没有遇到问题我同样也加了进来让这篇博客更加的“有用”,基本上写完之后一直到实验真正结束这一期间都在修改完善。
这次有更多的同学在对照鄙人博客进行实验的同时为我指正出没有发现的错误,还有的同学提出了宝贵的意见以及为完善博客提供了代码以及图片,同时我也在和同学们交流的时候整理出了更多解决错误的方法,尽管实验本身没什么意思,但是交流沟通解决问题是一件宝贵的事情,受益匪浅。在此向所有使用本博客以及为本博客提供了帮助的同学表示感谢!


本文转载自: https://blog.csdn.net/qq_34181160/article/details/130141335
版权归原作者 WtcSky 所有, 如有侵权,请联系我们删除。

“【李老师云计算】HBase+Zookeeper部署及Maven访问(HBase集群实验)”的评论:

还没有评论