如何实现Sqoop导入报Zookeeper ConnectionException异常的分析

本篇文章为大家展示了如何实现Sqoop导入报Zookeeper ConnectionException异常的分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

环境:

CDH 6.3.0

已开启Kerberos

Java 版本: 1.8.0_181


症状表现:

在普通用户edwuser下,在一台CDH客户端节点机器上,执行以下sqoop import命令,将MYSQL数据导入HBASE中:

sqoop import \--connectjdbc:mysql://db01:3306/test?characterEncoding=UTF-8 \--username root \--password mysql \--table cust_info \--hbase-tabletest:cust_info \--column-family cf \--hbase-create-table\--hbase-row-key id \-m 1

执行报错。卡在了连接Zookeeper这部分,连接被拒绝,抛出ConnectionException异常。

如何实现Sqoop导入报Zookeeper ConnectionException异常的分析


 

分析步骤:

通过日志可以看到Zookeeper连接的地址是127.0.0.1,而非集群上的Zookeeper地址,导致执行失败。

首先怀疑的是CDH相关角色客户端配置信息未正常下发,在CM界面对该客户端节点机器添加了Sqoop Gateway角色,重新下发配置;重试之后依然报同样的错误。

在CDH客户端节点服务器上,浏览/etc/hbase/conf.cloudera.hbase,以及/opt/cloudera/parcels/CDH-6.3.0-1.cdh7.3.0.p0.1279813/etc/zookeeper/conf.dist/等可能存放Zookeeper配置文件的目录。

查看之后发现所有配置文件都是已经正确下发了的,这说明和集群客户端配置部署没有关系。


此时只能换个思路前进,既然配置都正常,那么会不会是普通用户的问题呢?来试试特权用户?

切换到root用户,执行命令,发现可以成功导入,Zookeeper连接地址被正确的读取!!!

如何实现Sqoop导入报Zookeeper ConnectionException异常的分析

既然客户端配置下发是正常的,那么原因要么就是因为权限不足(平时普通用户通常报错的最大可能性),要么这是配置文件读的不对(比如用户读取的zookeeper配置文件在被定位到了非CDH的配置目录)。有了思路,开始进行下一步的验证。


要验证到底是不是普通用户的问题?很简单,再弄一个普通用户试试就好!


接下来,在另外一台CDH客户端节点机器上,使用普通用户登陆,执行同样的Sqoop命令,发现也能够成功导入!!!

对比两台客户端节点机器上,edwuser用户的环境变量(分别执行printenv获得这些环境变量):

如何实现Sqoop导入报Zookeeper ConnectionException异常的分析

(用户的环境变量对比,左侧为有问题的机器 ,右侧为正常的机器)

发现出问题的那台机器上,edwuser用户明确定义了一些看起来命名像是hadoop级别的环境变量到.bashprofile文件,比如....HIVE_HOME变量???

通过搜索关键字HIVE_HOME,在一篇关于SQOOP的文章中,发现了这样的描述:

# Licensedto the Apache Software Foundation (ASF) under one or more# contributor license agreements.  Seethe NOTICE file distributed with# this work for additional information regarding copyright ownership.# The ASF licenses this file to You under the Apache License, Version2.0# (the "License"); you may not use this file except in compliancewith# the License.  You may obtain a copy of theLicense at##     http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS"BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express orimplied.# See the License for the specific language governing permissions and# limitations under the License.# includedin all the hadoop scripts with source command# should not be executable directly# also should not be passed any arguments, since we need original $*# SetHadoop-specific environment variables here.#Set pathto where bin/hadoop is available#hadoop的环境信息必须export HADOOP_COMM/hadoop#Set pathto where hadoop-*-core.jar is available#hadoop的mr存放目录的配置信息必须export HADOOP_MAPRED_HOME=/root/hadoop/tmp/mapred#set thepath to where bin/hbase is available#hbase的配置信息非必须export HBASE_HOME=/root/hbase#Set thepath to where bin/hive is available#hive的配置信息非必须export HIVE_HOME=/root/hive#Set thepath for where zookeper config dir is#export ZOOCFGDIR=

如果是社区版的Sqoop,是可以配置这些环境变量的。但是CDH的配置文件都统一由CM管理和下发,并不需要手工去设置到环境变量中。用户级环境变量出现这些配置,反而覆盖了CM下发的客户端配置。

由于出问题的机器上,设置的用户环境变量是HIVE_HOME=/opt/cloudera/parcels/CDH/ ,熟悉parcels目录结构的同学都知道,/opt/cloudera/parcels/CDH/这个目录的直接层次下,是不存在任何配置文件的,只有继续往下好几级的子目录中才会有配置文件。

所以sqoop执行时,会按照用户环境变量HIVE_HOME的设置,到/opt/cloudera/parcels/CDH/目录,试图读取配置文件,但没有读取到任何配置文件。所以Sqoop只能直接使用Zookeeper Server的默认值127.0.0.1。而客户端机器上当然不会存在Zookeeper Server,自然出现会拒绝连接抛出异常的问题。


解决方法:

由于当时不知道机器上这个用户环境变量HIVE_HOME,到底是谁出于什么目的设置的。就没去直接动用户环境变量文件。

先运行:

unset HIVE_HOME

来临时屏蔽HIVE_HOME这个环境变量,再执行sqoop import命令,导入成功。

上述内容就是如何实现Sqoop导入报Zookeeper ConnectionException异常的分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。