本篇文章为大家展示了如何实现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异常。
分析步骤:
通过日志可以看到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连接地址被正确的读取!!!
既然客户端配置下发是正常的,那么原因要么就是因为权限不足(平时普通用户通常报错的最大可能性),要么这是配置文件读的不对(比如用户读取的zookeeper配置文件在被定位到了非CDH的配置目录)。有了思路,开始进行下一步的验证。
要验证到底是不是普通用户的问题?很简单,再弄一个普通用户试试就好!
接下来,在另外一台CDH客户端节点机器上,使用普通用户登陆,执行同样的Sqoop命令,发现也能够成功导入!!!
对比两台客户端节点机器上,edwuser用户的环境变量(分别执行printenv获得这些环境变量):
(用户的环境变量对比,左侧为有问题的机器 ,右侧为正常的机器)
发现出问题的那台机器上,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异常的分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
原创文章,作者:6024010,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/231855.html