您的位置:首页 > 运维架构

完全分布式安装Hadoop,Hive,Hbase,Hwi,Zookeeper

2017-07-26 10:11 741 查看
完全分布式安装Hadoop,Hive,Hbase,Hwi,Zookeeper

其他部分见:

HDFS YARN zookeeper HBASE HIVE HIVE hwi的启动

HDFS和HBASE动态增加和减少节点

一.下载介质到/opt下面:

1.hadoop

wget http://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz

2.下载jdk1.8.0_121

3.下载mysql

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-server-5.7.17-1.el6.x86_64.rpm –no-check-certificate

4.下载hive

wget http://mirrors.cnnic.cn/apache/hive/hive-2.1.1/apache-hive-2.1.1-bin.tar.gz

wget http://mirrors.cnnic.cn/apache/hive/hive-2.1.1/apache-hive-2.1.1-src.tar.gz

5.下载zookeeper

wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.2-alpha/zookeeper-3.5.2-alpha.tar.gz –no-check-certificate

6.下载hbase

wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/1.3.0/hbase-1.3.0-bin.tar.gz –no-check-certificate

7.下载其他:

下载storm

[root@www.ljt.cos02 opt]# wget https://mirrors.cnnic.cn/apache/storm/apache-storm-1.1.0/apache-storm-1.1.0.tar.gz –no-check-certificate

下载sqoop

wget https://mirrors.cnnic.cn/apache/sqoop/1.99.7/sqoop-1.99.7-bin-hadoop200.tar.gz –no-check-certificate

下载spark

wget https://mirrors.cnnic.cn/apache/spark/spark-2.1.0/spark-2.1.0-bin-hadoop2.7.tgz –no-check-certificate

wget https://mirrors.cnnic.cn/apache/spark/spark-2.1.0/spark-2.1.0-bin-without-hadoop.tgz –no-check-certificate

下载kafka

wget https://mirrors.cnnic.cn/apache/kafka/0.10.1.1/kafka_2.11-0.10.1.1.tgz –no-check-certificate

下载flume

wget https://mirrors.cnnic.cn/apache/flume/1.7.0/apache-flume-1.7.0-bin.tar.gz –no-check-certificate

二.准备3个节点:

1.www.ljt.cos01, www.ljt.cos02, www.ljt.cos03而且已经配置了ssh互信,而且已经关闭了防火墙

2.应用解压安装目录为/app

3.HDFS目录为:/app/dirhadoop/

三.安装hadoop

1.环境变量—四个节点都要执行

echo ‘export JAVA_HOME=/app/jdk1.8.0_121’ >> /etc/profile

echo ‘export CLASS_PATH=.:JAVAHOME/lib/dt.jar:JAVA_HOME/lib/tools.jar’ >> /etc/profile

echo ‘export HADOOP_HOME=/app/hadoop-2.7.3’ >>/etc/profile

echo ‘export PATH=PATH:HADOOP_HOME/bin:JAVAHOME/bin:JAVA_HOME/jre/bin’ >> /etc/profile

source /etc/profile

2.创建HDFS使用的目录:–四个节点都要执行

#core-site.xml的hadoop.tmp.dir

mkdir -p /app/dirhadoop/tmp

#hdfs-site.xml的dfs.namenode.name.dir

mkdir -p /app/dirhadoop/dfs/name

#hdfs-site.xml的dfs.datanode.data.dir

mkdir -p /app/dirhadoop/dfs/data

3.配置hadoop-env.sh

echo ‘export JAVA_HOME=/app/jdk1.8.0_121’ >>/app/hadoop-2.7.3/etc/hadoop/hadoop-env.sh

4.配置core-site.xml

(1)hadoop.tmp.dir定义了hdfs的临时文件存放目录

(2)>fs.default.name指定了如何访问HDFS,例如hbase设置为:

hbase.rootdirhdfs://www.ljt.cos01:9000/hbase

vi /app/hadoop-2.7.3/etc/hadoop/core-site.xml

fs.default.name

hdfs://www.ljt.cos01:9000

hadoop.tmp.dir

/app/dirhadoop/tmp

5.配置hdfs-site.xml

(1)dfs.namenode.name.dir

(2)dfs.datanode.data.dir

dfs.replication

2

dfs.namenode.name.dir

file:/app/dirhadoop/dfs/name

dfs.datanode.data.dir

file:/app/dirhadoop/dfs/data

6.配置mapred-site.xml

(1)mapreduce.jobhistory.webapp.address

定义了访问网址

(2)部署完成之后,可以通过sbin/mr-jobhistory-daemon.sh start historyserver

启动mapreduce.jobhistory.webapp

vi /app/hadoop-2.7.3/etc/hadoop/mapred-site.xml

mapreduce.framework.name

yarn

mapreduce.jobhistory.address

www.ljt.cos01:10020

mapreduce.jobhistory.webapp.address

www.ljt.cos01:19888

7.配置yarn-site.xml

(1)

vi /app/hadoop-2.7.3/etc/hadoop/slaves

www.ljt.cos02

www.ljt.cos03

node04

(2)

a.yarn.resourcemanager.webapp.address定义网页访问:

/app/hadoop-2.7.3/sbin/start-yarn.sh启动之后,就可以类似

http://192.168.13.129:8088/cluster访问了

vi /app/hadoop-2.7.3/etc/hadoop/yarn-site.xml

yarn.nodemanager.aux-services

mapreduce_shuffle

yarn.nodemanager.aux-services.mapreduce.shuffle.class

org.apache.hadoop.mapred.ShuffleHandler

yarn.resourcemanager.address

www.ljt.cos01:8032

yarn.resourcemanager.scheduler.address

www.ljt.cos01:8030

yarn.resourcemanager.resource-tracker.address

www.ljt.cos01:8031

yarn.resourcemanager.admin.address

www.ljt.cos01:8033

yarn.resourcemanager.webapp.address

www.ljt.cos01:8088

8.www.ljt.cos01完成以上配置之后:

scp -r /app/hadoop-2.7.3 www.ljt.cos02:/app/

scp -r /app/hadoop-2.7.3 www.ljt.cos03:/app/

scp -r /app/hadoop-2.7.3 node04:/app/

9.在master节点(www.ljt.cos01)格式化hdfs

hdfs namenode -format

10.完成之后,master节点启动HDFS

(1)启动hdfs:

[root@www.ljt.cos01 ~]# /app/hadoop-2.7.3/sbin/start-dfs.sh

Starting namenodes on [www.ljt.cos01]

www.ljt.cos01: Warning: Permanently added the RSA host key for IP address ‘192.168.13.129’ to the list of known hosts.

www.ljt.cos01: starting namenode, logging to /app/hadoop-2.7.3/logs/hadoop-root-namenode-www.ljt.cos01.out

www.ljt.cos02: starting datanode, logging to /app/hadoop-2.7.3/logs/hadoop-root-datanode-www.ljt.cos02.out

www.ljt.cos03: starting datanode, logging to /app/hadoop-2.7.3/logs/hadoop-root-datanode-www.ljt.cos03.out

node04: starting datanode, logging to /app/hadoop-2.7.3/logs/hadoop-root-datanode-node04.out

Starting secondary namenodes [0.0.0.0]

0.0.0.0: starting secondarynamenode, logging to /app/hadoop-2.7.3/logs/hadoop-root-secondarynamenode-www.ljt.cos01.out

网页查看:

http://192.168.13.129:50070/dfshealth.html#tab-overview

(2)启动yarn

[root@www.ljt.cos01 ~]# /app/hadoop-2.7.3/sbin/start-yarn.sh

starting yarn daemons

starting resourcemanager, logging to /app/hadoop-2.7.3/logs/yarn-root-resourcemanager-www.ljt.cos01.out

www.ljt.cos03: starting nodemanager, logging to /app/hadoop-2.7.3/logs/yarn-root-nodemanager-www.ljt.cos03.out

www.ljt.cos02: starting nodemanager, logging to /app/hadoop-2.7.3/logs/yarn-root-nodemanager-www.ljt.cos02.out

node04: starting nodemanager, logging to /app/hadoop-2.7.3/logs/yarn-root-nodemanager-node04.out

网页查看:yarn.resourcemanager.webapp.address

http://192.168.13.129:8088/cluster/nodes

(1)启动historyserver

sbin/mr-jobhistory-daemon.sh start historyserver

http://192.168.13.129:19888/jobhistory

四.安装Zookeeper

1.单个创建文件myid

hosts为www.ljt.cos01,www.ljt.cos02,www.ljt.cos03,node04,也可以是IP

[root@www.ljt.cos01 zookeeper-3.5.2-alpha]# cat myid

www.ljt.cos01 1

www.ljt.cos02 2

www.ljt.cos03 3

2.单个节点配置zoo.cfg

[root@www.ljt.cos01 conf]# cat zoo_sample.cfg

vi zoo.cfg

tickTime=2000

dataDir=/opt/apps/zookeeper

clientPort=2181

initLimit=5

syncLimit=2

server.1=www.ljt.cos01:2888:3888

server.2=www.ljt.cos02:2888:3888

server.3=www.ljt.cos03:2888:3888

server.1,server.2,server.3,server.4和myid相匹配

3.4 复制和启动

3.Zookeeper复制到其他所有节点:

scp -r /opt/apps/zookeeper www.ljt.cos02:/app

scp -r /opt/apps/zookeeper www.ljt.cos03:/app

scp -r /opt/apps/zookeeper node04:/app

4.每个节点执行:

/opt/apps/zookeeper/bin/zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /opt/apps/zookeeper/bin/../conf/zoo.cfg

Starting zookeeper … STARTED

(1)状态:/opt/apps/zookeeper/bin/zkServer.sh status

Mode: leader

Mode: follower

5.报错处理

[root@www.ljt.cos01 logs]# cat zookeeper-root-server-www.ljt.cos01.out

2017-04-07 15:47:22,297 [myid:] - INFO [main:QuorumPeerConfig@116] - Reading configuration from: /opt/apps/zookeeper/bin/../conf/zoo.cfg

2017-04-07 15:47:22,304 [myid:] - INFO [main:QuorumPeerConfig@318] - clientPortAddress is 0.0.0.0/0.0.0.0:2181

2017-04-07 15:47:22,304 [myid:] - INFO [main:QuorumPeerConfig@322] - secureClientPort is not set

2017-04-07 15:47:22,311 [myid:] - ERROR [main:QuorumPeerMain@86] - Invalid config, exiting abnormally

org.apache.zookeeper.server.quorum.QuorumPeerConfigConfigException:Addressunresolved:www.ljt.cos01:3888atorg.apache.zookeeper.server.quorum.QuorumPeerQuorumServer.(QuorumPeer.java:242)

at org.apache.zookeeper.server.quorum.flexible.QuorumMaj.(QuorumMaj.java:89)

at org.apache.zookeeper.server.quorum.QuorumPeerConfig.createQuorumVerifier(QuorumPeerConfig.java:524)

at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseDynamicConfig(QuorumPeerConfig.java:557)

at org.apache.zookeeper.server.quorum.QuorumPeerConfig.setupQuorumPeerConfig(QuorumPeerConfig.java:530)

at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:353)

at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:133)

at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:110)

at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:79)

分析:这个报错原因是zoo.cfg配置文件,server.1=www.ljt.cos01:2888:3888后面有空格导致

五.安装HBASE

1.每个节点执行环境变量:

echo ‘export HBASE_HOME=/opt/apps/hbase1.2.6 ’ >> /etc/profile

echo ‘export PATH=PATH:HBASE_HOME/bin’ >> /etc/profile

source /etc/profile

2.配置hbase-env.sh

(1)

mkdir logs #Hbase日志目录

(2)

echo ‘export JAVA_HOME=/usr/local/jdk1.8.0_131’ >> conf/hbase-env.sh

echo ‘export HADOOP_HOME=/home/hadoop/hadoop2.7’>> conf/hbase-env.sh

echo ‘export HBASE_HOME=/opt/apps/hbase1.2.6’ >> conf/hbase-env.sh

echo ‘export HBASE_MANAGES_ZK=false’ >> conf/hbase-env.sh

echo ‘export HBASE_LOG_DIR=/opt/apps/hbase1.2.6/logs’ >> conf/hbase-env.sh

3.配置hbase-site.xml

(1)hbase.master.info.port指定了hbase web客户端的访问网址

(2)hbase.rootdir指定了在HDFS中的位置,根目录参考core-sit.xml的fs.default.name

(3)hbase.zookeeper相关属性参照zookeeper的配置:

hbase.rootdir

hdfs://www.ljt.cos01:9000/hbase

hbase.cluster.distributed

true

hbase.master

www.ljt.cos01:60000

hbase.zookeeper.property.dataDir

/opt/apps/zookeeper

hbase.zookeeper.quorum

www.ljt.cos01, www.ljt.cos02, www.ljt.cos03

hbase.zookeeper.property.clientPort

2181

hbase.master.info.port

60010

4.配置regionservers

[root@www.ljt.cos01 hbase-1.3.0]# cat conf/regionservers

www.ljt.cos02

www.ljt.cos03

node04

5.scp到各个节点:

6.启动

启动之前得保证ZK和hadoop已经启动

[master@master1 hbase]$ bin/start-hbase.sh

7.报错处理:

(1)hbase(main):006:0> t1 = create ‘t1’, ‘f1’

ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing

(2)是四个节点时间不同步

处理:

[root@www.ljt.cos01 ~]# cat /etc/ntp.conf

restrict default nomodify

restrict 127.0.0.1

server 127.127.1.0

fudge 127.127.1.0 stratum 10

driftfile /var/lib/ntp/drift

broadcastdelay 0.008

[root@www.ljt.cos02 ~]# ntpdate www.ljt.cos01

7 Apr 16:51:55 ntpdate[14684]: step time server 192.168.85.129 offset -38.280736 sec

[root@www.ljt.cos03 ~]# ntpdate www.ljt.cos01

7 Apr 16:52:04 ntpdate[9019]: step time server 192.168.85.129 offset -40.609528 sec

[root@node04 ~]# ntpdate www.ljt.cos01

7 Apr 16:52:14 ntpdate[9042]: step time server 192.168.85.129 offset -38.668817 sec

六.安装HIVE

下载Hive安装包

可以从 Apache 其中一个镜像站点中下载最新稳定版的 Hive, apache-hive-2.1.1-bin.tar.gz。

解压安装Hive

使用以下命令安装 Hive:

sudo mv apache-hive-2.1.1-bin.tar.gz /opt

cd /opt

sudo tar -xzvf apache-hive-2.1.1-bin.tar.gz ##解压

sudo ln -s apache-hive-2.1.1-bin hive ##创建软链接

设置 Hive环境变量

编辑 .bash_profile 文件, 在其中添加以下内容:

Hive Env

export HIVE_HOME=/opt/hive

export PATH=PATH:HIVE_HOME/bin

使环境变量生效:

source .bash_profile

配置Hive

配置文件重命名

在运行 Hive 之前需要使用以下命令修改配置文件:

cd /opt/hive/conf

cp hive-env.sh.template hive-env.sh

cp hive-default.xml.template hive-site.xml

cp hive-log4j2.properties.template hive-log4j2.properties

cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties

修改hive-env.sh

因为 Hive 使用了 Hadoop, 需要在 hive-env.sh 文件中指定 Hadoop 安装路径:

export JAVA_HOME=/opt/java ##Java路径

export HADOOP_HOME=/opt/hadoop ##Hadoop安装路径

export HIVE_HOME=/opt/hive ##Hive安装路径

export HIVE_CONF_DIR=/opt/hive/conf ##Hive配置文件路径

创建HDFS目录

在 Hive 中创建表之前需要创建以下 HDFS 目录并给它们赋相应的权限。

hdfs dfs -mkdir -p /user/hive/warehouse

hdfs dfs -mkdir -p /user/hive/tmp

hdfs dfs -mkdir -p /user/hive/log

hdfs dfs -chmod g+w /user/hive/warehouse

hdfs dfs -chmod g+w /usr/hive/tmp

hdfs dfs -chmod g+w /usr/hive/log

修改hive-site.xml

将 hive-site.xml 文件中以下几个配置项的值设置成上一步中创建的几个路径。

hive.exec.scratchdir

/user/hive/tmp

HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: {hive.exec.scratchdir}/<username> is created, with{hive.scratch.dir.permission}.

hive.metastore.warehouse.dir

/user/hive/warehouse

location of default database for the warehouse

hive.querylog.location

/user/hive/log

Location of Hive run time structured log file

Hive Metastore

默认情况下, Hive 的元数据保存在内嵌的 Derby 数据库里, 但一般情况下生产环境会使用 MySQL 来存放 Hive 元数据。

创建数据库和用户

假定你已经安装好 MySQL。下面创建一个 hive 数据库用来存储 Hive 元数据,且数据库访问的用户名和密码都为 hive。

mysql> CREATE DATABASE hive;

mysql> USE hive;

mysql> CREATE USER ‘hive’@’localhost’ IDENTIFIED BY ‘hive’;

mysql> GRANT ALL ON hive.* TO ‘hive’@’localhost’ IDENTIFIED BY ‘hive’;

mysql> GRANT ALL ON hive.* TO ‘hive’@’%’ IDENTIFIED BY ‘hive’;

mysql> FLUSH PRIVILEGES;

mysql> quit;

修改hive-site.xml

需要在 hive-site.xml 文件中配置 MySQL 数据库连接信息。

javax.jdo.option.ConnectionURL

jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=false

javax.jdo.option.ConnectionDriverName

com.mysql.jdbc.Driver

javax.jdo.option.ConnectionUserName

hive

javax.jdo.option.ConnectionPassword

hive

运行Hive

在命令行运行 hive 命令时必须保证以下两点:

1. HDFS 已经启动。可以使用 start-dfs.sh 脚本来启动 HDFS。

2. MySQL Java 连接器添加到 $HIVE_HOME/lib 目录下。我安装时使用的是 mysql-connector-java-5.1.39.jar。

从 Hive 2.1 版本开始, 我们需要先运行 schematool 命令来执行初始化操作。

schematool -dbType mysql -initSchema

终端输出信息如下:

执行成功后,可以使用 Sequel Pro 查看元数据库 hive 是否已经创建成功。

要使用 Hive CLI(Hive command line interface), 可以在终端输入以下命令:

hive

启动信息如下:

使用 show tables 来显示所有的表:

问题总结

SSL问题

启动 hive 时,提示以下信息:

Sat May 21 10:25:12 CST 2016 WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL

connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

解决方法:在 hive-site.xml 配置文件中 javax.jdo.option.ConnectionURL 配置项的值上加上 useSSL=false。即最后的配置如下:

javax.jdo.option.ConnectionURL

jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false

JDBC connect string for a JDBC metastore

initSchema问题

启动 hive 时,提示以下信息:

Exception in thread “main” java.lang.RuntimeException: Hive metastore database is not initialized. Please use schematool (e.g. ./schematool -initSchema -dbType …) to create the schema. If needed, don’t forget to include the option to auto-create the underlying database in your JDBC connection string (e.g. ?createDatabaseIfNotExist=true for mysql)

解决方法:执行 schematool -initSchema -dbType mysql。即安装 Hive 后,在首次运行 hive 之前要执行以上命令。

相对路径问题

启动Hive时报以下错误:

Exception in thread “main”java.lang.RuntimeException: java.lang.IllegalArgumentException:java.net.URISyntaxException: Relative path in absolute URI:{system:java.io.tmpdir%7D/%7Bsystem:user.name%7D

atorg.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:444)

atorg.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:672)

atorg.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:616)

atsun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

atjava.lang.reflect.Method.invoke(Method.java:606)

atorg.apache.hadoop.util.RunJar.main(RunJar.java:160)

Caused by: java.lang.IllegalArgumentException:java.net.URISyntaxException: Relative path in absolute URI:{system:java.io.tmpdir%7D/%7Bsystem:user.name%7D

atorg.apache.hadoop.fs.Path.initialize(Path.java:148)

atorg.apache.hadoop.fs.Path.(Path.java:126)

atorg.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:487)

atorg.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:430)

… 7more

解决方案:将 hive-site.xml 中的 system:java.io.tmpdir和{system:user.name} 分别替换成 /tmp 和 user.namemysql−connector−java版本问题启动Hive时报以下错误:Exceptioninthread“main”java.lang.RuntimeException:org.apache.hadoop.hive.ql.metadata.HiveException:java.lang.RuntimeException:Unabletoinstantiateorg.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientatorg.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:578)atorg.apache.hadoop.hive.ql.session.SessionState.beginStart(SessionState.java:518)atorg.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:705)atorg.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:641)atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)atjava.lang.reflect.Method.invoke(Method.java:498)atorg.apache.hadoop.util.RunJar.run(RunJar.java:221)atorg.apache.hadoop.util.RunJar.main(RunJar.java:136)Causedby:org.apache.hadoop.hive.ql.metadata.HiveException:java.lang.RuntimeException:Unabletoinstantiateorg.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientatorg.apache.hadoop.hive.ql.metadata.Hive.registerAllFunctionsOnce(Hive.java:226)atorg.apache.hadoop.hive.ql.metadata.Hive.(Hive.java:366)atorg.apache.hadoop.hive.ql.metadata.Hive.create(Hive.java:310)atorg.apache.hadoop.hive.ql.metadata.Hive.getInternal(Hive.java:290)atorg.apache.hadoop.hive.ql.metadata.Hive.get(Hive.java:266)atorg.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:545)…9moreCausedby:java.lang.RuntimeException:Unabletoinstantiateorg.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientatorg.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1627)atorg.apache.hadoop.hive.metastore.RetryingMetaStoreClient.(RetryingMetaStoreClient.java:80)atorg.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:130)atorg.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:101)atorg.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:3317)atorg.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:3356)atorg.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:3336)atorg.apache.hadoop.hive.ql.metadata.Hive.getAllFunctions(Hive.java:3590)atorg.apache.hadoop.hive.ql.metadata.Hive.reloadFunctions(Hive.java:236)atorg.apache.hadoop.hive.ql.metadata.Hive.registerAllFunctionsOnce(Hive.java:221)…14moreCausedby:java.lang.reflect.InvocationTargetExceptionatsun.reflect.NativeConstructorAccessorImpl.newInstance0(NativeMethod)atsun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)atsun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)atjava.lang.reflect.Constructor.newInstance(Constructor.java:423)atorg.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1625)…23moreCausedby:javax.jdo.JDODataStoreException:ExceptionthrownobtainingschemacolumninformationfromdatastoreNestedThrowables:java.sql.SQLException:ColumnnamepatterncannotbeNULLorempty.atorg.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:543)atorg.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:720)atorg.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:740)atorg.apache.hadoop.hive.metastore.ObjectStore.setMetaStoreSchemaVersion(ObjectStore.java:7763)atorg.apache.hadoop.hive.metastore.ObjectStore.checkSchema(ObjectStore.java:7657)atorg.apache.hadoop.hive.metastore.ObjectStore.verifySchema(ObjectStore.java:7632)atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)atjava.lang.reflect.Method.invoke(Method.java:498)atorg.apache.hadoop.hive.metastore.RawStoreProxy.invoke(RawStoreProxy.java:101)atcom.sun.proxy.Proxy21.verifySchema(Unknown Source)

at org.apache.hadoop.hive.metastore.HiveMetaStoreHMSHandler.getMS(HiveMetaStore.java:547)atorg.apache.hadoop.hive.metastore.HiveMetaStoreHMSHandler.createDefaultDB(HiveMetaStore.java:612)

at org.apache.hadoop.hive.metastore.HiveMetaStoreHMSHandler.init(HiveMetaStore.java:398)atorg.apache.hadoop.hive.metastore.RetryingHMSHandler.(RetryingHMSHandler.java:78)atorg.apache.hadoop.hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.java:84)atorg.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:6396)atorg.apache.hadoop.hive.metastore.HiveMetaStoreClient.(HiveMetaStoreClient.java:236)atorg.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient.(SessionHiveMetaStoreClient.java:70)…28more解决方案:将HIVE_HOME/lib 下 的 mysql-connector-java-6.0.3.jar 替换成 mysql-connector-java-5.1.39.jar。 原因分析:mysql-connector-java 6.x 版本 和 5.1.x 版本不兼容 , nullNamePatternMatchesAll 连接属性的默认值在 mysql-connector-java 5.1 和 6.0 之间发生了改变. 在 5.1 版本中默认值是 true, 而 6.0 版本中默认值是 false。可以参考文章 https://liquibase.jira.com/browse/CORE-2723

七.安装hive hwi

1.打包hive-hwi-2.1.1.war

[root@www.ljt.cos01 hwi]# pwd

/app/hive_src/apache-hive-2.1.1-src

jar cvfM0 hive-hwi-2.1.1.war -C web/ .

cp hive-hwi-2.1.1.war /app/apache-hive-2.1.1-bin/lib/

2.hive-site.xml中添加

hive.hwi.war.file

lib/hive-hwi-2.1.1.war

This sets the path to the HWI war file, relative to ${HIVE_HOME}.

hive.hwi.listen.host

www.ljt.cos01

This is the host address the Hive Web Interface will listen on

hive.hwi.listen.port

9999

This is the port the Hive Web Interface will listen on

3.启动和查看

[root@www.ljt.cos01 lib]# pwd

/app/apache-hive-2.1.1-bin/lib

[root@www.ljt.cos01 lib]# nohup hive –service hwi &

查看

http://www.ljt.cos01:9999/hwi/index.jsp

http://www.ljt.cos01:9999/hwi/index.jsp

八、Hive整合HBase原理

Hive与hbase整合的实现是利用两者本身对外的API接口互相通信来完成的,其具体工作交由Hive的lib目录中的hive-hbase-handler-*.jar工具类来实现,通信原理如下图所示。

Hive整合HBase后的使用场景:

(一)通过Hive把数据加载到HBase中,数据源可以是文件也可以是Hive中的表。

(二)通过整合,让HBase支持JOIN、GROUP等SQL查询语法。

(三)通过整合,不仅可完成HBase的数据实时查询,也可以使用Hive查询HBase中的数据完成复杂的数据分析

6 Hive整合HBase配置

Hive提供了与HBase的集成,使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询

应用场景

1. 将ETL操作的数据存入HBase

HBase作为Hive的数据源

构建低延时的数据仓库

使用

6.1 Hive映射HBase表

// 如果hbase是集群,需要修改hive-site.xml文件配置

vimhive−site.xmlhbase.zookeeper.quorumwww.ljt.cos01,www.ljt.cos02,www.ljt.cos03//将hbaselib目录下的所有文件复制到hivelib目录中 cd app/hive-1.1.0-cdh5.7.1/

cp /opt/apps/hbase1.2.6/lib/∗lib///在hive中创建映射表 hive shell

create table hive_hbase_test(key int,value string) stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’ with serdeproperties(“hbase.columns.mapping”=”:key,cf1:val”) tblproperties(“hbase.table.name”=”hive_hbase_test”);

备注:在hive中创建表hive_hbase_test,这个表包括两个字段(int型的key和string型的value),映射为hbase中的表hive_hbase_test,key对应hbase的rowkey,value对应hbase的cf1:val列。

2017-07-21 22:35:18,664 INFO [f99009cc-7153-4429-a88c-03ced8a7e4d7 main] client.ZooKeeperRegistry: ClusterId read in ZooKeeper is null

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:java.lang.RuntimeException: java.lang.NullPointerException

Caused by: java.lang.NullPointerException

at org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher.getMetaReplicaNodes(ZooKeeperWatcher.java:395)

// 在hbase中查看是否存在映射表

$ hbase shell

list

6.2 整合后功能测试

// 创建测试数据

$ vim poke.txt

1 zhangsan

2 lisi

3 wangwu

// 在hive中创建一个poke表并加载测试数据

create table poke(key int,valuestring) row format delimited fields terminated by ‘\t’;

load data local inpath’/home/developer/poke.txt’ overwrite into table poke;

select * from poke;

// 将hive的poke表中的数据加载到hive_hbase_test表

insert overwrite table hive_hbase_test select * from poke;

select * from hive_hbase_test;

// 查看hbase的hive_hbase_test表中是否有同样的数据

scan ‘hive_hbase_test’

需要说明以下几点:

(一)Hive映射表的字段是HBase表字段的子集。整合之后的Hive表不能被修改。

(二)Hive中的映射表不能直接插入数据,所以需要通过将数据加载到另一张poke表,然后通过查询poke表将数据加载到映射表。

(三)上述示例是通过创建内部表的方式将Hive表映射到HBase表,HBase表会自动创建,而且Hive表被删除后HBase表也会自动删除。

(四)如果HBase表已有数据,可以通过创建Hive外部表的方式将Hive表映射到HBase表,通过HQLHive表实现对HBase表的数据分析。Hive表删除将不会对HBase表造成影响。创建外部表的方法如下:

create external table hive_hbase_test(key int,value string)stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’ with serdeproperties(“hbase.columns.mapping”=”:key,cf1:val”) tblproperties(“hbase.table.name”=”hive_hbase_test”);

启动hive

bin/hive

6.建表(默认是内部表)

create table trade_detail(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by ‘\t’;

建分区表

create table td_part(id bigint, account string, income double, expenses double, time string) partitioned by (logdate string) row format delimited fields terminated by ‘\t’;

建外部表

create external table td_ext(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by ‘\t’ location ‘/td_ext’;

7.创建分区表

普通表和分区表区别:有大量数据增加的需要建分区表

create table book (id bigint, name string) partitioned by (pubdate string) row format delimited fields terminated by ‘\t’;

分区表加载数据
load data local inpath './book.txt' overwrite into table book partition (pubdate='2010-08-22');

load data local inpath '/root/data.am' into table beauty partition (nation="USA");

select nation, avg(size) from beauties group by nation order by avg(size);


Hive整合hbase的数据流程

近期工作用到了Hive与Hbase的关系整合,虽然从网上参考了很多的资料,但是大多数讲的都不是很细,于是决定将这块知识点好好总结一下供大家分享,共同掌握!

本篇文章在具体介绍hive与hbase整合之前,先给大家用一个流程图介绍Hadoop业务的开发流程以及Hive与Hbase的整合在业务当中的必要性。

其中在数据存入hbase—>Hive对数据进行统计分析的这个步骤中就涉及到了Hive与Hbase的整合,所以了解Hive与Hbase的整合是很有必要的。

1、Hive与Hbase整合的必要性

Hive是建立在hadoop之上的数据仓库基础构架、是为了减少MapReduce编写工作的批处理系统,Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce。Hive可以理解为一个客户端工具,将我们的sql操作转换为相应的MapReduce jobs,然后在Hadoop上面运行。

Hbase全称为Hadoop Database,即Hbase是Hadoop的数据库,是一个分布式的存储系统。Hbase利用Hadoop的HDFS作为其文件存储系统,利用Hadoop的MapReduce来处理Hbase中的海量数据。利用zookeeper作为其协调工具。

Hbase数据库的缺点在于—-语法格式异类,没有类sql的查询方式,因此在实际的业务当中操作和计算数据非常不方便,但是Hive就不一样了,Hive支持标准的sql语法,于是我们就希望通过Hive这个客户端工具对Hbase中的数据进行操作与查询,进行相应的数据挖掘,这就是所谓Hive与hbase整合的含义。Hive与Hbase整合的示意图如下:

2、Hive与Hbase整合—-Hive绑定Hbase中的table

在Hive与Hbase整合的过程中,核心的步骤就是通过Hive绑定Hbase中的table表,绑定完之后,我们就可以通过Hive这个客户端工具对Hbase中的表进行查询了,那么如何进行绑定呢?—-关键在于Hbase中的table如何和hive中建立的table在column级别上建立映射关系。

假设现在在Hbase中有一张表:hbasetable,其数据模型如下:

对于这张表hbasetable,我们在Hive中建立的对应的数据模型如下:

其实从两者的数据模型上来看建立column上的映射关系应该不是一件很难的事情,事实上确实不是很难,相应语法如下:

create external table hivetable(rowkey string, column1 string,column2 string,column3 string)

stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’

with serdeproperties(“hbase.columns.mapping” = “:key,columnfamily1:column1,columnfamily1:column2,columnfamily2:column3”)

tblproperties(“hbase.table.name”=”hbasetable”);

语法具体含义:

上面这个建表语句表示在Hive中建立一个外部表—名字叫做hivetable,与其在Hbase中建立映射关系的表名字为hbasetable,映射关系如下:

hivetable —————————————hbasetable

rowkey<—————>key (Hive中的rowkey字段关联到Hbase中的行健key)

column1<————–>columnfamily1:column1 (hivetable中的column1映射到hbasetable中columnfamily1上的column1字段)

column2<————–>columnfamily1:column2 (hivetable中的column2映射到hbasetable中columnfamily1上的column2字段)

column3<————–>columnfamily2:column3 (hivetable中的column3映射到hbasetable中columnfamily2上的column3字段)

stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’ 的含义是:Hive与Hbase整合功能(互相通信)的实现主要是通过hive_hbase-handler.jar这个工具类来完成的,而语法中的HBaseStorageHandler指的就是这个工具类。

下面用一个具体的实例来说明如何通过Hive来绑定Hbase中的table:

首先我们先在Hbase中建立一个表:customer–其数据模型以及内容如下:

创建完表之后核实一下customer表中的内容,看是否创建成功:

hbase(main):001:0> scan ‘customer’

ROW COLUMN+CELL

xiaoming column=address:city, timestamp=1465142056815, value=hangzhou

xiaoming column=address:country, timestamp=1465142078267, value=china

xiaoming column=address:province, timestamp=1465142041784, value=zhejiang

xiaoming column=info:age, timestamp=1465142102017, value=24

xiaoming column=info:company, timestamp=1465142114558, value=baidu

zhangyifei column=address:city, timestamp=1465142154995, value=shenzhen

zhangyifei column=address:country, timestamp=1465142167587, value=china

zhangyifei column=address:province, timestamp=1465142138872, value=guangdong

zhangyifei column=info:age, timestamp=1465142183538, value=28

zhangyifei column=info:company, timestamp=1465142200569, value=alibaba

2 row(s) in 0.7090 seconds

接着我们根据上面的语法在hive中建立对应的表hive_customer,语法实现如下:

hive> create external table hive_customer(rowkey string, city string,country string,province string,age string,company string)

stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’

with serdeproperties(“hbase.columns.mapping” = “:key,address:city,address:country,address:province,info:age,info:company”)

tblproperties(“hbase.table.name”=”customer”);

通过上面的语法我们就可以在hive中建立对应的表hive_customer了,现在我们查看一下表结构:

hive> describe hive_customer;

OK

rowkey string from deserializer

city string from deserializer

country string from deserializer

province string from deserializer

age string from deserializer

company string from deserializer

Time taken: 0.068 seconds

即:

从上面的这个表结构可以看出,在hive表与hbase表整合的过程中,无非就是建立一个映射关系而已。

现在我们在hive中查看一下hive_customer表的内容:

很明显,hive中表的内容和我们预期想的是一样的,上面这个sql操作由于是全表操作,并没有走MapReduce程序,下面我们实现一个走MapReduce程序的sql操作:

查询hive_customer表中xiaoming的相关信息:

执行操作:

hive> select * from hive_customer

where rowkey=”xiaoming”;

然而hive的运行结果并没有我们像的这么顺利,抛出了下面的异常:

这是为什么呢?—其实对于这个问题也是一个经验的总结,下面将进入我们博客的第三个部分。

3、如何处理异常—–从而使hive与hbase能够顺利的进行相互访问

有必要先介绍一下本次实验的运行环境:

hadoop-1.1.2 (单点部署)

hbase-0.94.7-security (单点部署)

hive-0.9.0 (MetaStore 配置为MySQL数据库)

注:下面的方法对于集群来说同样适用!

解决步骤:

①查看异常中的路径(即异常的URL地址)

http://hadoop80:50060/tasklog?taskid=attempt_201606042144_0002_m_000000_3&start=-8193

将其修改为:

http://hadoop80:50060/tasklog?

attemptid=attempt_201606042144_0002_m_000000_3&start=-8193

然后在网页中查看异常的具体情况:

②从页面的提示:Caused by: Java.lang.ClassNotFoundException: org.apache.hadoop.hive.hbase.HBaseSplit 可以看出明显是缺少某个jar包,这个jar包到底是什么呢?

③这几个jar包分别是:

zookeeper-3.4.5.jar

hbase-0.94.7-security.jar

hbase-0.94.7-security-tests.jar

protobuf-java-2.4.0a.jar

注意:上面这几个jar包指的是hbase(hbase-0.94.7-security )本身自带的几个jar包,然后将这4个jar包拷贝到hive/lib的目录下(注意:如果在hive/lib的目录下已经存在这几个文件的其他版本(例如hbase-0.92.0.jar、hbase-0.92.0-tests.jar、zookeeper-3.4.3.jar—先将hive自带的这几个版本删除掉,然后在拷贝hbase下的相关版本)

④在hive/conf的hive-site.xml文件中,添加如下内容:

hive.aux.jars.path

file:///usr/local/hive/lib/zookeeper-3.4.5.jar,file:///usr/local/hive/lib/hbase-0.94.7-security.jar,file:///usr/local/hive/lib/hbase-0.94.7-security-tests.jar,file:///usr/local/hive/lib/protobuf-java-2.4.0a.jar,file:///usr/local/hive/lib/hive-hbase-handler-0.9.0.jar

注意:通过上面的这几行配置文件,可以加载Hive默认没有加载的这4个jar包(zookeeper-3.4.5.jar、

hbase-0.94.7-security.jar、hbase-0.94.7-security-tests.jar、protobuf-java-2.4.0a.jar),但是在这里我有一点一直没有搞懂:hive-hbase-handler-0.9.0.jar这个jar包在hive中默认已经添加了,但是我们在编写配置文件的时候还必须写上,否则业务开发中就会出错–如果有知道这个原因的博友,欢迎留言。

⑤拷贝zookeeper-3.4.5.jar、hbase-0.94.7-security.jar、hbase-0.94.7-security-tests.jar、protobuf-java-2.4.0a.jar这四个jar包到所有hadoop节点的lib目录下(我本次实验的时候用的是单点,所以就拷贝一个)。

⑥拷贝hbase/conf下的hbase-site.xml文件到所有hadoop节点conf目录下。

⑦重启hadoop、hbase、hive。

经过上面7个详细的步骤,这个异常问题我们就彻底解决了,下面我们在重新执行一下业务:

查询hive_customer表中xiaoming的相关信息:

操作:

OK!到这里我们就顺利的获取到了我们希望的结果了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hadoop hbase zookeeper hive
相关文章推荐