Apache Phoenix(十六)新特性之塊加載

phoenix提供了兩種方法往phoenix表中加載數(shù)據(jù):

  • 通過(guò)psql命令CSV格式數(shù)據(jù)單線程加載工具
  • 基于MapReduce的CSV或者JSON格式的數(shù)據(jù)加載工具
    psql工具通常適合幾十兆字節(jié)的大小,而基于mapreduce的加載程序通常更適合較大的負(fù)載容量。
    兩者的加載詳見下文。

樣本數(shù)據(jù)

對(duì)于下面的示例,我們假設(shè)有一個(gè)名為“data”的CSV文件。csv ",內(nèi)容如下:

12345,John,Doe
67890,Mary,Poppins

我們將會(huì)用如下的表結(jié)構(gòu):

CREATE TABLE example (
    my_pk bigint not null,
    m.first_name varchar(50),
    m.last_name varchar(50) 
    CONSTRAINT pk PRIMARY KEY (my_pk))

通過(guò)PSQL加載

psql命令是通過(guò)Phoenix bin目錄中的psql.py調(diào)用的。為了使用它來(lái)加載CSV數(shù)據(jù),可以通過(guò)提供HBase集群的連接信息、加載數(shù)據(jù)的表的名稱和CSV文件的路徑來(lái)調(diào)用它。請(qǐng)注意,所有要加載的CSV文件都必須有'。csv '文件擴(kuò)展名(這是因?yàn)閹в?的任意SQL腳本。也可以在PSQL命令行上提供sql的文件擴(kuò)展名)。
要將上面列出的示例數(shù)據(jù)加載到本地機(jī)器上運(yùn)行的HBase中,請(qǐng)運(yùn)行以下命令:

bin/psql.py -t EXAMPLE localhost data.csv

以下參數(shù)可以用來(lái)加載數(shù)據(jù)與PSQL:

參數(shù) 描述
-t 提供要在其中加載數(shù)據(jù)的表的名稱。默認(rèn)情況下,表的名稱取自CSV文件的名稱。此參數(shù)區(qū)分大小寫
-h 覆蓋CSV數(shù)據(jù)映射到的列名,并且區(qū)分大小寫。一個(gè)特殊的內(nèi)聯(lián)值,指示CSV文件的第一行確定數(shù)據(jù)映射到的列。
-s 在嚴(yán)格模式下運(yùn)行,在CSV解析錯(cuò)誤上拋出一個(gè)錯(cuò)誤
-d 為CSV解析提供一個(gè)或多個(gè)自定義分隔符
-q 提供自定義短語(yǔ)分隔符,默認(rèn)值為雙引號(hào)字符
-e 提供自定義短語(yǔ)分隔符,默認(rèn)為雙引號(hào)字符
-a 提供一個(gè)數(shù)組分隔符(在下面有更詳細(xì)的解釋)

psql導(dǎo)入注意事項(xiàng)

導(dǎo)入時(shí)報(bào):Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.isNamespaceMappingEnabled enabled
需要檢查phoenix和hbase的hbase-site.xml是否配置了如下兩個(gè)屬性:

<property>
      <name>phoenix.schema.isNamespaceMappingEnabled</name>
      <value>true</value>
</property>
<property>
      <name>phoenix.schema.mapSystemTablesToNamespace</name>
      <value>true</value>
</property>

如果配置了這兩個(gè)屬性,打開psql.py查看對(duì)應(yīng)查找的系統(tǒng)變量是哪個(gè):


查找hbase配置文件系統(tǒng)變量

在/etc/profile中添加export HBASE_CONF_DIR=/usr/local/hbase/conf/,然后source /etc/profile,重新執(zhí)行導(dǎo)入命令。

通過(guò)MapReduce加載

對(duì)于分布在集群上的高吞吐量加載,可以使用MapReduce加載器。這個(gè)加載程序首先將所有數(shù)據(jù)轉(zhuǎn)換成HFiles,然后在HFile創(chuàng)建完成后將創(chuàng)建的HFiles提供給HBase。
使用hadoop命令和Phoenix client jar啟動(dòng)CSV MapReduce加載器,如下所示:

hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool --table EXAMPLE --input /data/example.csv

在使用Phoenix 4.0及以上版本時(shí),存在一個(gè)已知的HBase問(wèn)題(“HBase 0.96.1及以上版本的Mapreduce用戶請(qǐng)注意”https://hbase.apache.org/book.html),你應(yīng)該使用以下命令:

HADOOP_CLASSPATH=$(hbase mapredcp):/path/to/hbase/conf hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool --table EXAMPLE --input /data/example.csv

或者

HADOOP_CLASSPATH=/path/to/hbase-protocol.jar:/path/to/hbase/conf hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool --table EXAMPLE --input /data/example.csv

JSON MapReduce加載器使用hadoop命令與Phoenix client jar一起啟動(dòng),如下所示:

hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.JsonBulkLoadTool --table EXAMPLE --input /data/example.json

輸入文件必須出現(xiàn)在HDFS上(而不是運(yùn)行命令的本地文件系統(tǒng))。
以下參數(shù)可以與MapReduce加載程序一起使用。

參數(shù) 描述
-i,–input 輸入CSV路徑(必選)
-t,–table Phoenix表名(必填)
-a,–array-delimiter 數(shù)組元素分隔符(可選)
-c,–import-columns 要導(dǎo)入的列的逗號(hào)分隔列表
-d,–delimiter 輸入分隔符,默認(rèn)為逗號(hào)
-g,–ignore-errors 忽略輸入錯(cuò)誤
-o,–output 臨時(shí)HFiles的輸出路徑(可選)
-s,–schema Phoenix模式名(可選)
-z,–zookeeper 通過(guò)zk連接(可選)
-it,–index-table 要加載的索引表名(可選)

mapreduce導(dǎo)入說(shuō)明

當(dāng)前基于MR的bulk loader將運(yùn)行一個(gè)MR作業(yè)來(lái)加載數(shù)據(jù)表,每個(gè)索引表運(yùn)行一個(gè)MR來(lái)填充索引。使用-it選項(xiàng)只加載一個(gè)索引表。

上傳文件時(shí)的權(quán)限問(wèn)題

在批量加載的最后階段,當(dāng)創(chuàng)建的HFiles被移交給HBase時(shí),由于對(duì)創(chuàng)建的HFiles的文件權(quán)限可能會(huì)出現(xiàn)問(wèn)題。HBase需要能夠移動(dòng)所創(chuàng)建的HFiles,這意味著它需要對(duì)已寫入文件的目錄具有寫訪問(wèn)權(quán)。如果不是這樣,hfile的上傳將會(huì)掛起很長(zhǎng)一段時(shí)間才會(huì)失敗。
對(duì)于這個(gè)問(wèn)題有兩種主要的解決方案:作為hbase用戶運(yùn)行批量加載進(jìn)程,或者創(chuàng)建所有用戶都可讀的輸出文件。
第一種方法是使用sudo -u hbase簡(jiǎn)單地啟動(dòng)hadoop命令,即

sudo -u hbase hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool --table EXAMPLE --input /data/example.csv

可以通過(guò)設(shè)置fs.permissions來(lái)創(chuàng)建所有人都可讀的輸出文件。umask模式配置設(shè)置為“000”。這可以在用于提交作業(yè)的機(jī)器上的hadoop配置中設(shè)置,也可以僅在提交作業(yè)時(shí)在命令行上設(shè)置,如下所示:

hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool -Dfs.permissions.umask-mode=000 --table EXAMPLE --input /data/example.csv
加載數(shù)組數(shù)據(jù)

PSQL加載程序和MapReduce加載程序都支持使用-a標(biāo)志加載數(shù)組值。CSV文件中的數(shù)組由使用與主CSV分隔符不同的分隔符的字段表示。例如,下面的文件表示一個(gè)id字段和一個(gè)整數(shù)數(shù)組:

1,2:3:4
2,3:4,5

要加載這個(gè)文件,將使用默認(rèn)的分隔符(逗號(hào)),數(shù)組分隔符(冒號(hào))將提供參數(shù)-a ':'。

關(guān)于分隔符說(shuō)明

兩個(gè)加載器的默認(rèn)分隔符都是逗號(hào)(,)。輸入文件的常用分隔符是制表符,在命令行中提供制表符可能比較麻煩。一個(gè)常見的錯(cuò)誤是試圖通過(guò)輸入以下內(nèi)容來(lái)提供一個(gè)選項(xiàng)卡作為分隔符

-d '\t'

這將不起作用,因?yàn)閟hell將這個(gè)值作為兩個(gè)字符(一個(gè)反斜杠和一個(gè)“t”)提供給Phoenix。
提供特殊字符(例如命令行上的制表符)的兩種方法如下:

  • 通過(guò)在帶美元符號(hào)的標(biāo)簽的字符串表示之前:-d$'\t'
  • 按Ctrl+v進(jìn)入分隔符,然后按tab鍵:-d '^v<tab>'
關(guān)于小寫表/模式名稱的說(shuō)明

Phoenix中的表名不區(qū)分大小寫(通常是大寫)。但有時(shí)用戶可能需要將現(xiàn)有的小寫HBase表映射到Phoenix表,在這種情況下,雙引號(hào)圍繞表名比如" tablename "可以用來(lái)保持大小寫的敏感性。同樣的擴(kuò)展到bulkload選項(xiàng),但是由于Apache Commons CLI庫(kù)解析命令行選項(xiàng)的方式(參考clic -275),我們需要將參數(shù)作為\“\”tablename\“\”傳遞,而不是僅僅作為CsvBulkLoadTool的“tablename”傳遞。
例子:

hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool --table \"\"t\"\" --input /data/example.csv
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容