我们在之前的文章中,记录了 在phoenix命令行工具中运行命令,使用java连接phoenix,使用图形界面化客户端连接phoenix。
hadoop组件—面向列的开源数据库(七)–phoenix查询hbase–映射和常用命令
hadoop组件—面向列的开源数据库(八)–java使用phoenix查询hbase
hadoop组件—面向列的开源数据库(九)–使用phoenix图形界面客户端查询hbase
这三种方式都可以对hbase的数据进行增删改查。
本章记录 使用phoenix自带的其他工具,进行复杂的脚本运行以及 导入数据。
Phoenix使用自带工具psql执行sql脚本
当我们有比较复杂的sql操作时,可以使用sql脚本运行。这样就不需要一条条命令进行粘贴运行了。
在任一目录创建sql脚本如下:
1
2
3 1vi /data6/user.sql
2
3
输入内容如下:
1
2
3
4
5
6
7
8
9
10
11
12 1-- create table user
2create table if not exists user (id varchar primary key,account varchar ,passwd varchar);
3
4-- insert data
5upsert into user(id, account, passwd) values('001', 'admin', 'admin');
6upsert into user(id, account, passwd) values('002', 'test', 'test');
7upsert into user(id, account, passwd) values('003', 'zzq', 'zzq');
8
9-- query data
10select * from user;
11
12
并且给sql脚本相应的权限,让phoenix的psql工具能访问到,使用命令
1
2
3 1chmod 777 /data6/user.sql
2
3
进入到phoenix的安装目录,比如我的目录是 /usr/local/phoenix-4.14.0/
1
2
3 1cd /usr/local/phoenix-4.14.0/
2
3
执行命令运行脚本
1
2
3 1./bin/psql.py 192.168.30.217:2181 /data6/user.sql
2
3
或者
1
2
3 1./bin/psql.py 192.168.30.217,192.168.30.130:2181 /data6/user.sql
2
3
192.168.30.217,192.168.30.130:2181 对应的是hbase集群的zookeeper集群的ip和端口,多个ip使用逗号隔开。
成功运行 输出如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 1[zzq@host250 phoenix-4.14.0]$ ./bin/psql.py 192.168.30.217:2181 /data6/user.sql
2SLF4J: Class path contains multiple SLF4J bindings.
3SLF4J: Found binding in [jar:file:/usr/local/phoenix-4.14.0/phoenix-4.14.0-cdh5.13.2-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
4SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-5.13.0-1.cdh5.13.0.p0.29/jars/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
5SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
6SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
720/01/09 11:40:17 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
8no rows upserted
9Time: 2.56 sec(s)
10
111 row upserted
12Time: 0.096 sec(s)
13
141 row upserted
15Time: 0.004 sec(s)
16
171 row upserted
18Time: 0.004 sec(s)
19
20ID ACCOUNT PASSWD
21---------------------------------------- ---------------------------------------- ----------------------------------------
22001 admin admin
23002 test test
24003 zzq zzq
25Time: 0.015 sec(s)
26
27[zzq@host250 phoenix-4.14.0]$
28
29
30
Phoenix使用自带工具psql导入数据
在实际应用场景中可以会有一些格式比较规整的数据文件需要导入到HBase,Phoenix提供了两种方法来加载CSV格式的文件phoenix的数据表。
一种是使用单线程的psql工具进行小批量数据加载的方式,另一种是使用MapReduce作业来处理大批量数据的方式。
我们先来了解psql进行小批量的数据加载方式。
官方例子http://phoenix.apache.org/Phoenix-in-15-minutes-or-less.html
分步运行
创建表格
进入phoenix的命令行工具
1
2
3 1[zzq@host250 bin]$ ./sqlline.py host217
2
3
在phoenix的命令行中使用命令:
1
2
3
4
5
6
7 1CREATE TABLE IF NOT EXISTS us_population (
2 state CHAR(2) NOT NULL,
3 city VARCHAR NOT NULL,
4 population BIGINT
5 CONSTRAINT my_pk PRIMARY KEY (state, city));
6
7
创建 us_population.csv文件使用命令:
1
2
3 1vi /data6/us_population.csv
2
3
输入内容如下:
1
2
3
4
5
6
7
8
9
10
11
12 1NY,New York,8143197
2CA,Los Angeles,3844829
3IL,Chicago,2842518
4TX,Houston,2016582
5PA,Philadelphia,1463281
6AZ,Phoenix,1461575
7TX,San Antonio,1256509
8CA,San Diego,1255540
9TX,Dallas,1213825
10CA,San Jose,912332
11
12
给该文件相应的权限
1
2
3 1chmod 777 /data6/us_population.csv
2
3
在服务器的shell命令行中进入phoenix安装目录
1
2
3 1cd /usr/local/phoenix-4.14.0/
2
3
运行导入
1
2
3 1./bin/psql.py 192.168.30.217:2181 /data6/us_population.csv
2
3
导入成功输出如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 1[zzq@host250 phoenix-4.14.0]$ vi /data6/us_population.csv
2[zzq@host250 phoenix-4.14.0]$ chmod 777 /data6/us_population.csv
3[zzq@host250 phoenix-4.14.0]$
4[zzq@host250 phoenix-4.14.0]$
5[zzq@host250 phoenix-4.14.0]$ cd /usr/local/phoenix-4.14.0/
6[zzq@host250 phoenix-4.14.0]$ ./bin/psql.py 192.168.30.217:2181 /data6/us_population.csv
7SLF4J: Class path contains multiple SLF4J bindings.
8SLF4J: Found binding in [jar:file:/usr/local/phoenix-4.14.0/phoenix-4.14.0-cdh5.13.2-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
9SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-5.13.0-1.cdh5.13.0.p0.29/jars/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
10SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
11SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
1220/01/09 12:01:48 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
13csv columns from database.
14CSV Upsert complete. 10 rows upserted
15Time: 0.052 sec(s)
16
17[zzq@host250 phoenix-4.14.0]$
18
19
20
使用命令查询验证数据是否导入成功,使用命令:
1
2
3
4
5
6 1SELECT state as "State",count(city) as "City Count",sum(population) as "Population Sum"
2FROM us_population
3GROUP BY state
4ORDER BY sum(population) DESC;
5
6
输出如图:
多个脚本并列运行
psql工具也支持 多个sql脚本和导入数据csv并列运行.
例如我们创建table的语句放在us_population.sql文件中
使用命令
1
2
3 1vi /data6/us_population.sql
2
3
输入内容
1
2
3
4
5
6
7 1CREATE TABLE IF NOT EXISTS us_population (
2 state CHAR(2) NOT NULL,
3 city VARCHAR NOT NULL,
4 population BIGINT
5 CONSTRAINT my_pk PRIMARY KEY (state, city));
6
7
创建 us_population.csv文件使用命令:
1
2
3 1vi /data6/us_population.csv
2
3
输入内容如下:
1
2
3
4
5
6
7
8
9
10
11
12 1NY,New York,8143197
2CA,Los Angeles,3844829
3IL,Chicago,2842518
4TX,Houston,2016582
5PA,Philadelphia,1463281
6AZ,Phoenix,1461575
7TX,San Antonio,1256509
8CA,San Diego,1255540
9TX,Dallas,1213825
10CA,San Jose,912332
11
12
例如我们查询的语句放在us_population_queries.sql文件中
使用命令
1
2
3 1vi /data6/us_population_queries.sql
2
3
输入内容
1
2
3
4
5
6 1SELECT state as "State",count(city) as "City Count",sum(population) as "Population Sum"
2FROM us_population
3GROUP BY state
4ORDER BY sum(population) DESC;
5
6
给这三个文件相应得访问权限如下:
1
2
3
4
5
6 1chmod 777 /data6/us_population.sql
2chmod 777 /data6/us_population.csv
3chmod 777 /data6/us_population_queries.sql
4
5
6
进入phoenix安装目录:
1
2
3 1cd /usr/local/phoenix-4.14.0/
2
3
运行命令如下:
1
2
3 1./bin/psql.py 192.168.30.217:2181 /data6/us_population.sql /data6/us_population.csv /data6/us_population_queries.sql
2
3
效果同上。
Phoenix使用自带工具mapreduce.CsvBulkLoadTool导入数据
如果需要导入的数据量比较多,使用psql的方式会比较慢,因为psql是单线程的。针对大数据量的导入,phoenix提供了mapreduce的方式进行导入。使用步骤记录如下:
官方步骤示例 http://phoenix.apache.org/bulk_dataload.html
创建表格
进入phoenix的命令行工具
1
2
3 1[zzq@host250 bin]$ ./sqlline.py host217
2
3
在phoenix的命令行中使用命令:
1
2
3
4
5
6
7 1CREATE TABLE IF NOT EXISTS us_population (
2 state CHAR(2) NOT NULL,
3 city VARCHAR NOT NULL,
4 population BIGINT
5 CONSTRAINT my_pk PRIMARY KEY (state, city));
6
7
准备数据
在服务器的shell命令行中创建 us_population.csv文件使用命令:
1
2
3 1vi /data6/us_population.csv
2
3
输入内容如下:
1
2
3
4
5
6
7
8
9
10
11
12 1NY,New York,8143197
2CA,Los Angeles,3844829
3IL,Chicago,2842518
4TX,Houston,2016582
5PA,Philadelphia,1463281
6AZ,Phoenix,1461575
7TX,San Antonio,1256509
8CA,San Diego,1255540
9TX,Dallas,1213825
10CA,San Jose,912332
11
12
注意,使用hadoop的mapreduce方式导入,输入文件需要在 hdfs文件系统中,不能使用服务器本机的路径。
所以 我们需要把 这个文件上传到hdfs的文件系统中。
在服务器的shell命令行中运行命令:
1
2
3 1hadoop fs -put /data6/us_population.csv .
2
3
可是使用命令查看是否上传成功
1
2
3 1hadoop fs -ls
2
3
如图:
更多hdfs相关知识可参考
hadoop基础—-hadoop理论(三)—–hadoop分布式文件系统HDFS详解
hadoop基础—-hadoop实战(二)—–hadoop操作hdfs—hdfs文件系统常用命令
运行导入命令,在phoenix安装目录运行
1
2
3 1cd /usr/local/phoenix-4.14.0
2
3
phoenix4.0以下的版本使用命令行
1
2
3 1hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool --table us_population --input us_population.csv
2
3
phoenix4.0以上的版本使用命令行
1
2
3 1HADOOP_CLASSPATH=/path/to/hbase-protocol.jar:/path/to/hbase/conf hadoop jar phoenix-<version>-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool --table us_population --input us_population.csv
2
3
这里的/path/to/hbase-protocol.jar 以及 /path/to/hbase/conf 需要与自己安装的hadoop环境路径和版本对应。
需要明确一下路径。
如果不清楚在哪个路径在root账户或者sudo可以使用以下命令查找:
1
2
3 1find / -name hbase-protocol
2
3
cdh版本的目录可参考:
hadoop基础—-hadoop实战(十一)—–hadoop管理工具—CDH的目录结构了解
我的路径如下:
1
2
3 1/opt/cloudera/parcels/CDH/lib/hbase/hbase-protocol.jar
2
3
和
1
2
3 1/etc/hbase/conf
2
3
所以使用的命令为:
1
2
3 1HADOOP_CLASSPATH=/opt/cloudera/parcels/CDH/lib/hbase/hbase-protocol.jar:/etc/hbase/conf hadoop jar phoenix-4.14.0-cdh5.13.2-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool --table us_population --input us_population.csv
2
3
该作业会被提交到YARN由ResourceManager进行资源分配
运行成功输出如下:
1
2
3
4
5
6
7
8
9
10 120/01/09 15:19:17 INFO mapreduce.Job: The url to track the job: http://host250:8088/proxy/application_1566301006249_3059/
220/01/09 15:19:17 INFO mapreduce.Job: Running job: job_1566301006249_3059
320/01/09 15:19:28 INFO mapreduce.Job: Job job_1566301006249_3059 running in uber mode : false
420/01/09 15:19:28 INFO mapreduce.Job: map 0% reduce 0%
520/01/09 15:19:36 INFO mapreduce.Job: map 100% reduce 0%
620/01/09 15:19:43 INFO mapreduce.Job: map 100% reduce 100%
720/01/09 15:19:43 INFO mapreduce.Job: Job job_1566301006249_3059 completed successfully
820/01/09 15:19:43 INFO mapreduce.Job: Counters: 50
9
10
在phoenix的命令行中输入查询语句校验导入是否成功:
1
2
3
4
5
6 1SELECT state as "State",count(city) as "City Count",sum(population) as "Population Sum"
2FROM us_population
3GROUP BY state
4ORDER BY sum(population) DESC;
5
6
输出如下: