-
一、编译环境准备1.1 安装Openjdk下载并安装到指定目录(如/opt/tools/installed):wget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u191-b12/OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gztar -zxf OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gzmv jdk8u191-b12 /opt/tools/installed/配置java环境变量,在/etc/profile文件末尾处增加下面的代码:JAVA_HOME=/opt/tools/installed/jdk8u191-b12PATH=$JAVA_HOME/bin:$PATHexport JAVA_HOME PATH运行下面命令,使修改的环境变量生效:source /etc/profile1.2 安装Maven下载并安装到指定目录(如/opt/tools/installed):wget https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gztar -zxf apache-maven-3.5.4-bin.tar.gzmv apache-maven-3.5.4 /opt/tools/installed/修改maven环境变量,在/etc/profile文件末尾增加下面高亮代码:JAVA_HOME=/opt/tools/installed/jdk8u191-b12MAVEN_HOME=/opt/tools/installed/apache-maven-3.5.4PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATHexport MAVEN_HOME JAVA_HOME PATH运行下面的命令,是修改的环境变量生效:source /etc/profile修改maven配置文件中的:本地仓路径、远程仓等:<!--默认在“~/.m2/”目录下,修改成你自己想保存的目录--><localRepository>/path/to/local/repo</localRepository> <!--修改成自己搭建的maven仓库,ARM使能后的jar包替换到该仓库--><mirror></mirror> 二、软件移植分析--三、依赖库编译3.1 第三方依赖包3.1.1 编译netty-all-4.1.17.Final.jar请参考链接https://bbs.huaweicloud.com/forum/thread-22723-1-1.html 编译netty-all-4.1.17.Final.jar。四、Jar包编译从官网上下载源码并解压:wget https://github.com/apache/hbase-thirdparty/archive/2.0.0RC0.tar.gztar -zxf 2.0.0RC0.tar.gzcd hbase-thirdparty-2.0.0RC0执行编译:mvn install -DskipTests编译完成后在hbase-shaded-netty/target目录下生成jar包:五、参考信息--六、FAQQuestion1:无法执行“patch”Answer1:缺少patch,需手动安装yum -y install patchQuestion2:无法找到libnetty_transport_native_epoll_x86_64.soAnswer2:修改hbase-shaded-netty/pom.xml文件,将x86_64修改为aarch_64 【来自转载】
-
1 CDH简介CDH(Cloudera’s Distribution Including Apache Hadoop)是Cloudera的开源大数据平台,基于Web的用户界面,支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、Hbase、Zookeeper、Sqoop,简化了大数据平台的安装、使用难度。本文主要是描述如何将CDH 5.15.1的x86版本中的hbase相关组件移植到TaiShan服务器上,包含编译部分。CDH的其他组件如果需要移植,也可以参考本文中描述的方法操作。官方链接:http://archive.cloudera.com/cdh5/cdh/5/hbase/类别:大数据语言: JAVA 2 软硬件环境类别子项版本获取地址(方法) 硬件CPUKunpeng 920iBMC网络Ethernet-10GEiBMC存储SATA 4TiBMC内存xxG xxxMHziBMCOSNeoKylin7.5cat /etc/neokylin-releaseKernel4.14.0cat /proc/version 软件GCC4.8.5gcc -vMaven3.5.4参考下面安装说明JDK1.8.0_191参考下面安装说明Protoc2.5.0参考下面安装说明3 编译环境准备3.1 安装Openjdk下载并安装到指定目录(如/opt/tools/installed):wget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u191-b12/OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gztar -zxf OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gzmv jdk8u191-b12 /opt/tools/installed/【注】:使用系统自带Openjdk软件包可以通过执行“yum -y install java-1.8.0*”进行安装然后参考如下步骤配置JAVA_HOME环境变量;配置java环境变量,在/etc/profile文件末尾处增加下面的代码:JAVA_HOME=/opt/tools/installed/jdk8u191-b12PATH=$JAVA_HOME/bin:$PATHexport JAVA_HOME PATH运行下面命令,使修改的环境变量生效:source /etc/profile3.2 安装GCC等依赖项挂载OS镜像:mount -o loop /home/NeoKylin/nsV7Update5-adv-lic-build05-aarch64.iso /mnt/NeoKylin/修改/etc/yum.repos.d/ns7-adv.repo文件,配置yum本地源:[ns7-adv-os]name=NeoKylin Linux Advanced Server 7 - Osbaseurl= file:///mnt/NeoKylingpgcheck=0gpgkey=file:///mnt/NeoKylin/RPM-GPG-KEY-neokylin-releaseenabled=1 运行下面的命令,使yum源配置生效:yum clean allyum makecacheyum安装GCC等相关依赖:sudo yum install -y snappy snappy-devel autoconf automake libtool git gcc gcc-c++ make cmake openssl openssl-devel ncurses-devel zlib zlib-devel bzip2 bzip2-devel bzip2-libs readline readline-devel bison zip unzip tar tcl java-1.8.0* bison* ncurses*3.3 安装Maven下载并安装到指定目录(如/opt/tools/installed):wget https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gztar -zxf apache-maven-3.5.4-bin.tar.gzmv apache-maven-3.5.4 /opt/tools/installed/修改maven环境变量,在/etc/profile文件末尾增加下面高亮代码:JAVA_HOME=/opt/tools/installed/jdk8u191-b12M2_HOME=/opt/tools/installed/apache-maven-3.5.4PATH=$M2_HOME/bin:$JAVA_HOME/bin:$PATHexport M2_HOME JAVA_HOME PATH运行下面的命令,是修改的环境变量生效:source /etc/profile修改maven配置文件中的:本地仓路径、远程仓等:配置文件路径:/opt/tools/installed/apache-maven-3.5.4/conf/settings.xml本地仓库配置:(可选,可保持默认)<!--默认在“~/.m2/”目录下,可以按下行格式修改成你自己想保存的目录--><localRepository>/path/to/local/repo</localRepository>远程仓库配置:(可选,默认用maven2官方远程仓但访问慢,建议用国内maven仓)<!--修改成自己搭建的maven仓库,如果没有,可以使用下面的华为开源maven仓 --><mirror> <id> huaweimaven</id> <name> huaweicloud maven</name> <url> https://mirrors.huaweicloud.com/repository/maven/</url> <mirrorOf>central</mirrorOf> </mirror>配置代理:(可选,外网环境下不用配置maven的代理) <proxies> <proxy> <id>optional</id> <active>true</active> <protocol>http</protocol> <username>用户名</username> <password>密码</password> <host>代理服务器网址</host> <port>代理服务器端口</port> <nonProxyHosts>local.net|some.host.com</nonProxyHosts> </proxy> </proxies>3.4 对gcc、g++和c++增加-fsigned-char选项1、对gcc增加-fsigned-char选项1)使用which gcc命令寻找gcc所在路径(一般位于/usr/bin/gcc)which gcc2)、更改gcc的名字(比如改成gcc-arm)mv /usr/bin/gcc /usr/bin/gcc-arm3)、进入gcc所在目录执行vi gcc,并填入如下内容保存:#! /bin/sh /usr/bin/gcc-arm -fsigned-char "$@"cd /usr/bin/vi gcc4)、执行chmod +x gcc给脚本添加执行权限chmod +x gcc2、对g++增加-fsigned-char选项1)使用which g++命令寻找g++所在路径(一般位于/usr/bin/g++)which g++2)、更改g++的名字(比如改成g++-arm)mv /usr/bin/g++ /usr/bin/g++-arm3)、进入g++所在目录执行vi g++,并填入如下内容保存:#! /bin/sh /usr/bin/g++-arm -fsigned-char "$@"cd /usr/bin/vi g++4)、执行chmod +x g++给脚本添加执行权限chmod +x g++3、对c++增加-fsigned-char选项1)使用which c++命令寻找g++所在路径(一般位于/usr/bin/c++)which c++2)、更改c++的名字(比如改成c++-arm)mv /usr/bin/c++ /usr/bin/c++-arm3)、进入c++所在目录执行vi c++,并填入如下内容保存:#! /bin/sh /usr/bin/c++-arm -fsigned-char "$@"cd /usr/bin/vi c++4)、执行chmod +x c++给脚本添加执行权限chmod +x c++3.5 安装Protoc下载并解压源码:wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gztar -zxf protobuf-2.5.0.tar.gzcd protobuf-2.5.0修改autogen.sh文件的第20-24行:vi autogen.sh注释如下红框内注释内容并增加如下:curl -L https://github.com/google/googletest/archive/release-1.5.0.tar.gz | tar zxmv googletest-release-1.5.0 gtest打ARM补丁:cp protoc.patch ./src/google/protobuf/stubs/cd ./src/google/protobuf/stubs/patch -p1 < protoc.patchcd -注:proctoc ARM补丁为protoc.patch.rar(从附件中解压获取); 编译并安装到系统默认目录:./autogen.sh && ./configure CFLAGS='-fsigned-char' && make && make install3.6 编译安装Snappy 1.1.3下载并解压源码:wget https://github.com/google/snappy/releases/download/1.1.3/snappy-1.1.3.tar.gztar zxvf snappy-1.1.3.tar.gzcd snappy-1.1.3/执行./configure进行编译配置:./configure 执行make进行编译:make -j32 执行make install编译安装:make install查看编译后的结果:cd /usr/local/lib3.7 编译安装Hadoop-Snappy通过git clone下载源码:git clone https://github.com/electrum/hadoop-snappy.git修改src/main/native/Makefile.am文件:vi src/main/native/Makefile.am根据如果红框内的内容进行修改 执行mvn package进行编译:mvn package 查看编译后的jar文件:cd target/hadoop-snappy-0.0.1-SNAPSHOT-tar/hadoop-snappy-0.0.1-SNAPSHOT/lib【注】:hadoop-snappy-0.0.1-SNAPSHOT.jar文件在hadoop-2.6.0-cdh5.15.1编译完成后,需将该文件拷贝到$HADOOP_HOME/lib库目录下;3.8 安装ant编译软件1、下载ant开源软件包wget http://mirror.bit.edu.cn/apache//ant/binaries/apache-ant-1.9.14-bin.tar.gz 2、解压apache-ant-1.9.14-bin.tar.gztar zxvf apache-ant-1.9.14-bin.tar.gz3、进入解压路径cd apache-ant-1.9.14/4、将ANT_HOME配置到/etc/profile环境变量中vi /etc/proflile 文件最后增加如下内容export ANT_HOME=/home/ant/apache-ant-1.9.14export PATH=$PATH:$ANT_HOME/bin 5、使ANT_HOME环境变量生效source /etc/proflile 4 软件移植分析1、使用checkSo工具(获取地址:https://bbs.huaweicloud.com/forum/thread-22679-1-1.html)检查hbase-1.2.0-cdh5.15.1对应x86的安装包或源码包是否有依赖x86的so文件,通过检查hbase-1.2.0-cdh5.15.1的源码hbase-1.2.0-cdh5.15.1-src.tar.gz没有发现有依赖的x86架构的so文件。 5 依赖库编译5.1 编译snappy-java-1.0.4.1.jarSnappy是Google开源的压缩/解压缩库,snappy-java封装了其接口1)从github网站下载源码并解压wget https://codeload.github.com/xerial/snappy-java/tar.gz/snappy-java-1.0.4.1mv snappy-java-1.0.4.1 snappy-java-1.0.4.1.tar.gztar -xzvf snappy-java-1.0.4.1.tar.gzcd snappy-java-snappy-java-1.0.4.1 2)修改Makefile文件中snappy源码的下载路径:vi Makefile【注】因为默认的路径已经失效,需要如下使用新的下载路径:http://repository.timesys.com/buildsources/s/snappy/snappy-1.0.4/snappy-1.0.4.tar.gz3)安装libstdc++-static-4.8.5-28.el7.ns7.02.aarch64.rpm和glibc-static-2.17-222.el7.ns7.01.aarch64.rpmwget http://download.cs2c.com.cn/neokylin/desktop/everything/7.0/aarch64/os/Packages/libstdc++-static-4.8.5-28.el7.ns7.02.aarch64.rpmrpm -ivh libstdc++-static-4.8.5-28.el7.ns7.02.aarch64.rpmwget http://download.cs2c.com.cn/neokylin/desktop/everything/7.0/aarch64/os/Packages/glibc-static-2.17-222.el7.ns7.01.aarch64.rpmrpm -ivh glibc-static-2.17-222.el7.ns7.01.aarch64.rpm4)执行make编译并查看编译后的snappy-java-1.0.4.1.jarmakecd target/5)将编译后的snappy-java-1.0.4.1.jar覆盖到本地maven仓对应路径cp snappy-java-1.0.4.1.jar /root/.m2/repository/org/xerial/snappy/snappy-java/1.0.4.1/5.2 编译leveldbjni-all-1.8.jarLeveldb是一个google实现的非常高效的kv数据库;官方链接:https://github.com/google/leveldb依据网上资料,编译leveldbjni-all-1.8.jar,需要先将leveldb和snappy编译成静态库,再将两个静态库编译进leveldbjni.so里面,最后生成leveldbjni-all-1.8.jar压缩包。注:如下编译snappy-1.1.3、leveldb-1.20和leveldbjni需要在同一个ssh窗口执行,切换ssh会导致如下临时定义的SNAPPY_HOME和LEVELDB_HOME变量失效,如发生ssh窗口异常,编译leveldbjni时需要先定义临时SNAPPY_HOME和LEVELDB_HOME变量(变量路径要正确);5.2.1 编译snappy-1.1.3wget https://github.com/google/snappy/archive/1.1.3.tar.gztar -zxvf 1.1.3.tar.gzcd snappy-1.1.3/./autogen.sh./configure --with-picmake -j20export SNAPPY_HOME=`pwd`cp .libs/libsnappy.a .5.2.2 编译leveldb-1.201)源码下载并解压wget https://github.com/google/leveldb/archive/v1.20.tar.gztar -zxvf v1.20.tar.gzcd leveldb-1.20 2)修改build_detect_platformvi build_detect_platform 注释如下红框内的3行注释内容,并添加如下三行:echo "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS $PLATFORM_SHARED_CFLAGS" >> $OUTPUTecho "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS $PLATFORM_SHARED_CFLAGS" >> $OUTPUTecho "PLATFORM_SHARED_CFLAGS=" >> $OUTPUT3)修改Makefile,增加-fPIC的编译选项vi Makefile增加-fPIC4)对比附件补丁leveldbpatch.zip,将代码合入(替换源码压缩包对应路径中的文件即可):5)执行编译make -j20export LEVELDB_HOME=`pwd`cp out-static/libleveldb.a . 5.2.3 编译leveldbjni1)通过git获取源码git clone https://github.com/fusesource/leveldbjni.gitcd leveldbjniexport LEVELDBJNI_HOME=`pwd` 2)修改pom.xmlvi pom.xml 注释如下红框内注释内容,并增加如下两行 <module>leveldbjni-linux64</module> <module>leveldbjni-all</module>3)修改leveldbjni-all/pom.xml文件vi leveldbjni-all/pom.xml 注释如下红框内注释内容,并按红框内框内容进行修改4)修改所有pom.xml文件中的版本号将所有pom.xml文件中的版本“99-master-SNAPSHOT”改为“1.8”:sed -i 's/99-master-SNAPSHOT/1.8/g' `find . -name pom.xml`5)编译选项增加 -fsigned-charvim leveldbjni/src/main/native-package/Makefile.in增加-fsigned-char6)修改automake版本号vi leveldbjni/src/main/native-package/aclocal.m4vi leveldbjni/src/main/native-package/configure把automake版本号从1.14改成1.13,注意不要改成1.13.4(根据系统安装automake版本号进行修改)7)执行maven编译并查看编译结果export LIBRARY_PATH=${SNAPPY_HOME};export C_INCLUDE_PATH=${LIBRARY_PATH};export CPLUS_INCLUDE_PATH=${LIBRARY_PATH}mvn clean package -P download -P linux64-aarch64 –DskipTestscd leveldbjni-all/target/注:执行maven编译会自动编译五个模块:leveldbjni-project、leveldbjni、leveldbjni-linux64、leveldbjni-linux64-aarch64、leveldbjni-all;8)将编译后的leveldbjni-all-1.8.jar复制到本地maven仓对应路径进行覆盖cp leveldbjni-all-1.8.jar /root/.m2/repository/org/fusesource/leveldbjni/leveldbjni-all/1.8/5.3 编译netty-all-4.0.23.Final.jar编译依赖关系:netty-4.0.23.Final à netty-tcnative-1.1.30.Fork2 à apr-1.5.2将编译生成的netty-tcnative-1.1.30.Fork2.jar拷贝到maven本地仓库,然后编译netty-all-4.0.23.Final.jar 1)下载apr-1.5.2源码,并解压wget https://archive.apache.org/dist/apr/apr-1.5.2.tar.gztar zxvf apr-1.5.2.tar.gzcd apr-1.5.2/ 2)编译apr-1.5.2并查看编译结果./configuremakemake install3)下载netty-tcnative-1.1.30.Fork2源码,并解压进入解压路径wget https://codeload.github.com/netty/netty-tcnative/tar.gz/netty-tcnative-1.1.30.Fork2mv netty-tcnative-1.1.30.Fork2 netty-tcnative-1.1.30.Fork2.tar.gztar zxvf netty-tcnative-1.1.30.Fork2.tar.gzcd netty-tcnative-netty-tcnative-1.1.30.Fork2/ 4)修改pom.xml vi pom.xml 增加如下内容 <configureArgs> <configureArg>CFLAGS=-fsigned-char</configureArg> </configureArgs>5)编译netty-tcnative-1.1.30.Fork2mvn install注:执行mvn install编译安装会直接替换本地maven仓中的netty-tcnative-1.1.30.Fork2-linux-aarch_64.jar6)下载netty-4.0.23.Final源码,并解压进入解压目录wget https://github.com/netty/netty/archive/netty-4.0.23.Final.tar.gztar zxvf netty-4.0.23.Final.tar.gzcd netty-netty-4.0.23.Final/ 7)修改transport-native-epoll/pom.xmlvi transport-native-epoll/pom.xml 增加如下内容 <configureArgs> <configureArg>CFLAGS=-fsigned-char</configureArg> </configureArgs>8)使用maven编译并查看编译结果mvn package -DskipTestscd all/target/9)将编译后的netty-all-4.0.23.Final.jar拷贝到本地maven仓对应路径cp netty-all-4.0.23.Final.jar /root/.m2/repository/io/netty/netty-all/4.0.23.Final/ 5.4 编译jruby-cloudera-1.0.0.jar5.4.1 编译libjruby-cext.solibjruby-cext.so包含在jruby-complete.jar中,需要先编译jruby-complete.jar,先在x86服务器上编译,然后返回arm服务器继续编译;1、在x86服务器上编译1)从github网站下载jruby-1.6.8.tar.gz源码并解压wget https://github.com/jruby/jruby/archive/1.6.8.tar.gztar zxvf 1.6.8.tar.gzcd jruby-1.6.8/ 2)打补丁(见附件jruby-complete-1.6.8-01.rar,解压后获得jruby-complete-1.6.8-01.patch)patch -p0 < jruby-complete-1.6.8-01.patch检查打补丁是否跟patch内容一致:vi build.xmlvi cext/src/Makefilevi maven/jruby-complete/pom.xmlvi maven/jruby-core/pom.xmlvi maven/jruby/pom.xmlvi maven/pom.xmlvi pom.xml3)在jruby-1.6.8.tar.gz源码解压路径创建jffi-native文件夹,下载jffi-1.2.14-native.jarmkdir jffi-nativecd jffi-native/wget http://repo1.maven.org/maven2/com/github/jnr/jffi/1.2.14/jffi-1.2.14-native.jarjar xvf jffi-1.2.14-native.jarcd jni/4)删除里面除了aarch64-Linux目录外的所有目录rm -rf arm* D* i* p* s* x*5)重新打包jffi-aarch64_Linux.jarjar -cvf jffi-aarch64_Linux.jar aarch64-Linux/6)将jffi-aarch64_Linux.jar添加到jruby-1.6.8的build_lib路径中,然后执行ant编译cp jffi-aarch64_Linux.jar ../../build_lib/cd ../../ant7)回上层路径将整个jruby-1.6.8目录打包cd ../tar zcvf jruby-1.6.8.tar.gz jruby-1.6.88)将打包后jruby-1.6.8.tar.gz传到arm服务器继续编译2、在arm服务器上编译1)解压从x86编译后的jruby-1.6.8.tar.gz并进入解压路径tar zxvf jruby-1.6.8.tar.gzcd jruby-1.6.8/2)编译extant cext3)编译jar-jruby-completeant jar-jruby-complete4)进入lib路径,解压jruby-complete.jar并进入解压后的cext/native/路径cd lib/jar xvf jruby-complete.jarcd cext/native/5)进入路径cd aarch64-Linux/6)查看编译后的libjruby-cext.so是否为aarch64readelf -h libjruby-cext.so | grep -i machine 5.4.2 编译libjffi-1.0.so1)改用已经有aarch64的jffi-1.2.14-native.jar中的libjffi-1.2.so打包到jruby-cloudera-1.0.0.jar中,进入本地maven仓jruby-cloudera-1.0.0.jar所在路径并解压jruby-cloudera-1.0.0.jarcd /root/.m2/repository/org/jruby/jruby-cloudera/1.0.0/mkdir testcp jruby-cloudera-1.0.0.jar test/cd test/jar xvf jruby-cloudera-1.0.0.jar2)下载jffi-1.2.14-native.jar并解压mkdir -p /home/test/libjfficd /home/test/libjffi/wget http://repo1.maven.org/maven2/com/github/jnr/jffi/1.2.14/jffi-1.2.14-native.jarjar xvf jffi-1.2.14-native.jar3)将libjffi-1.2.so拷贝到/root/.m2/repository/org/jruby/jruby-cloudera/1.0.0/test/jni/aarch64-Linux/路径下cp jni/aarch64-Linux/libjffi-1.2.so /root/.m2/repository/org/jruby/jruby-cloudera/1.0.0/test/jni/aarch64-Linux/cd /root/.m2/repository/org/jruby/jruby-cloudera/1.0.0/test/jni/aarch64-Linux/4)删除libjffi-1.0.sorm -rf libjffi-1.0.so5)返回/root/.m2/repository/org/jruby/jruby-cloudera/1.0.0/test路径,压缩jruby-cloudera-1.0.0.jar并将其拷贝到/root/.m2/repository/org/jruby/jruby-cloudera/1.0.0路径下cd ../../jar cvf jruby-cloudera-1.0.0.jar builtin cext com jay jline jni jnr jruby META-INF org YechtService.cp jruby-cloudera-1.0.0.jar ../6 Hbase-1.2.0-CDH5.15.1编译6.1 下载源码下载代码并解压:wget https://archive.cloudera.com/cdh5/cdh/5/hbase-1.2.0-cdh5.15.1-src.tar.gztar -zxvf hbase-1.2.0-cdh5.15.1-src.tar.gz6.2 打patch补丁进入hbase源码解压目录:cd hbase-1.2.0-cdh5.15.1/在解压路径执行如下命令打如下附件patch补丁(也可通过在编译环境执行wget https://issues.apache.org/jira/secure/attachment/12899868/HBASE-19188.branch-1.2.002.patch获取):export MAVEN_OPTS="-Xms1024m -Xmx10G -XX:PermSize=4096m"yum install patchpatch -p1 < HBASE-19188.branch-1.2.002.patch注:附件patch补丁名为HBASE-19188.branch-1.2.002.patch.rar6.3 执行编译 修改pom.xml中findbugs-maven-plugin的版本号(从3.0.0改为3.0.4):vim pom.xml将版本号从3.0.0改为3.0.4修改pom.xml,注释check-jar-contents相关内容:vim pom.xml注释如下红框内容执行编译并查看编译后的结果(每次编译前需要指定内存大小):export MAVEN_OPTS="-Xms1024m -Xmx12G -XX:PermSize=4096m"mvn clean install assembly:single -DskipTests -Prelease,security,native,hadoop-snappy -Drat.numUnapprovedLicenses=200 -Dhadoop.profile=2.0 -Dhadoop-snappy.version=0.0.1-SNAPSHOTcd hbase-assembly/target/6.4 注意点 1)编译过程中遇到问题可以参考9 FAQ 2)第一次编译的时候会从远程maven仓库下载jar包到本地仓库,但是有几个jar包是X86的,所以在hbase编译完成及第5章的jar包编译完成后,需要将第5章编译的jar包替换掉本地仓库中相应路径的jar包,然后重新编译一次hbase。第二次编译会很快,所以不用担心。 7 验证1、编译验证使用checkSo工具(获取地址:https://bbs.huaweicloud.com/forum/thread-22679-1-1.html)检查编译后的hbase-assembly/target/hbase-1.2.0-cdh5.15.1-bin.tar.gz中是否不再含有依赖的x86架构的so文件,检查方法参考工具中的 《CheckSo使用说明.docx》,如果还有依赖的x86架构的so文件,则需要继续完成对应jar包的编译,直到无依赖的x86架构的so文件后,再次编译该组件并通过checkSo工具检查确认,编译后的组件包不再有依赖的x86架构的so文件则表明编译成功。 通过checkSo工具检查hbase-assembly/target/路径下编译后的hbase-1.2.0-cdh5.15.1-bin.tar.gz发现存在如下依赖的so文件: 上图依赖库的编译见 5 依赖库编译 章节(需要编译jruby-cloudera-1.0.0.jar、leveldbjni-all-1.8.jar、netty-all-4.0.23.Final.jar、snappy-java-1.0.4.1.jar),完成依赖库编译后需要重新编译前面编译包含依赖库的hbase-1.2.0-cdh5.15.1-bin.tar.gz,直到编译后的hbase-1.2.0-cdh5.15.1-bin.tar.gz通过checkSo工具检查不再有依赖so等文件;2、功能验证暂无。 8 参考信息http://archive.cloudera.com/cdh5/cdh/5/hbase/https://hbase.apache.org/ 9 FAQ9.1 git clone报证书错误9.1.1 问题现象9.1.2 解决方法git config --global http."sslVerify" false9.2 wget下载https链接报证书错误9.2.1 问题现象9.2.2 解决方法在下载命令后面跟参数--no-check-certificate9.3 编译leveldbjni报automake命令找不到9.3.1 问题现象9.3.2 解决方法没有安装automake-1.14,可以使用yum install automake安装。如果yum源上找的没有1.14的版本,则需要修改leveldbjni-linux64/target/native-build下的配置文件。修改leveldbjni/src/main/native-package/configure和leveldbjni/src/main/native-package/aclocal.m4,将里面的1.14改成服务器上安装的automake版本,比如1.13。9.4 编译leveldbjni时error: required file 'autotools/compile' not found9.4.1 问题现象9.4.2 解决方法根据问题信息,需要手动进入相应目录,手动执行相应命令安装。cd leveldbjni-linux64/target/native-buildautomake --add-missing9.5 hbase编译过程报“Can't find bundle for base name org.apache.jasper.resources.LocalStrings“错误9.5.1 问题现象执行“mvn package -DskipTests assembly:single”编译hbase-1.3.0-src.tar.gz时报“Can't find bundle for base name org.apache.jasper.resources.LocalStrings, locale en_US”错误;9.5.2 解决方法需要打HBASE-19188.branch-1.2.002.patch补丁,步骤如下:1、在hbase-1.3.0-src.tar.gz解压路径执行“wget https://issues.apache.org/jira/secure/attachment/12899868/HBASE-19188.branch-1.2.002.patch”获取patch补丁2、执行“patch -p1 < HBASE-19188.branch-1.2.002.patch”打pathch补丁;3、打完patch补丁后执行“mvn clean package -DskipTests assembly:single”继续编译;9.6 hbase编译过程报“Cannot assign configuration entry ‘pluginArtifacts’ with value ‘${plugin.artifacts}’ of type “错误9.6.1 问题现象9.6.2 解决方法将pom.xml中的findbugs-maven-plugin的版本从3.0.0改为3.0.4。9.7 hbase编译过程报“Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2:exec (check-jar-contents) on project hbase-shaded-check-invariants: Command execution failed.: Process exited with an error: 1(Exit value: 1) “错误9.7.1 问题现象9.7.2 解决方法修改pom.xml注释如下红框部分。9.8 hbase编译过程报报“[Help 1] http://cwiki.apace.org/confluence/display/MAVEN/OutofMemoryError“错误9.8.1 问题现象9.8.2 解决方法编译过程报内存不足,则每次maven编译前指定java内存大小:export MAVEN_OPTS="-Xms1024m -Xmx12G -XX:PermSize=4096m" 【来自转载】
-
1. 简介HBase–Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群,海量数据的快速随机访问。2. 部署环境Packet NameVersionDetailCentOSCentOS 7.5 64bit with ARMarm通用计算增强型 2vCPUs | 4GB | kc1.large.2Hbase2.1.0GCC4.8.5Yum安装MavenApache-maven-3.3.9 JDK1.8.0_191 Protoc2.5.0 3. 安装部署3.1安装基本依赖库yum install gcc.aarch64 gcc-c++.aarch64 gcc-gfortran.aarch64 libgcc.aarch64yum install openssl-devel zlib-devel automake libtool cmake3.2 安装OpenJDK下载OpenJDK安装包wget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u191-b12/OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gz解压安装包tar -zxvf OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gz创建指定文件夹mkdir -p /opt/tools/installed将JDK移动到相应位置mv jdk8u191-b12 /opt/tools/installed/3.3 安装Mavenwget https://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gztar -zxvf apache-maven-3.3.9-bin.tar.gzmv apache-maven-3.3.9 /opt/tools/installed/下载Maven安装包配置环境变量,在/etc/profile后面加上JAVA_HOME=/opt/tools/installed/jdk8u191-b12MAVEN_HOME=/opt/tools/installed/apache-maven-3.3.9PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATHexport MAVEN_HOME JAVA_HOME PATH运行命令,使环境变量生效source /etc/profile3.4 安装Protocwget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gztar -zxvf protobuf-2.5.0.tar.gzcd protobuf-2.5.0下载并解压源码打上补丁cp protoc.patch ./src/google/protobuf/stubs/cd ./src/google/protobuf/stubs/patch -p1 < protoc.patch补丁地址:https://obs-mirror-ftp4.obs.cn-north-4.myhuaweicloud.com/tools/protoc.patch安装./autogen.sh && ./configure CFLAGS='-fsigned-char' && make && make install 3.5 编译Hbase下载Hbase安装包wget http://archive.apache.org/dist/hbase/2.1.0/hbase-2.1.0-src.tar.gztar –zxvf hbase-2.1.0-src.tar.gzcd hbase-2.1.0安装Protoc依赖mvn install:install-file -DgroupId=com.google.protobuf -DartifactId=protoc -Dversion=2.5.0 -Dclassifier=linux-aarch_64 -Dpackaging=exe -Dfile=/usr/local/bin/protoc执行编译mvn clean package -DskipTests assembly:single4 FAQ编译时报错:[ERROR] Failed to execute goal org.xolstice.maven.plugins:protobuf-maven-plugin:0.5.0:compile (compile-protoc) on project hbase-protocol: Missing:执行mvn install:install-file -DgroupId=com.google.protobuf -DartifactId=protoc -Dversion=2.5.0 -Dclassifier=linux-aarch_64 -Dpackaging=exe -Dfile=/usr/local/bin/protoc可解决问题。
-
1 编译环境准备1.1 安装Openjdk下载并安装到指定目录(如/opt/tools/installed):wget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u191-b12/OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gztar -zxf OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gzmv jdk8u191-b12 /opt/tools/installed/配置java环境变量,在/etc/profile文件末尾处增加下面的代码:JAVA_HOME=/opt/tools/installed/jdk8u191-b12PATH=$JAVA_HOME/bin:$PATHexport JAVA_HOME PATH运行下面命令,使修改的环境变量生效:source /etc/profile1.2 安装Maven下载并安装到指定目录(如/opt/tools/installed):wget https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gztar -zxf apache-maven-3.5.4-bin.tar.gzmv apache-maven-3.5.4 /opt/tools/installed/修改maven环境变量,在/etc/profile文件末尾增加下面高亮代码:JAVA_HOME=/opt/tools/installed/jdk8u191-b12MAVEN_HOME=/opt/tools/installed/apache-maven-3.5.4PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATHexport MAVEN_HOME JAVA_HOME PATH运行下面的命令,是修改的环境变量生效:source /etc/profile修改maven配置文件中的:本地仓路径、远程仓等:<!--默认在“~/.m2/”目录下,修改成你自己想保存的目录--><localRepository>/path/to/local/repo</localRepository> <!--修改成自己搭建的maven仓库,ARM使能后的jar包替换到该仓库--><mirror></mirror> 2 软件移植分析--3 依赖库编译3.1 第三方依赖包3.1.1 编译netty-all-4.1.17.Final.jar请参考链接https://bbs.huaweicloud.com/forum/thread-22723-1-1.html 编译netty-all-4.1.17.Final.jar。4 Jar包编译从官网上下载源码并解压:wget https://github.com/apache/hbase-thirdparty/archive/2.0.0RC0.tar.gztar -zxf 2.0.0RC0.tar.gzcd hbase-thirdparty-2.0.0RC0执行编译:mvn install -DskipTests编译完成后在hbase-shaded-netty/target目录下生成jar包:5 参考信息--6 FAQQuestion1:无法执行“patch”Answer1:缺少patch,需手动安装yum -y install patchQuestion2:无法找到libnetty_transport_native_epoll_x86_64.soAnswer2:修改hbase-shaded-netty/pom.xml文件,将x86_64修改为aarch_64
-
执行“mvn package -DskipTests assembly:single”编译hbase-1.3.0-src.tar.gz时报“User setting file does not exist ...\root\.m2\setting.xml”错误时,解决方法如下:拷贝${maven.home}/conf/settings.xml的文件到${user.home}/.m2/settings.xml中即可如:cp /home/apache-maven-3.5.4/conf/settings.xml /root/.m2/【说明】:settings.xml文件中的settings元素包含用于定义以各种方式配置Maven执行的值的元素,如pom.xml,但不应与任何特定项目绑定或分配给每一个用户。这些包括本地存储库(local repository)位置,备用远程存储库服务器和认证信息等值。settings.xml文件可能存在两个位置:Maven安装:${maven.home}/conf/settings.xml用户安装:${user.home}/.m2/settings.xml前一个settings.xml也称为全局设置,后者的settings.xml称为用户设置。如果两个文件都存在,它们的内容将被合并,用户特定的settings.xml看作是主要的。
-
执行“mvn package -DskipTests assembly:single”编译hbase-1.3.0-src.tar.gz时报“Can't find bundle for base name org.apache.jasper.resources.LocalStrings, locale en_US”错误时,需要参考如下链接打patch补丁:https://issues.apache.org/jira/browse/HBASE-20551?page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel&focusedCommentId=16471857#comment-16471857打patch补丁步骤参考如下:1、在hbase-1.3.0-src.tar.gz解压路径执行“wget https://issues.apache.org/jira/secure/attachment/12899868/HBASE-19188.branch-1.2.002.patch”获取patch补丁2、执行“patch -p1 < HBASE-19188.branch-1.2.002.patch”打pathch补丁;3、打完patch补丁后执行“mvn clean package -DskipTests assembly:single”继续编译;
-
1.提升Bulkload效率操作场景批量加载功能采用了MapReduce jobs直接生成符合HBase内部数据格式的文件,然后把生成的StoreFiles文件加载到正在运行的集群。使用批量加载相比直接使用HBase的API会节约更多的CPU和网络资源。ImportTSV是一个HBase的表数据加载工具。前提条件在执行批量加载时需要通过“Dimporttsv.bulk.output”参数指定文件的输出路径操作步骤参数入口:执行批量加载任务时,在BulkLoad命令行中加入如下参数。参数功能默认值/建议值hbase39现有值hbasea现有值-Dimporttsv.mapper.class用户自定义mapper通过把键值对的构造从mapper移动到reducer以帮助提高性能。mapper只需要把每一行的原始文本发送给reducer,reducer解析每一行的每一条记录并创建键值对。说明:当该值配置为“org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper”时,只在执行没有HBASE_CELL_VISIBILITY OR HBASE_CELL_TTL选项的批量加载命令时使用。使用“org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper”时可以得到更好的性能org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper和org.apache.hadoop.hbase.mapreduce.TsvImporterTextMappe不需要调整✅不需要调整✅2.提升连续put场景(修改为建议值)操作场景:对大批量、连续put的场景,配置下面的两个参数为“false”时能大量提升性能。“hbase.regionserver.wal.durable.sync”“hbase.regionserver.hfile.durable.sync”当提升性能时,缺点是对于DataNode(默认是3个)同时故障时,存在小概率数据丢失的现象。对数据可靠性要求高的场景请慎重配置参数功能默认值/建议值hbase39现有值hbasea现有值hbase.regionserver.wal.durable.sync每一条wal是否持久化到硬盘默认true,建议改为false无,即默认true无,即默认true hbase.regionserver.hfile.durable.sync hfile写是否立即持久化到硬盘。默认true,建议改为false 无,即默认true 无,即默认true 3.Put和Scan性能综合调优与JVM GC参数有关的参数RegionServer GC_OPTS参数设置建议:-Xms与-Xmx设置相同的值,需要根据实际情况设置,增大内存可以提高读写性能,可以参考参数“hfile.block.cache.size”(见表12-4)和参数“hbase.regionserver.global.memstore.size”(见表12-3)的介绍进行设置。-XX:NewSize与-XX:MaxNewSize设置相同值,建议低负载场景下设置为“512M”,高负载场景下设置为“2048M”。-XX:CMSInitiatingOccupancyFraction建议设置为“100 * (hfile.block.cache.size + hbase.regionserver.global.memstore.size + 0.05)”,最大值不超过90。-XX:MaxDirectMemorySize表示JVM使用的堆外内存,建议低负载情况下设置为“512M”,高负载情况下设置为“2048M”。参数功能默认值/建议值hbase39现有值hbasea现有值hfile.block.cache.size(提升实时读数据效率)-Xms与-Xmx设置相同的值,需要根据实际情况设置,增大内存可以提高读写性能数据缓存所占的RegionServer GC -Xmx百分比,在读高负载情况下可以适当调大以增大缓存命中率以提高性能默认值0.250.40.4hbase.regionserver.global.memstore.size建议设置为“hbase.hregion.memstore.flush.size * 写活跃region数 / RegionServer GC -Xmx”。默认值为“0.4”,表示使用RegionServer GC -Xmx的40%。默认值0.40.40.4-XX:NewSize与-XX:MaxNewSize设置相同值建议低负载场景下设置为“512M”,高负载场景下设置为“2048M”。低负载:512M 高负载:2048M无无-XX:CMSInitiatingOccupancyFraction建议设置为“100 * (hfile.block.cache.size + hbase.regionserver.global.memstore.size + 0.05)”,最大值不超过90计算值:70无无-XX:MaxDirectMemorySize表示JVM使用的堆外内存,建议低负载情况下设置为“512M”,高负载情况下设置为“2048M”。低负载:512M 高负载:2048M无无Put相关参数RegionServer处理put请求的数据,会将数据写入memstore和hlog,当memstore大小达到设置的“hbase.hregion.memstore.flush.size”参数值大小时,memstore就会刷新到HDFS生成HFile。当当前region的列簇的HFile数量达到“hbase.hstore.compaction.min”参数值时会触发compaction。当当前region的列簇HFile数达到“hbase.hstore.blockingStoreFiles”参数值时会阻塞memstore刷新生成HFile的操作,导致put请求阻塞。 参数功能默认值/建议值hbase39现有值hbasea现有值hbase.hregion.memstore.flush.size当memstore大小达到设置的“hbase.hregion.memstore.flush.size”参数值大小时,memstore就会刷新到HDFS生成HFile。建议设置为HDFS块大小的整数倍,在内存足够put负载大情况下可以调整增大。单位:字节默认值:134217728字节=128mb256mb128mbhbase.hstore.compaction.min当一个Store中文件超过该值时,会进行compact,适当增大该值,可以减少文件被重复执行compaction。但是如果过大,会导致Store中文件数过多而影响读取的性能。默认值 :6无无hbase.hstore.compaction.max控制一次compaction操作时的文件数量的最大值。与“hbase.hstore.compaction.max.size”的作用基本相同,主要是控制一次compaction操作的时间不要太长10空值10hbase.hstore.blockingStoreFiles当列簇的HFile数达到该阈值,阻塞该region的所有操作,直到compcation完成,在put高负载场景下可以适当调大。默认值:151010hbase.hstore.flusher.countmemstore的flush线程数,在put高负载场景下可以适当调大2无无hbase.regionserver.thread.compaction.smallHFile compaction线程数,在put高负载情况下可以适当调大10无无 Scan相关参数 参数功能默认值/建议值hbase39现有值hbasea现有值hbase.client.scanner.timeout.period客户端和RegionServer端参数,表示scan租约的时间,建议设置为60000ms的整数倍,在读高负载情况下可以适当调大。单位:毫秒。60000ms60s无 Handler相关参数 参数功能默认值/建议值hbase39现有值hbasea现有值hbase.regionserver.handler.count(提升实时读数据效率)RegionServer上的RPC服务器实例数,建议设置为200 ~ 400之间。2003030hbase.regionserver.metahandler.countRegionServer中处理优先请求的程序实例的数量,建议设置为200 ~ 400之间。10010无 4.提升实时写数据效率写数据服务端调优参数功能默认值/建议值hbase39现有值hbasea现有值hbase.regionserver.thread.compaction.throttle控制一次Minor Compaction时,进行compaction的文件总大小的阈值。Compaction时的文件总大小会影响这一次compaction的执行时间,如果太大,可能会阻塞其它的compaction或flush操作。1610612736(单位:字节)无无hbase.hregion.majorcompaction设置Major Compaction的执行周期。默认值为604800000毫秒。由于执行Major Compaction会占用较多的系统资源,如果正在处于系统繁忙时期,会影响系统的性能。如果业务没有较多的更新、删除、回收过期数据空间时,可以把该值设置为0,以禁止Major Compaction。如果必须要执行Major Compaction,以回收更多的空间,可以适当增加该值,同时配置参数“hbase.offpeak.end.hour”和“hbase.offpeak.start.hour”以控制Major Compaction发生在业务空闲的时期604800000(单位:毫秒)0.7day07dayhbase.regionserver.maxlogshbase.regionserver.hlog.blocksize表示一个RegionServer上未进行Flush的Hlog的文件数量的阈值,如果大于该值,RegionServer会强制进行flush操作。表示每个HLog文件的最大大小。如果HLog文件大小大于该值,就会滚动出一个新的HLog文件,旧的将被禁用并归档。这两个参数共同决定了RegionServer中可以存在的未进行Flush的hlog数量。当这个数据量小于MemStore的总大小的时候,会出现由于HLog文件过多而触发的强制flush操作。这个时候可以适当调整这两个参数的大小,以避免出现这种强制flush的情况。32134217728(单位:字节)—128mb32无 无无 5.读/写数据表设计调优配置参数描述默认值COMPRESSION配置数据的压缩算法,这里的压缩是HFile中block级别的压缩。对于可以压缩的数据,配置压缩算法可以有效减少磁盘的IO,从而达到提高性能的目的。说明:并非所有数据都可以进行有效压缩。例如一张图片的数据,因为图片一般已经是压缩后的数据,所以压缩效果有限。 常用的压缩算法是SNAPPY,因为它有较好的Encoding/Decoding速度和可以接受的压缩率。NONEBLOCKSIZE配置HFile中block块的大小,不同的block块大小,可以影响HBase读写数据的效率。越大的block块,配合压缩算法,压缩的效率就越好;但是由于HBase的读取数据是以block块为单位的,所以越大的block块,对于随机读的情况,性能可能会比较差。如果要提升写入的性能,一般扩大到128KB或者256KB,可以提升写数据的效率,也不会影响太大的随机读性能。65536(单位:字节)IN_MEMORY配置这个表的数据优先缓存在内存中,这样可以有效提升读取的性能。对于一些小表,而且需要频繁进行读取操作的,可以设置此配置项。false 6.JVM参数优化当集群数据量达到一定规模后,JVM的默认配置将无法满足集群的业务需求,轻则集群变慢,重则集群服务不可用。所以需要根据实际的业务情况进行合理的JVM参数配置,提高集群性能变量名变量影响的角色hbase39现有值hbasea现有值HBASE_OPTS该变量中设置的参数,将影响HBase的所有角色-Xms8g -Xmx8g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:-CMSConcurrentMTEnabled -XX:+CMSIncrementalMode -Djava.net.preferIPv4Stack=true $HBASE_OPTS HBASE_OPTS="$HBASE_OPTS -XX:+UseConcMarkSweepGC -XX:ErrorFile=/app/log/hbase/hs_err_pid%p.log -Djava.io.tmpdir=/tmp"SERVER_GC_OPTS该变量中设置的参数,将影响HBase Server端的所有角色,例如:Master、RegionServer等。SERVER_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/app/log/hbase/gc.log-`date +'%Y%m%d%H%M'`"CLIENT_GC_OPTS该变量中设置的参数,将影响HBase的Client进程HBASE_MASTER_OPTS该变量中设置的参数,将影响HBase的MasterHBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -Xmx30720m $JDK_DEPENDED_OPTS”HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:MaxDirectMemorySize=4096m " HBASE_REGIONSERVER_OPTS该变量中设置的参数,将影响HBase的RegionServerHBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xmn4096m -XX:CMSInitiatingOccupancyFraction=70 -Xms20480m -Xmx20480m $JDK_DEPENDED_OPTS”HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:MaxDirectMemorySize=4096m " HBASE_THRIFT_OPTS该变量中设置的参数,将影响HBase的Thrift转载自:https://blog.csdn.net/mnasd/article/details/81304888
-
[CloudTable服务]HBase on Sql客户端操作指南背景:为了方便用户能够像操作传统关系型数据库一样地操作HBase,我们可以以Phoenix为基础并结合其他工具分别在Linux和Windows环境上利用SQL语句来操作HBase,如创建表、数据写入、数据查询等。1 Linux客户端篇1.1 环境准备1.1.1 创建CloudTable集群并开启Lemon特性登录华为云官网,选择表格存储服务 CloudTable,进入集群模式并购买集群。注意:需要勾选Lemon高级特性;如果在创建集群时没有勾选,可以在集群创建完成后,再开启Lemon。1.1.2 创建Linux ECS并绑定公网EIP(1)选择弹性云服务器 ECS并购买云服务器,在选择镜像时要选择公共镜像,操作系统为Linux如CentOS。(2)在创建ECS时,要确保虚拟私有云VPC、网卡子网、安全组与1.1.1章节中CloudTable集群保持一致,并且需要为安全组按需配置出入规则,否则会出现网络无法访问的问题。为了能在公网直接访问该ECS,用户在创建ECS时可以勾选现在购买弹性公网IP或者在ECS创建完成后再为该ECS绑定一个弹性公网IP。CloudTable集群:ECS:(3)当ECS创建完成后,用户可以利用xshell、putty等工具登录到该ECS上(需要使用绑定的弹性公网IP)。1.1.3 一键安装部署HBase客户端(1)登录到ECS后,需要在该ECS上安装部署HBase客户端,可参照如下文档一键式安装。 https://support.huaweicloud.com/en-us/usermanual-cloudtable/cloudtable_01_0097.html1.2 客户端下载、安装及使用1.2.1 下载Phoenix客户端包进入到phoenix官网下载,选择*HBase-1.3。http://phoenix.apache.org/download.html或在ECS上使用如下命令:wget http://mirror.bit.edu.cn/apache/phoenix/apache-phoenix-4.14.1-HBase-1.3/bin/apache-phoenix-4.14.1-HBase-1.3-bin.tar.gz1.2.2 解压客户端tar.gz包tar -zxvf apache-phoenix-4.14.1-HBase-1.3-bin.tar.gz1.2.3 使用客户端cd apache-phoenix-4.14.1-HBase-1.3-bin/bin./sqlline-thin.py <cloudtable-lemon-url>:<port>关于<cloudtable-lemon-url>:<port>的获取可以查看1.1.1章节中创建的CloudTable集群的详细信息中的Lemon链接地址,当前Lemon链接地址中包含多个<cloudtable-lemon-url>:<port>,我们任意选择其中一个进行连接即可。(4)查看数据库中有哪些表!tables(5)创建数据表CREATE TABLE "test" ("time" VARCHAR, "vin" VARCHAR, "a038" VARCHAR, "a039" VARCHAR, "a040" VARCHAR CONSTRAINT rowkey PRIMARY KEY("time", "vin")) SPLIT ON ('50', '100');(6)数据写入UPSERT INTO "test" VALUES ('2019-03-08 10:00:00', 'IXX0M56GSRVQI9S1S', null, '1', '1');(7)数据查询SELECT * FROM "test";(8)创建索引CREATE INDEX "idx_test" ON "test"("vin");(9)用户可以利用1.1.3章节中安装的HBase客户端,通过hbase shell命令查看创建的"test"数据表。2 Windows客户端篇2.1 环境准备使用Windows客户端有两种方案:(1)申请一台Linux ECS并为其绑定EIP,在客户自己本地的Windows机器上采用VPN的方式通过该Linux ECS连接到CloudTable内部,前提是客户自己本地的Windows上已经配置了Jave JDK;(2)申请一台Windows ECS并为其绑定EIP,客户通过远程桌面连接的方式登录到该Windows ECS后,再在Windows ECS上进行操作。如果采用第(1)方案,则环境准备需要完成2.1.1,2.1.2, 2.1.3章节。如果采用第(2)种方案,则环境准备需要完成2.1.1,2.1.4, 2.1.5,2.1.6章节。2.1.1 创建CloudTable集群并开启Lemon特性直接参照1.1.1章节的内容。2.1.2 创建Linux ECS并绑定公网IP直接参照1.1.2章节内容。2.1.3 配置vpn连接参照如下文档:https://bbs.huaweicloud.com/forum/thread-13371-1-1.html2.1.4 创建Windows ECS并绑定公网EIP(1)选择弹性云服务器 ECS并购买云服务器,在选择镜像时要选择公共镜像,操作系统为Windows。例如:(2)同样的,在创建ECS时,要确保虚拟私有云VPC、网卡子网、安全组与1.1.1章节中CloudTable集群保持一致,并且需要为安全组按需配置出入规则,否则会出现网络无法访问的问题。为了能在公网直接访问该ECS,用户在创建ECS时可以勾选现在购买弹性公网IP或者在ECS创建完成后再为该ECS绑定一个弹性公网IP,具体可以参照1.1.2章节第(2)步内容。2.1.5 连接并登录Windows ECS利用Windows自带的远程桌面连接工具,连接上面创建的Windows ECS。2.1.6 Windows ECS配置Java JDK登录成功后,需要先安装配置Java JDK安装配置Java JDK的具体过程用户可自行上网查阅,在此不再赘述。2.2 客户端工具下载、安装及使用2.2.1 下载squirrel sql client工具进入Squirrel sql官网:http://www.squirrelsql.org/, 并下载Squirrel SQL Client的Windows客户端jar 包。当前最新为3.9.1版本。2.2.2 安装squirrel sql client工具(1)打开Windows cmd命令行,进到squirrel-sql-3.9.1-standard.jar所在目录,执行如下命令: java -jar squirrel-sql-3.9.1-standard.jar(2)或者直接双击squirrel-sql-3.9.1-standard.jar文件可以直接点击Nex选择默认配置。2.2.3 配置squirrel sql client工具将1.4.1章节中下载的apache-phoenix-4.14.1-HBase-1.3-bin.tar.gz解压,并将解压目录中的phoenix-4.14.1-HBase-1.3-thin-client.jar文件放到squirrel sql client安装目录的lib目录下,如squirrel sql client安装目录为:C:\Program Files\squirrel-sql-3.9.1,则将phoenix-4.14.1-HBase-1.3-thin-client.jar文件放到C:\Program Files\squirrel-sql-3.9.1\lib目录下。2.2.4 使用squirrel sql client工具双击squirrel sql client安装目录下的squirrel-sql.bat文件,启动squirrel sql client,选择左侧的Drivers,并点击加号Create a new Driver。2.2.5 配置新的Driver在弹出的Add Driver窗口中设置相应的Driver Name, Example URL,Example URL只是一个URL模 板,并在Java Class Path中选择2.2.3章节中的phoenix-4.14.1-HBase-1.3-thin-client.jar,然后点击List Drivers按钮,过一小段时候后观察最下方的Class Name对应的下拉菜单中是否有值,否则,选择org.apache.phoenix.queryserver.client.Driver项,如果没有,则手动输入org.apache.phoenix.queryserver.client.Driver。Example URL:jdbc:phoenix:thin:url=http://<lemon url>:<port>;serialization=PROTOBUFJava Class Path:C:\Program Files\squirrel-sql-3.9.1\lib\phoenix-4.14.1-HBase-1.3-thin-client.jarClass Name:org.apache.phoenix.queryserver.client.Driver2.2.6 创建新的Alias选择左侧的Aliases,并点击加号Create a new Alias2.2.7 配置Driver在弹出的Add Alias窗口中设置相应的Alias Name, Dirver,URL,UserName及Password。其中:Driver选择2.2.5章节中创建的Driver,URL则利用选中的Driver对应的模板Example URL并根据真实的Lemon URL及端口号Port来构造,UserName及Password直接填admin即可。Driver: 2.2.5章节中创建的DriverURL:jdbc:phoenix:thin:url=http://cloudtable-for-dat-lemon-2-1-OzWH5Rdy.cloudtable.com:8765;serialization=PROTOBUFUserName:adminPassword:admin2.2.8 测试配置是否正确配置完成后,点击Add Alias弹出窗下方的Test按钮,测试配置是否正确,如果弹出Connection successful则说明配置正确。2.2.9 执行创表、数据写入、数据查询分别执行以下的SQL语句:create table person(id integer not null primary key, name varchar, age integer);upsert into person values(1, 'zhangsan',18);select * from person;也可以直接通过可视化界面查看当前的表及表中数据
-
华为云MapReduce服务中包括了Hapoop、HBase、Spark、Kafka等等大数据组件。这里是基于华为云MapReduce服务集群讲解HBase的基本命令。1.进入HBase shell命令行注意:如果集群是安全集群(就是创建集群的时候开启Kerberos认证),在HBase shell之前,需要通过kinit username 进行认证。# hbase shell2.基本命令实例在输入HBase操作命令时不同于SQL语句,命令最后没有分号。2.1 查看HBase版本、用户和状态查看版本 hbase(main):005:0> version 查看用户 hbase(main):001:0> whoami 查看HBase状态信息 hbase(main):002:0> status2.2 查看命名空间(namespace)默认情况下,HBase里面包括hbase和default两个命名空间。在下面的表操作中,如果没有指定命名空间,默认就是default命名空间。hbase(main):011:0> list_namespace2.3 创建和删除命名空间(namespace)创建命名空间 hbase(main):012:0> create_namespace 'jun' 查看命名空间 hbase(main):013:0> list_namespace 删除命名空间 hbase(main):014:0> drop_namespace 'jun'2.4 查看表上面讲解了命名空间(namespace),默认情况下default命名空间是默认的命名空间。Examples: list 查看下的所有表 list 'abc.*' 查看表名以abc开头的表 list 'ns:abc.*' 查看命名空间ns下表名以abc开头的表 list 'ns:.*' 查看命名空间ns下所有表 可以通过 help 'list'查看list命令详解 实例 hbase(main):001:0> list2.5 创建表输入创建表命令时,需要输入表名和至少一个列簇名(column family)。创建表时如果指定了命名空间,该命名空间必须存在,否则会报错。Examples: create 'ns1:t1', 'f1' 创建命名空间为ns1、表名为t1、列簇为f1的表 create 't1', 'f1','f2','f3' 创建表名为t1、列簇为f1/f2/f3三个列簇的表 实例 hbase(main):028:0> create 'test','f1','f2','f3'2.3 查看表结构通过desc命令查看表的详细结构hbase(main):030:0> desc 'test'2.4 删除表在删除表之前,必须要先用disable命令。hbase(main):007:0> disable 'test' hbase(main):008:0> drop 'test'2.5 修改表结构创建表test01 hbase(main):042:0> create 'test01','f1', 'f2', 'f3' 添加列簇 hbase(main):048:0> alter 'test01','f4','f5' 删除列簇 hbase(main):053:0> alter 'test01', 'delete' => 'f5' 详细的alter命令使用可以通过帮助命令查看 hbase(main):056:0> help 'alter'2.6 添加数据hbase(main):064:0> put 'test01', 'name02', 'f2:age', '20' 下面详细介绍一下该命令: test01 ==>> 表名 name02 ==>> rowkey(唯一标识符)这个自己定义 f2 ==>> 列簇(可以当作与多列的集合) age ==>> 列簇下面的一个列,自己定义 20 ==>> 值,表示age属性的值2.7 查询数据查询属性记录值: hbase(main):076:0> get 'test01','name02','f2:age' 查看整个表数据: hbase(main):073:0> scan 'test01' hbase(main):077:0> scan 'test01', LIMIT => 2 统计表中行数: hbase(main):078:0> count 'test01'2.8 删除数据删除行中某个列值 delete 'test01','name02','f2:age' 删除一行 hbase(main):085:0> deleteall 'test01','name02'特别提醒:HBase中不懂的命令可以利用help命令进行查看详细内容参考:1.HBase官方文档:https://hbase.apache.org/book.html2.华为云MapReduce服务开发指南HBase应用开发大数据相关内容可加QQ群 940014001 进群进行详细咨询与了解。
-
大家都说NoSQL数据库写入性能好,查询性能好,能存海量数据,TB级/PB级分分钟的事情,但是为什么到自己手上的时候,几百G/几T的数据写入和查询都不尽人意呢? ▼在我上大学的时候就听说,在关系型数据库时代,DBA那是很吃香的,收费可是要从出门开始按小时收费的?然而NoSQL时代,似乎没有官方盖戳的DBA了,然而是不是就代表不需要了呢? 本期华为云“云视界Live”,将邀请到华为云表格存储服务CloudTable架构师Bene做客云视界Live,为我们深度探秘CloudTable的服务设计和原理,以及根据多年经验总结出的NoSQL(HBASE相关)数据库Schema设计方法。 19574 本期地址:http://zhibo.huaweicloud.com/watch/2169816本期议程:2018年7月12日 16:00-16:20 深度解析华为云CloudTable服务原理和设计16:20-16:45 CloudTable服务相关NoSQL数据库设计经验分享16:45-17:00 线上互动问答 19575
-
19515 直播地址:https://zhibo.huaweicloud.com/watch/2169816
-
在各色数据库系统百花齐放的今天,能让大家铭记的,往往是一个数据库所能带给大家的差异化能力。正如梁宁老师的产品思维课程中所讲到的,这是一个数据库系统所能带给产品使用者的"确定性"。差异化能力通常需要从数据库底层开始构筑,而数据存储方式显得至关重要,因为它直接关乎数据写入与读取的效率。在一个系统中,这两方面的能力需要进行很好的权衡:如果设计有利于数据的快速写入,可能意味着查询时需要需要花费较大的精力去组织数据,反之,如果写入时花费精力去更好的组织数据,查询就会变的非常轻松。探讨数据库的数据存储方式,其实就是探讨数据如何在磁盘上进行有效的组织。因为我们通常以如何高效读取和消费数据为目的,而不是数据存储本身。在RDBMS领域,因为键与数据的组织方式的区别,有两种表组织结构最为常见,一种是键与数据联合存储的索引组织表结构,在这种表结构下,查到键值意味着查找到数据;另外一种是键与数据分离存储的堆表结构。在这种表结构下,查找到键以后,只是拿到了数据记录的物理地址,还需要基于该物理地址去查找具体的数据记录。在大数据分析领域,有几种通用的文件格式,如Parquet, RCFile, ORCFile,CarbonData等等,这些文件大多基于列式的设计结构,来加速通用的分析型查询。但在实时数据库领域,却以各种私有的文件格式最为常见,如Bigtable的SSTable,HBase的HFile,Kudu的DiskRowSets,Cassandra的变种SSTable,MongoDB支持的每一种Storage Engine都是私有的文件格式设计,等等。本文将详细探讨HBase的HFile设计,第一部分为HFile原理概述,第二部分介绍了一个HFile从无到有的生成过程,最后部分列出了几点与HFile有关的附加信息。HFile原理概述最初的HFile格式(HFile V1),参考了Bigtable的SSTable以及Hadoop的TFile(HADOOP-3315)。如下图所示:HFile在生成之前,数据在内存中已经是按序组织的。存放用户数据的KeyValue,被存储在一个个默认为64kb大小的Data Block中,在Data Index部分存储了每一个Data Block的索引信息{Offset,Size,FirstKey},而Data Index的索引信息{Data Index Offset, Data Block Count}被存储在HFile的Trailer部分。除此以外,在Meta Block部分还存储了Bloom Filter的数据。下图更直观的表达出了HFile V1中的数据组织结构:这种设计简单、直观。但用过0.90或更老版本的同学,对于这个HFile版本所存在的问题应该深有痛楚:Region Open的时候,需要加载所有的Data Block Index数据,另外,第一次读取时需要加载所有的Bloom Filter数据到内存中。一个HFile中的Bloom Filter的数据大小可达百MB级别,一个RegionServer启动时可能需要加载数GB的Data Block Index数据。这在一个大数据量的集群中,几乎无法忍受。Data Block Index究竟有多大?一个Data Block在Data Block Index中的索引信息包含{Offset, Size, FirstKey},BlockOffset使用Long型数字表示,Size使用Int表示即可。假设用户数据RowKey的长度为50bytes,那么,一个64KB的Data Block在Data Block Index中的一条索引数据大小约为62字节。假设一个RegionServer中有500个Region,每一个Region的数量为10GB(假设这是Data Blocks的总大小),在这个RegionServer上,约有81920000个Data Blocks,此时,Data Block Index所占用的大小为81920000*62bytes,约为4.7GB。这是HFile V2设计的初衷,HFile V2期望显著降低RegionServer启动时加载HFile的时延,更希望解决一次全量加载数百MB级别的BloomFilter数据带来的时延过大的问题。下图是HFile V2的数据组织结构:较之HFile V1,我们来看看HFile V2的几点显著变化:1.分层索引无论是Data Block Index还是Bloom Filter,都采用了分层索引的设计。Data Block的索引,在HFile V2中做多可支持三层索引:最底层的Data Block Index称之为Leaf Index Block,可直接索引到Data Block;中间层称之为Intermediate Index Block,最上层称之为Root Data Index,Root Data index存放在一个称之为”Load-on-open Section“区域,Region Open时会被加载到内存中。基本的索引逻辑为:由Root Data Index索引到Intermediate Block Index,再由Intermediate Block Index索引到Leaf Index Block,最后由Leaf Index Block查找到对应的Data Block。在实际场景中,Intermediate Block Index基本上不会存在,文末部分会通过详细的计算阐述它基本不存在的原因,因此,索引逻辑被简化为:由Root Data Index直接索引到Leaf Index Block,再由Leaf Index Block查找到的对应的Data Block。Bloom Filter也被拆成了多个Bloom Block,在”Load-on-open Section”区域中,同样存放了所有Bloom Block的索引数据。2.交叉存放在”Scanned Block Section“区域,Data Block(存放用户数据KeyValue)、存放Data Block索引的Leaf Index Block(存放Data Block的索引)与Bloom Block(Bloom Filter数据)交叉存在。3.按需读取无论是Data Block的索引数据,还是Bloom Filter数据,都被拆成了多个Block,基于这样的设计,无论是索引数据,还是Bloom Filter,都可以按需读取,避免在Region Open阶段或读取阶段一次读入大量的数据,有效降低时延。从0.98版本开始,社区引入了HFile V3版本,主要是为了支持Tag特性,在HFile V2基础上只做了微量改动。在下文内容中,主要围绕HFile V2的设计展开。HFile生成流程在本章节,我们以Flush流程为例,介绍如何一步步生成HFile的流程,来加深大家对于HFile原理的理解。起初,HFile中并没有任何Block,数据还存在于MemStore中。Flush发生时,创建HFile Writer,第一个空的Data Block出现,初始化后的Data Block中为Header部分预留了空间,Header部分用来存放一个Data Block的元数据信息。而后,位于MemStore中的KeyValues被一个个append到位于内存中的第一个Data Block中:注:如果配置了Data Block Encoding,则会在Append KeyValue的时候进行同步编码,编码后的数据不再是单纯的KeyValue模式。Data Block Encoding是HBase为了降低KeyValue结构性膨胀而提供的内部编码机制。上图中所体现出来的KeyValue,只是为了方便大家理解。当Data Block增长到预设大小(默认64KB)后,一个Data Block被停止写入,该Data Block将经历如下一系列处理流程:1.如果有配置启用压缩或加密特性,对Data Block的数据按相应的算法进行压缩和加密。2.在预留的Header区,写入该Data Block的元数据信息,包含{压缩前的大小,压缩后的大小,上一个Block的偏移信息,Checksum元数据信息}等信息,下图是一个Header的完整结构:3.生成Checksum信息。4.Data Block以及Checksum信息通过HFile Writer中的输出流写入到HDFS中。5.为输出的Data Block生成一条索引记录,包含这个Data Block的{起始Key,偏移,大小}信息,这条索引记录被暂时记录到内存的Block Index Chunk中:注:上图中的firstKey并不一定是这个Data Block的第一个Key,有可能是上一个Data Block的最后一个Key与这一个Data Block的第一个Key之间的一个中间值。具体可参考附录部分的信息。至此,已经写入了第一个Data Block,并且在Block Index Chunk中记录了关于这个Data Block的一条索引记录。随着Data Blocks数量的不断增多,Block Index Chunk中的记录数量也在不断变多。当Block Index Chunk达到一定大小以后(默认为128KB),Block Index Chunk也经与Data Block的类似处理流程后输出到HDFS中,形成第一个Leaf Index Block:此时,已输出的Scanned Block Section部分的构成如下:正是因为Leaf Index Block与Data Block在Scanned Block Section交叉存在,Leaf Index Block被称之为Inline Block(Bloom Block也属于Inline Block)。在内存中还有一个Root Block Index Chunk用来记录每一个Leaf Index Block的索引信息:从Root Index到Leaf Data Block再到Data Block的索引关系如下:我们先假设没有Bloom Filter数据。当MemStore中所有的KeyValues全部写完以后,HFile Writer开始在close方法中处理最后的”收尾”工作:1.写入最后一个Data Block。2.写入最后一个Leaf Index Block。如上属于Scanned Block Section部分的”收尾”工作。3.如果有MetaData则写入位于Non-Scanned Block Section区域的Meta Blocks,事实上这部分为空。4.写Root Block Index Chunk部分数据:如果Root Block Index Chunk超出了预设大小,则输出位于Non-Scanned Block Section区域的Intermediate Index Block数据,以及生成并输出Root Index Block(记录Intermediate Index Block索引)到Load-On-Open Section部分。如果未超出大小,则直接输出为Load-On-Open Section部分的Root Index Block。5.写入用来索引Meta Blocks的Meta Index数据(事实上这部分只是写入一个空的Block)。6.写入FileInfo信息,FileInfo中包含:Max SequenceID, MajorCompaction标记,TimeRanage信息,最早的Timestamp, Data BlockEncoding类型,BloomFilter配置,最大的Timestamp,KeyValue版本,最后一个RowKey,平均的Key长度,平均Value长度,Key比较器等。7.写入Bloom Filter元数据与索引数据。注:前面每一部分信息的写入,都以Block形式写入,都包含Header与Data两部分,Header中的结构也是相同的,只是都有不同的Block Type,在Data部分,每一种类型的Block可以有自己的定义。8.写入Trailer部分信息, Trailer中包含:Root Index Block的Offset,FileInfo部分Offset,Data Block Index的层级,Data Block Index数据总大小,第一个Data Block的Offset,最后一个Data Block的Offset,Comparator信息,Root Index Block的Entries数量,加密算法类型,Meta Index Block的Entries数量,整个HFile文件未压缩大小,整个HFile中所包含的KeyValue总个数,压缩算法类型等。至此,一个完整的HFile已生成。我们可以通过下图再简单回顾一下Root Index Block、Leaf Index Block、Data Block所处的位置以及索引关系:简单起见,上文中刻意忽略了Bloom Filter部分。Bloom Filter被用来快速判断一条记录是否在一个大的集合中存在,采用了多个Hash函数+位图的设计。写入数据时,一个记录经X个Hash函数运算后,被映射到位图中的X个位置,将位图中的这X个位置写为1。判断一条记录是否存在时,也是通过这个X个Hash函数计算后,获得X个位置,如果位图中的这X个位置都为1,则表明该记录”可能存在”,但如果至少有一个为0,则该记录”一定不存在”。详细信息,大家可以直接参考Wiki,这里不做过多展开。Bloom Filter包含Bloom元数据(Hash函数类型,Hash函数个数等)与位图数据(BloomData),为了避免每一次读取时加载所有的Bloom Data,HFile V2中将BloomData部分分成了多个小的Bloom Block。BloomData数据也被当成一类Inline Block,与Data Block、Leaf Index Block交叉存在,而关于Bloom Filter的元数据与多个Bloom Block的索引信息,被存放在Load-On-Open Section部分。但需要注意的是,在FileInfo部分,保存了关于BloomFilter配置类型信息,共包含三种类型:不启用,基于Row构建BloomFilter,基于Row+Column构建Bloom Filter。混合了BloomFilter Block以后的HFile构成如下图所示:附录1 多大的HFile文件才存在Intermiate Index Block每一个Leaf Index Block大小的计算方法如下(HFileBlockIndex$BlockIndexChunk#getNonRootSize):curTotalNonRootEntrySize是在每次写入一个新的Entry的时候累加的:这样子,可以看出来,每一次新增一个Entry,则累计的值为:12 + firstKey.length假设一个Leaf Index Block可以容纳的Data Block的数量为x:4 + 4 * (x + 1) + x * (12 + firstKey.length)进一步假设,firstKey.length为50bytes。而一个Leaf Index Block的默认最大大小为128KB:4 + 4 * (x + 1) + x * (12 + 50) = 128 * 1024x ≈1986也就是说,在假设firstKey.length为50Bytes时,一个128KB的Leaf Index Block所能容纳的Data Block数量约为1986个。我们再来看看Root Index Chunk大小的计算方法:基于firstKey为50 Bytes的假设,每往Root Index Chunk中新增一个Entry(关联一个Leaf Index Block),那么,curTotalRootSize的累加值为:12 + 1 + 50 = 63因此,一个128KB的Root Index Chunk可以至少存储2080个Entries,即可存储2080个Leaf Index Block。这样, 一个Root Index Chunk所关联的Data Blocks的总量应该为:1986 * 2080 = 4,130,880而每一个Data Block默认大小为64KB,那么,这个HFile的总大小至少为:4,130,880 * 64 * 1024 ≈ 252 GB即,基于每一个Block中的FirstKey为50bytes的假设,一个128KB的Root Index Block可容纳的HFile文件总大小约为252GB。如果实际的RowKey小于50 Bytes,或者将Data Block的Size调大,一个128KB的Root Index Chunk所关联的HFile文件将会更大。因此,在大多数场景中,Intermediate Index Block并不会存在。附录2 关于HFile数据查看工具HBase中提供了一个名为HFilePrettyPrinter的工具,可以以一种直观的方式查看HFile中的数据,关于该工具的帮助信息,可通过如下命令查看:hbase org.apache.hadoop.hbase.io.hfile.HFileReferences [*]HBase Architecture 101 – Storage[*]HBASE-3857: Change the HFile Format[*]HBase Document: Appendix H: HFile format[*]HADOOP-3315: New Binary file format[*]SSTable and Log Structured Storage: LevelDB
-
本文简单介绍下集群间的HBASE数据备份(导入导出),即主集群往备集群上备份(同步)数据 当前HBASE上可以使用的数据备份主要有以下几种 u Snapshots u Replication u Export u CopyTable u HTable API u Offline backup of HDFS data 分别从操作对集群的性能影响、数据空间消耗、业务中断影响、增量备份、易用性、可恢复性几个维度进行了如下的对比: 以上备份方法除了Replication都可以在当前集群备份数据,由于本集群数据备份和本远端备份的操作流程相似,本文以下内容就只讨论集群间的数据备份 离线数据备份 离线数据备份,顾名思义它需要中断当前主集群和备集群的业务 主要执行步骤为: #主集群 1) 对当前集群中表数据执行flush操作,将当前内存中的数据持久化到hdfs中 flush ‘tableName’ 2) 停止HBASE 3) 使用distcp命令拷贝当前集群hdfs上的数据到备集群上 hadoop distcp -i /hbase/data hdfs://1.1.1.2:25000/hbasehadoop distcp –update–append –delete /hbase/ hdfs:// 1.1.1.2:25000/hbase/---1.1.1.2:25000为备集群hdfs主nn节点的ip/端口---第二条增量拷贝主要是为了拷贝除了data目录以外的文件,例如archive里面的数据可能当前还有被数据目录所引用 #备集群 1)重启hbase 2)执行hbase hbck检查是否表中所有region都已经上线 注意:当用户使用了hbase协处理器,自定义jar包放在主集群的regionserver/hmaster上时,在备集群重启hbase之前,需要把这些自定义jar包也拷贝过来 此种方式数据备份的优点: 1) 简单暴力,可以一下子把主集群上所有数据(包含元数据)整个复制到备集群 2) 由于是通过distcp直接拷贝的,所以数据备份的效率相对较高 3) 实际操作时可以根据具体的需求灵活拷贝,可以只拷贝其中一个表的数据,也可以拷贝region中的其中一个hfile等。 缺点和限制: 1) 此操作对备集群上的hdfs的数据目录会有破坏性(整个覆盖了) 2) 如果主备集群间的hbase版本不同,hdfs目录直接拷贝可能会出现问题,例如MRS上的hbase1.3版本新增了系统表index,如果使用老版本的hdfs目录直接覆盖,会找不到该数据表。所以此种方案在执行前需要慎重考虑 3) 操作对hbase的能力有一定的要求,如出现异常情况需要根据实际情况执行恢复 Export和import导入导出数据Export/Import主要是启动MR任务对 数据的表进行scan扫描,往远端hdfs写入SequenceFile,之后Import再把SequenceFile读出来写入hbase(put) 可以参考以下操作: #主集群 1)执行表的Export操作 hbase org.apache.hadoop.hbase.mapreduce.Exportmember hdfs://10.120.169.46:25000/user/table/member ---member为表名 ---10.120.169.46为远端hdfs的主nn节点ip #备集群 1)主机群执行完之后可以在备集群上查看生成的目录数据如下: 2)在备集群上新建与主机群相同结构的表 create'member_import','id','address','info' 3)执行Import导入操作 hbaseorg.apache.hadoop.hbase.mapreduce.Import member_import -Dimport.bulk.output=/tmp/member /user/table/member --- member_import为备集群上与主集群相同表结构的表 --- Dimport.bulk.output 执行完数据的输出目录 ---/user/table/member 为从主集群上导出的数据目录 4)执行load操作 hbaseorg.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /tmp/member member ----/tmp/member 步骤3中hfile数据的输出路径 ----member 备集群上要导入数据的表名 此种方式的优点: 1)在线拷贝不中断业务,由于是scan->put的方式写入新表,所以比CopyTable更加灵活,可灵活配置需要获取的数据,数据可增量写入 限制和约束: 1)由于Export是通过MR任务往远端hdfs写入SequenceFile,之后Import再把SequenceFile读出来写入hbase,实际效率不高,且需要跑两次MR任务
-
现象描述HBase客户端程序启动并登录时,登录失败。可能原因 [*]客户端环境中没有正确配置krb5文件,该原因只会出现在安全模式下,普通模式不涉及。 [*]客户端环境的配置文件“hbase-site.xml”中没有配置访问HBase集群的用户名和密码文件等信息,或者所提供的密码文件已经过期,该原因只会出现在安全模式下,普通模式不涉及。 [*]客户端环境中的jar包与集群中的jar包不一致。 [*]客户端环境中的时间和集群的时间不一致,且相差超出3分钟以上。 定位思路 [*]安全模式下,如果krb5配置文件不一致,请更新本地的配置文件。 [*]安全模式下,如果“hbase-site.xml”中没有正确配置printcipal和keytab等信息,请在配置文件中增加。 [*]如果jar包不一致,请使用集群中的jar包来更新替换本地的jar包。 [*]如果时间不一致,请尽量修改本地的时间,使其与集群时间一致,不建议直接修改集群的时间(修改集群时间的操作为高危操作,请务必谨慎)。 [*]排查修改发现问题后重启客户端程序,正常耗时10分钟。 处理步骤 [*](可选)若为安全模式,检查本地的krb5配置文件,是否与集群中的配置一致。 [*]Windows环境中的配置文件路径:“C:\Windows\krb5.ini”。 [*]Linux环境中的配置文件路径:“/etc/krb5.conf”。 [*](可选)若为安全模式,检查kerberos的principal和keytab文件是否正确。 [*]检查本地环境的时间是否与集群的时间一致。 [*]检查本地环境的jar包与集群中的jar包是否一致(重点检查HBase、ZooKeeper、Hadoop相关的jar包),建议引用HBase lib库下的所有jar文件。
上滑加载中
推荐直播
-
华为AI技术发展与挑战:集成需求分析的实战指南
2024/11/26 周二 18:20-20:20
Alex 华为云学堂技术讲师
本期直播将综合讨论华为AI技术的发展现状,技术挑战,并深入探讨华为AI应用开发过程中的需求分析过程,从理论到实践帮助开发者快速掌握华为AI应用集成需求的框架和方法。
去报名 -
华为云DataArts+DWS助力企业数据治理一站式解决方案及应用实践
2024/11/27 周三 16:30-18:00
Walter.chi 华为云数据治理DTSE技术布道师
想知道数据治理项目中,数据主题域如何合理划分?数据标准及主数据标准如何制定?数仓分层模型如何合理规划?华为云DataArts+DWS助力企业数据治理项目一站式解决方案和应用实践告诉您答案!本期将从数据趋势、数据治理方案、数据治理规划及落地,案例分享四个方面来助力企业数据治理项目合理咨询规划及顺利实施。
去报名
热门标签