您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何實現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異常的分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。