完全分布式安装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.下载其他:
[[email protected] opt]# wget https://mirrors.cnnic.cn/apache/storm/apache-storm-1.1.0/apache-storm-1.1.0.tar.gz –no-check-certificate
wget https://mirrors.cnnic.cn/apache/sqoop/1.99.7/sqoop-1.99.7-bin-hadoop200.tar.gz –no-check-certificate
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
wget https://mirrors.cnnic.cn/apache/kafka/0.10.1.1/kafka_2.11-0.10.1.1.tgz –no-check-certificate
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使用的目录:–四个节点都要执行
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
mapreduce.framework.name
yarn
mapreduce.jobhistory.address
www.ljt.cos01:10020
mapreduce.jobhistory.webapp.address
www.ljt.cos01:19888
7.配置yarn-site.xml
(1)
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访问了
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:
[[email protected] ~]# /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
[[email protected] ~]# /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
[[email protected] zookeeper-3.5.2-alpha]# cat myid
www.ljt.cos01 1
www.ljt.cos02 2
www.ljt.cos03 3
2.单个节点配置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
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.报错处理
[[email protected] 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.QuorumPeerConfig ConfigException:Addressunresolved:www.ljt.cos01:3888atorg.apache.zookeeper.server.quorum.QuorumPeer QuorumServer.(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
[[email protected] 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)是四个节点时间不同步
处理:
[[email protected] ~]# 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
[[email protected] ~]# ntpdate www.ljt.cos01
7 Apr 16:51:55 ntpdate[14684]: step time server 192.168.85.129 offset -38.280736 sec
[[email protected] ~]# 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 文件, 在其中添加以下内容:
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.HiveMetaStore HMSHandler.getMS(HiveMetaStore.java:547)atorg.apache.hadoop.hive.metastore.HiveMetaStore HMSHandler.createDefaultDB(HiveMetaStore.java:612)
at org.apache.hadoop.hive.metastore.HiveMetaStore HMSHandler.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
[[email protected] 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.启动和查看
[[email protected] lib]# pwd
/app/apache-hive-2.1.1-bin/lib
[[email protected] 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!到这里我们就顺利的获取到了我们希望的结果了!