phoenix提供了两种方法往phoenix表中加载数据:
- 通过psql命令CSV格式数据单线程加载工具
- 基于MapReduce的CSV或者JSON格式的数据加载工具
psql工具通常适合几十兆字节的大小,而基于mapreduce的加载程序通常更适合较大的负载容量。
两者的加载详见下文。
样本数据
对于下面的示例,我们假设有一个名为“data”的CSV文件。csv ",内容如下:
12345,John,Doe
67890,Mary,Poppins
我们将会用如下的表结构:
CREATE TABLE example (
my_pk bigint not null,
m.first_name varchar(50),
m.last_name varchar(50)
CONSTRAINT pk PRIMARY KEY (my_pk))
通过PSQL加载
psql命令是通过Phoenix bin目录中的psql.py调用的。为了使用它来加载CSV数据,可以通过提供HBase集群的连接信息、加载数据的表的名称和CSV文件的路径来调用它。请注意,所有要加载的CSV文件都必须有'。csv '文件扩展名(这是因为带有'的任意SQL脚本。也可以在PSQL命令行上提供sql的文件扩展名)。
要将上面列出的示例数据加载到本地机器上运行的HBase中,请运行以下命令:
bin/psql.py -t EXAMPLE localhost data.csv
以下参数可以用来加载数据与PSQL:
参数 | 描述 |
---|---|
-t | 提供要在其中加载数据的表的名称。默认情况下,表的名称取自CSV文件的名称。此参数区分大小写 |
-h | 覆盖CSV数据映射到的列名,并且区分大小写。一个特殊的内联值,指示CSV文件的第一行确定数据映射到的列。 |
-s | 在严格模式下运行,在CSV解析错误上抛出一个错误 |
-d | 为CSV解析提供一个或多个自定义分隔符 |
-q | 提供自定义短语分隔符,默认值为双引号字符 |
-e | 提供自定义短语分隔符,默认为双引号字符 |
-a | 提供一个数组分隔符(在下面有更详细的解释) |
psql导入注意事项
导入时报: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是否配置了如下两个属性:
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
<property>
<name>phoenix.schema.mapSystemTablesToNamespace</name>
<value>true</value>
</property>
如果配置了这两个属性,打开psql.py查看对应查找的系统变量是哪个:

在/etc/profile中添加export HBASE_CONF_DIR=/usr/local/hbase/conf/,然后source /etc/profile,重新执行导入命令。
通过MapReduce加载
对于分布在集群上的高吞吐量加载,可以使用MapReduce加载器。这个加载程序首先将所有数据转换成HFiles,然后在HFile创建完成后将创建的HFiles提供给HBase。
使用hadoop命令和Phoenix client jar启动CSV MapReduce加载器,如下所示:
hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool --table EXAMPLE --input /data/example.csv
在使用Phoenix 4.0及以上版本时,存在一个已知的HBase问题(“HBase 0.96.1及以上版本的Mapreduce用户请注意”https://hbase.apache.org/book.html),你应该使用以下命令:
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一起启动,如下所示:
hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.JsonBulkLoadTool --table EXAMPLE --input /data/example.json
输入文件必须出现在HDFS上(而不是运行命令的本地文件系统)。
以下参数可以与MapReduce加载程序一起使用。
参数 | 描述 |
---|---|
-i,–input | 输入CSV路径(必选) |
-t,–table | Phoenix表名(必填) |
-a,–array-delimiter | 数组元素分隔符(可选) |
-c,–import-columns | 要导入的列的逗号分隔列表 |
-d,–delimiter | 输入分隔符,默认为逗号 |
-g,–ignore-errors | 忽略输入错误 |
-o,–output | 临时HFiles的输出路径(可选) |
-s,–schema | Phoenix模式名(可选) |
-z,–zookeeper | 通过zk连接(可选) |
-it,–index-table | 要加载的索引表名(可选) |
mapreduce导入说明
当前基于MR的bulk loader将运行一个MR作业来加载数据表,每个索引表运行一个MR来填充索引。使用-it选项只加载一个索引表。
上传文件时的权限问题
在批量加载的最后阶段,当创建的HFiles被移交给HBase时,由于对创建的HFiles的文件权限可能会出现问题。HBase需要能够移动所创建的HFiles,这意味着它需要对已写入文件的目录具有写访问权。如果不是这样,hfile的上传将会挂起很长一段时间才会失败。
对于这个问题有两种主要的解决方案:作为hbase用户运行批量加载进程,或者创建所有用户都可读的输出文件。
第一种方法是使用sudo -u hbase简单地启动hadoop命令,即
sudo -u hbase hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool --table EXAMPLE --input /data/example.csv
可以通过设置fs.permissions来创建所有人都可读的输出文件。umask模式配置设置为“000”。这可以在用于提交作业的机器上的hadoop配置中设置,也可以仅在提交作业时在命令行上设置,如下所示:
hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool -Dfs.permissions.umask-mode=000 --table EXAMPLE --input /data/example.csv
加载数组数据
PSQL加载程序和MapReduce加载程序都支持使用-a标志加载数组值。CSV文件中的数组由使用与主CSV分隔符不同的分隔符的字段表示。例如,下面的文件表示一个id字段和一个整数数组:
1,2:3:4
2,3:4,5
要加载这个文件,将使用默认的分隔符(逗号),数组分隔符(冒号)将提供参数-a ':'。
关于分隔符说明
两个加载器的默认分隔符都是逗号(,)。输入文件的常用分隔符是制表符,在命令行中提供制表符可能比较麻烦。一个常见的错误是试图通过输入以下内容来提供一个选项卡作为分隔符
-d '\t'
这将不起作用,因为shell将这个值作为两个字符(一个反斜杠和一个“t”)提供给Phoenix。
提供特殊字符(例如命令行上的制表符)的两种方法如下:
- 通过在带美元符号的标签的字符串表示之前:-d$'\t'
- 按Ctrl+v进入分隔符,然后按tab键:-d '^v<tab>'
关于小写表/模式名称的说明
Phoenix中的表名不区分大小写(通常是大写)。但有时用户可能需要将现有的小写HBase表映射到Phoenix表,在这种情况下,双引号围绕表名比如" tablename "可以用来保持大小写的敏感性。同样的扩展到bulkload选项,但是由于Apache Commons CLI库解析命令行选项的方式(参考clic -275),我们需要将参数作为\“\”tablename\“\”传递,而不是仅仅作为CsvBulkLoadTool的“tablename”传递。
例子:
hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool --table \"\"t\"\" --input /data/example.csv
网友评论