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è):

在/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