Kerberos簡介、安裝及與其它服務的集成和使用

目錄



1 簡介

Kerberos 於1983年被開發爲 MIT 雅典娜計劃的身份驗證引擎。1987年以開源形式發佈,1993年成爲IETF標準。

Kerberos 最初是在 1980 年代爲麻省理工學院的 Athena 項目開發的,現已發展成爲現代計算機網絡中部署最廣泛的用於身份驗證和授權的系統。Kerberos 當前隨所有主要的計算機操作系統一起提供,並且具有特殊的位置,使其成爲分佈式認證和授權問題的通用解決方案,該問題允許在企業聯盟( federated enterprises)與對等社區(peer-to-peer communities)之間進行“單點登錄”。MIT已開發並維護適用於 Apple Macintosh,Windows 和 Unix 操作系統的 Kerberos 軟件的實現。

1.1 官方文檔連接

這裏該出目前官網最新的版本 1.19 的文檔連接 MIT Kerberos Documentation(1.19-prerelease)

1.2 A guided tour of Kerberos: Tutorial

這裏推薦查看 Fulvio Ricciardi 撰寫 《KERBEROS PROTOCOL TUTORIAL》,這篇文檔是快速瞭解 Kerberos 的一篇非常棒的指南教程,原文地址爲 http://www.kerberos.org/software/tutorial.html ,也可以直接訪問原文地址進行查看,也可以查看我對這份文檔的譯文 「 A guided tour of Kerberos: Tutorial 」

重點理解其中的這張圖,下面的安裝也將按照這個來進行安裝和配置。
Kerberos 請求過程圖


2 安裝

系統環境爲 CentOS 7 64位, CPU 爲Intel,支持的指令集爲 x86_64。

[root@cdh1 ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[root@cdh1 ~]# lscpu | grep -i Architecture
Architecture:          x86_64
[root@cdh1 ~]#

2.1 下載

如果可以連接網絡,也可以直接通過 yum 方式安裝:yum install krb5-server krb5-libs krb5-auth-dialog krb5-workstation,或者通過配置內網可以訪問的yum源。下面以rpm安裝方式爲例。

# 1 卸載舊版本 Kerberos
# 因爲可能系統會帶有這個包,建議如果有直接卸載,否則可能後期安裝會因爲版本問題而報錯
rpm -qa | grep -E "krb5|libkadm5"
rpm -e --nodeps xxx

## 2 下載二進制制包形式(以 CentOS 7 x86 64 位 爲例)
## 訪問: https://pkgs.org/download/krb5-libs
## 下載 krb5-libs-*.rpm
wget http://mirror.centos.org/centos/7/updates/x86_64/Packages/krb5-libs-1.15.1-37.el7_7.2.x86_64.rpm
## 下載 krb5-workstation-*.rpm
wget http://mirror.centos.org/centos/7/updates/x86_64/Packages/libkadm5-1.15.1-37.el7_7.2.x86_64.rpm
wget http://mirror.centos.org/centos/7/updates/x86_64/Packages/krb5-workstation-1.15.1-37.el7_7.2.x86_64.rpm
## 下載 krb5-server-*.rpm
wget http://mirror.centos.org/centos/7/updates/x86_64/Packages/krb5-server-1.15.1-37.el7_7.2.x86_64.rpm

## 3 下載完畢後,查看如下:
[root@cdh1 software]# ll
total 2856
-rw-r--r-- 1 root root  824024 Sep 14  2019 krb5-libs-1.15.1-37.el7_7.2.x86_64.rpm
-rw-r--r-- 1 root root 1070820 Sep 14  2019 krb5-server-1.15.1-37.el7_7.2.x86_64.rpm
-rw-r--r-- 1 root root  836076 Sep 14  2019 krb5-workstation-1.15.1-37.el7_7.2.x86_64.rpm
-rw-r--r-- 1 root root  182108 Sep 14  2019 libkadm5-1.15.1-37.el7_7.2.x86_64.rpm

2.2 KDC 節點的安裝

2.2.1 安裝

# 安裝前面下載的rpm 包 
# (KDC 安裝krb5-libs、krb5-server、krb5-workstation,其他節點安裝 krb5-libs、krb5-workstation)
# KDC 需要安裝 krb5-lib-1.xx.x, krb5-workstation-1.xx.x, krb5-server-1.xx.x
# KDC 從節點上只需要安裝 krb5-lib-1.xx.x, krb5-workstation-1.xx.x
# 如果安裝的時候有依賴上的檢查衝突,可以加上參數 --nodeps --force
# 
# 如果報 libkadm5,可以嘗試重新安裝或升級 libkadm5
#  否則會有如下的錯誤
#   error: Failed dependencies:
#           krb5-libs(x86-64) = 1.15.1-37.el7_7.2 is needed by krb5-workstation-1.15.1-37.el7_7.2.x86_64
#           libkadm5(x86-64) = 1.15.1-37.el7_7.2 is needed by krb5-workstation-1.15.1-37.el7_7.2.x86_64
rpm -ivh libkadm5-1.15.1-37.el7_7.2.x86_64.rpm
rpm -ivh krb5-libs-1.15.1-37.el7_7.2.x86_64.rpm
rpm -ivh krb5-workstation-1.15.1-37.el7_7.2.x86_64.rpm
rpm -ivh krb5-server-1.15.1-37.el7_7.2.x86_64.rpm

錯誤1:在安裝時如果報如下的錯誤,需要下載安裝 words 插件,因爲有些應用或數據庫會使用這個來檢查單詞的拼寫,或者密碼檢查器會使用這個來查找有誤的密碼。

error: Failed dependencies:
        /usr/share/dict/words is needed by krb5-server-1.15.1-37.el7_7.2.x86_64

解決:如果可以使用yum,直接安裝即可 yum install words。這裏給出離線安裝方式:

# 1 查看是否有 words
rpm -qa | grep words

# 2 下載 words 包 
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/words-3.0-22.el7.noarch.rpm

# 3 安裝。安裝成功後會在 /usr/share/dict/words 有一個詞文件。
rpm -ivh words-3.0-22.el7.noarch.rpm

安裝的過程如下:
KDC 節點安裝圖

2.2.2 配置 /var/kerberos/krb5kdc/kdc.conf

執行完上一步的安裝之後,在 /var/kerberos 下會有生成配置文件,下面我們需要修改 /var/kerberos/krb5kdc/kdc.conf。只在 KDC 機器上修改,配置如下,這裏對其中某些參數說明如下:CDH.COM:設定 realm ,可以隨意設置,但一般和公司域名相關,大小寫敏感且一般是大寫,這裏以 CDH.COM 爲例。同時需要注意對加密方式的設置,如果需要使用 aes256-cts 加密方式,請確保環境JDK支持這種加密,如果沒有解決方式可以看註釋。

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 CDH.COM = {
   # JDK 8 (至少在 jdk 1.8 _152 之前的)可能不支持,如果使用中發現異常:java.security.InvalidKeyException: Illegal key size,
   # 方法1,可以將 aes256-cts 去點,保留 aes128-cts
   # 方法2,或者下載官方提供的 jce_policy-8.zip 包,解壓後將 local_policy.jar 和 US_export_policy.jar 覆蓋JDK安裝目錄下的 jre\lib\security 下的兩個文件
   #       每個版本的路徑可能稍微有差別,只要找到 unlimited 下的
   #       下載地址 http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
   #master_key_type = aes256-cts
   acl_file = /var/kerberos/krb5kdc/kadm5.acl
   dict_file = /usr/share/dict/words
   admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
   max_renewable_life = 7d 0h 0m 0s
   supported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }

2.2.3 配置 /var/kerberos/krb5kdc/kadm5.acl

Realme 改爲上面配置的名字CDH.COM。這樣名稱匹配 */[email protected] 的都會認爲 admin,權限是 *,代表全部權限。

 */[email protected] *

2.2.4 配置 /etc/krb5.conf

其中 cdh2.yore.com 爲 KDC 服務的主機名。


# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = CDH.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 #rdns = false
 #pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt
# default_realm = EXAMPLE.COM
 #default_ccache_name = KEYRING:persistent:%{uid}

[realms]
 CDH.COM = {
  kdc = cdh2.yore.com
  admin_server = cdh2.yore.com
 }

[domain_realm]
.cdh2.yore.com = CDH.COM
cdh2.yore.com = CDH.COM

2.2.5 創建 Kerberos 數據庫

# 1 創建/初始化 Kerberos database
# 當遇到問題,可能需要執行: /usr/sbin/kdb5_util -r CDH.COM -m destory -f。 
#            刪除  /var/kerberos/krb5kdc/principal*
# 
# 期間會要求輸入密碼。kdc123
/usr/sbin/kdb5_util create -s -r CDH.COM

# 2 查看生成的文件
# 前兩個是我們前兩步設置的,後面的 principal* 就是本次生成的
[root@cdh1 software]# ll /var/kerberos/krb5kdc/
total 24
-rw-r--r-- 1 root root   19 Mar 25 21:41 kadm5.acl
-rw-r--r-- 1 root root  488 Mar 25 21:42 kdc.conf
-rw------- 1 root root 8192 Mar 25 21:40 principal
-rw------- 1 root root 8192 Mar 25 21:40 principal.kadm5
-rw------- 1 root root    0 Mar 25 21:40 principal.kadm5.lock
-rw------- 1 root root    0 Mar 25 21:40 principal.ok

2.2.6 創建 Kerberos 管理員賬號

# 這裏會提示時輸入管理員的密碼,再次確認,未報錯則創建成功。
[root@cdh1 software]# /usr/sbin/kadmin.local -q "addprinc admin/[email protected]"
Authenticating as principal root/[email protected] with password.
WARNING: no policy specified for admin/[email protected]; defaulting to no policy
Enter password for principal "admin/[email protected]":
Re-enter password for principal "admin/[email protected]":
Principal "admin/[email protected]" created.

2.2.7 將 Kerberos 添加到自啓動服務,並啓動krb5kdc和kadmin服務

systemctl enable krb5kdc
systemctl enable kadmin

systemctl start krb5kdc
systemctl start kadmin

2.2.8 測試

# 1 提示輸入密碼時,輸入 admin 的密碼(Kerberos 管理員賬號的密碼)
[root@cdh1 software]# kinit admin/[email protected]
Password for admin/[email protected]:

# 2 查看所有的 Principal
/usr/sbin/kadmin.local -q "listprincs"

# klist
[root@cdh1 software]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin/[email protected]
Valid starting       Expires              Service principal
03/25/2020 22:05:36  03/26/2020 22:05:36  krbtgt/[email protected]

2.3 應用服務節點的安裝

# 1 通 KDC 節點安裝類似,這裏只需要安裝如下兩個服務(所有客戶端的節點都需要安裝)
# 或者直接 yum 安裝:yum -y install krb5-libs krb5-workstation
rpm -ivh krb5-libs-1.15.1-37.el7_7.2.x86_64.rpm
rpm -ivh libkadm5-1.15.1-37.el7_7.2.x86_64.rpm
rpm -ivh krb5-workstation-1.15.1-37.el7_7.2.x86_64.rpm

# 2 如果是 CDH ,還需要在 Cloudera Manager Server服務器上安裝額外的包
#  OpenLDAP 是 LDAP 的開源套件應用程序開發工具, LDAP是一組用於通過Internet訪問目錄服務的協議,
#  類似於DNS信息在Internet上傳播的方式。openldap-clients軟件包包含訪問和修改OpenLDAP目錄所需的客戶端程序。
#
#  也可以直接通過 yum 方式安裝:yum -y install openldap-clients
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/openldap-clients-2.4.44-21.el7_6.x86_64.rpm
# 後面我會專門發一篇文章來介紹 LDAP 的安裝和使用
rpm -ivh openldap-clients-2.4.44-21.el7_6.x86_64.rpm

# 3 將 KDC 服務節點的 /etc/krb5.conf 拷貝到所有Kerberos客戶端
scp /etc/krb5.conf root@cdh2:/etc/
scp /etc/krb5.conf root@cdh3:/etc/

2.4 客戶端節點上的使用和配置

進行這一部分配置可以先跳到 3 與CDH 集成 。如果外部某個節點需要訪問 Kerberos 應用服務端節點上的某個服務(例如Hive),這裏就需要對客戶端節點進行一些配置。下面以 Beeline 連接 Hive 爲例(Beeline的詳細介紹請查看第六部分的內容)。

首先需要客戶端獲取認證的票據,這就需要我們按照應用服務端安裝的步驟安裝並配置好 Kerberos 的環境,環境配置完畢後,需要通過 kinit 獲取 KDC 處認證授權(TGS)的票據,這個票據就緩存在客戶端節點,帶有一個生命週期,在生命週期內可以訪問正常請求Kerberos的應用服務節點。

# kinit 獲取一個7天有效期的認證:
# 根據第三部分的命令,創建一個 hive/[email protected] 的主體名
kinit -l 7d -kt /etc/hive/conf/hive.keytab  hive/[email protected]

kinit 指定 lifetime

因爲我們使用的工具是 Beeline,Beeline 爲 Hive 的新 CLI,因此這裏需要對 Hive 的配置文件進行配置修改 /etc/hive/conf.cloudera.hive/core-site.xml 文件中添加或修改配置如下(說明可以查看官方文檔Hadoop in Secure Mode),而 /etc/hive/conf/core-site.xml配置文件不用修改(值默認爲 simple )。

<property>
  <name>hadoop.security.authentication</name>
  <!--<value>simple</value>-->
  <value>kerberos</value>
</property>

添加或修改/etc/hive/conf.cloudera.hive/hive-site.xml配置文件:

<property>
  <name>hive.metastore.kerberos.keytab.file</name>
  <value>/etc/hive/conf/hive.keytab</value>
</property>
<property>
  <name>hive.server2.authentication.kerberos.keytab</name>
  <value>/etc/hive/conf/hive.keytab</value>
</property>

<property>
  <name>hive.metastore.kerberos.principal</name>
  <value>hive/[email protected]</value>
</property>
<property>
  <name>hive.server2.authentication.kerberos.principal</name>
  <value>hive/[email protected]</value>
</property>

<property>
  <name>hive.metastore.sasl.enabled</name>
  <value>true</value>
</property>
<property>
  <name>hive.server2.authentication</name>
  <value>kerberos</value>
</property>


3 與CDH 集成

以CDH 爲例,如果CDH 已安裝了 Sentry,先停止 Sentry,等安裝完 Kerberos 之後再把這個服務開啓。

# 1 在KDC中給Cloudera Manager添加管理員賬號。
#  依然會要求我們設置新創建的賬號的密碼
[root@cdh1 software]# /usr/sbin/kadmin.local -q "addprinc cloudera-scm/[email protected]"
Authenticating as principal admin/[email protected] with password.
WARNING: no policy specified for cloudera-scm/[email protected]; defaulting to no policy
Enter password for principal "cloudera-scm/[email protected]":
Re-enter password for principal "cloudera-scm/[email protected]":
Principal "cloudera-scm/[email protected]" created.

# 2 進入Cloudera Manager的“管理”->“安全”界面
# ①選擇“啓用Kerberos”
# ②確保列出的所有檢查項都已完成,然後全部點擊勾選
# ③點擊“繼續”,配置相關的KDC信息,包括類型、KDC服務器、KDC Realm、加密類型以及待創建的Service Principal(hdfs,yarn,,hbase,hive等)的更新生命期等
# ④不建議讓Cloudera Manager來管理krb5.conf(不勾選), 點擊“繼續”
# ⑤輸入Cloudera Manager的 Kerbers 管理員賬號,一定得和之前創建的賬號一致,點擊“繼續”
# ⑥點擊“繼續”啓用Kerberos
# ⑦Kerberos啓用完成,點擊“繼續”
# ⑧勾選重啓集羣,點擊“繼續”
# ⑨集羣重啓完成,點擊“繼續”
# ⑩點擊“繼續”
# ⑪點擊“完成”,至此已成功啓用Kerberos。
# ⑫回到主頁,一切正常,再次查看“管理”->“安全”,界面顯示“已成功啓用 Kerberos。”


# 3 以 hiveuser01 來操作 Hive
## 3.1 創建 hiveuser01 的 principal。(hiveuser01)
/usr/sbin/kadmin.local -q "addprinc [email protected]"

## 3.2 使用 hiveuser01 登陸 Kerberos
kdestroy
kinit hiveuser01
klist

## 3.3 爲 hiveuser01 生成一個 keytab 文件
##  [email protected] 必須爲已存在的 Principal
##  也可以使用 kadmin 來生成。
/usr/sbin/kadmin.local -q "xst -k ./hive_user.keytab [email protected]"

## 3.4 通過 keytab 文件認證用戶
kinit -kt ./hive_user.keytab [email protected]

## 3.5 更新 ticket
##  如果無法更新,是因爲 [email protected] 的 renewlife 被設置成了0
##  可以通過這個命令查看(kadmin.local下執行): getprinc [email protected]
##  modprinc -maxrenewlife "1 week" +allow_renewable [email protected]
kinit -R

4 Beeline 執行Hive sql 腳本

Beeline 的詳細使用可以查看我的另一篇blog 《Beeline 的進階使用》。例如本地環境配置完畢之後,可以遠程提交 SQL,執行 sql 腳本文件

# 1 執行單個腳本
# 參數說明:
#  -n	username,連接 Hive 的用戶名(如果未開啓權限認證可以不寫)
#  -p   password, 連接 Hive 的用戶的密碼(如果未開啓權限認證可以不寫)
#  -d   driver class, 連接 Hive 的 驅動類(無特殊情況下,可以選填)
#  -u   database url, 必填,連接 Hive 的 URL
#  --hiveconf  格式爲 property=value , 設置 Hive 屬性值
#  --hivevar  格式爲 name=value,配置會話級別的變量名和值,例如 --hivevar hive.security.authorization.enabled=false
#  -e   query, 執行的 查詢語句
#  --help  查看幫助
#  -f   執行的腳本文件
beeline -n hive -p hive -d "org.apache.hive.jdbc.HiveDriver" -u "jdbc:hive2://cdh3:10000/default;principal=hive/[email protected]" \
--hiveconf mapreduce.job.queuename=datacenter \
-f ./my-hive.sql


# 2 批量執行多個腳本
# 我們通過前面可以看到,不管是 sql 語句的執行,還是 sql 腳本的執行,都是在前臺執行,
# 如果有多個 beeline 命令要執行,則需要前面先執行後面的等待執行,這樣很不適合於腳本的自動化和批量處理。
# 
# 此時我們可以通過 ,在 CentOS 環境下我們可以使用 nohup 命令從終端斷開進行後臺處理。
# 如下所示執行了兩個後臺命令,這樣會在後臺啓動一個進程執行腳本或 SQL ,並將執行的結果和日誌重定向輸出到指定文件中。
# 
# 如下面所示,直接提交兩個 sql 腳本,並將執行的日誌重定向到日誌文件中。這樣就可以同時提交多個腳本文件。
nohup beeline -n hive -p hive -d "org.apache.hive.jdbc.HiveDriver" -u "jdbc:hive2://cdh3:10000/default;principal=hive/[email protected]" \
--hiveconf mapreduce.job.queuename=datacenter --silent=true --showHeader=true --outputformat=csv2 \
-f ./my-hive00.sql  \
</dev/null >> /tmp/output.log 2>> /tmp/error.log &

nohup beeline -n hive -p hive -d "org.apache.hive.jdbc.HiveDriver" -u "jdbc:hive2://cdh3:10000/default;principal=hive/[email protected]" \
--hiveconf mapreduce.job.queuename=datacenter --silent=true --showHeader=true --outputformat=dsv \
-f ./my-hive01.sql \
</dev/null >> /tmp/output.log 2>> /tmp/error.log &

5 DataX 離線同步數據到Kerberos認證的 HDFS

DataX 是一個解壓即可使用的工具,更詳細的介紹可以查看我的另一篇blog 《DataX離線數據同步》。這裏介紹如何使用 DataX 離線遠程將數據同步到帶有 Kerberos 認證的HDFS 上。

在 CDH 環境默認 HDFS 的 NameNode 的端口 8020。數據遷移部分實質就是將不同數據源的數據寫入到 HDFS 上, 例如 hdfs://${fs.defaultFS}:8020/${yourPath},因此需要申請能夠訪問 8020 端口的權限,主要用來寫入數據。如果DataNode開啓了 SASL,則還需要開啓1004端口(dfs.datanode.address配置項可以獲知)。

假如現在數據源爲 ODPS ,需要定時將數據寫入 HDFS ,但是 HDFS 是在另外一個集羣且網絡是隔離的,此時 ODPS 相對於 HDFS 就類似與域外的訪問。在 ODPS 所處的環境下有一個調度系統,調度系統的某個 Worker 申請了權限可以成功對接訪問 HDFS,HDFS 集羣開啓了SASL和 Kerberos訪問認證。

對於這種情況 DataX 也可以成功實現數據的傳輸離線同步,需要配置上 Kerberos 的參數,這裏重點是對於這種域外訪問,直接寫入數據時,數據會寫入到遠程的 DataNode 節點,但是這個節點的 ip 是一個集羣內網的ip,這樣在連接訪問DataNode 時就會超時異常,如下圖,寫入數據時會報6000 mills timeout while waiting for channel to be ready for connect. ch:java.nio.channels.SocketChannel[connection-pending remote=xxx.xxx.xxx.xxx:1004] 而remote連接的那個ip正式 Hadoop 內網集羣的ip,對於這種需要指定如下的參數(在hdfs-site.xml),如果是程序中,可以通過這種方式設定 Configuration conf=new Configuration(); conf.set("dfs.client.use.datanode.hostname", "true");。
DataX 報錯

<property>
    <name>dfs.client.use.datanode.hostname</name>
    <value>true</value>
    <description>only cofig in clients</description>
</property>

對於DataX 只需要在 hadoopConfig 中添加Hadoop的相關的配置參數 "dfs.client.use.datanode.hostname": true,完整的配置如下:

{
  "job": {
    "setting": {
      "speed": {
        "channel": 1
      }
    },
    "content": [
      {
        "reader": {
          "name": "odpsreader",
          "parameter": {
            "accessId": "3o************DZ",
            "accessKey": "Myk************************Tly",
            "odpsServer": "http://xx.x.xxx.xxx/api",
            "tunnelServer": "http://xx.x.xxx.xxx",
            "project": "targetProjectName",
            "table": "tableName",
            "column": [
              "customer_id",
              "nickname"
            ]
          }
        },
        "writer": {
          "name": "hdfswriter",
          "parameter": {
            "defaultFS": "hdfs://xx.x.xxx.xxx:8020",
            "path": "/user/hive/warehouse/xxx.db/xxx_tb",
            "fileType": "orc",
            "compress": "NONE",
            "fieldDelimiter": "|",
            "fileName": "xxx",
            "column": [
              {
                "name": "col1",
                "type": "BIGINT"
              },
              {
                "name": "col2",
                "type": "STRING"
              },
              {
                "name": "col3",
                "type": "TIMESTAMP"
              },
              {
                "name": "col4",
                "type": "date"
              }
            ],
            "haveKerberos": true,
            "kerberosKeytabFilePath": "/xxx/xxxx/xxx.keytab",
            "kerberosPrincipal": "hive/[email protected]",
            "hadoopConfig": {
              "dfs.http.policy": "HTTPS_ONLY",
              "dfs.data.transfer.protection": "integrity",
              "dfs.client.use.datanode.hostname": true,
              "dfs.datanode.address": "x.x.x.x:1004"
            },
            "writeMode": "append"
          }
        }
      }
    ]
  }
}

注意

  • 在上面的json 中的hdfswriter,如果 fileTypetext,則compress 支持的格式有gzipbzip2或者不配置。
  • fileTypetext時只能使用單字符,雖然使用一些特殊字符(例如:),雖然 DataX 並不會報錯,並且在Hive創建表時也不會報錯,但是Hive是無法識別這個字段分割符的,查詢的總記錄數是沒問題的,但是字段的值都爲 NULL。
  • fileTypeorc時,需要配置上compress ,值可以爲NONESNAPPY,在這裏我們可以使用一些特殊字符作爲字段分隔符(例如:),這時創建表的時候加上ROW FORMAT DELIMITED FIELDS TERMINATED BY '║' STORED AS ORC,我們就可以正常的查詢數據。這個也是比較推薦的一種配置方式,可以很有效的避免分隔符導致的字段值不是逾期的異常問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章