Apache.Phoenix官方口号是:We put the SQL back in NoSQL.以HBASE作为其数据存储基础。更通俗的说法是:phoenix是HBASE的SQL引擎。为本不支持标准SQL语法的NoSQL数据库服务HBase提供了一个用SQL语言交互的入口,降低了使用门槛,拓宽了HBASE的使用范围。基于phoenix和hbase可以在一定的硬件基础上,获得一个“超级MySQL”数据库服务。传统的MySQL等数据库服务具有完善方便的导入导出命令。可是phoenix呢却不是很直接,毕竟是重型数据库服务,动辄上亿的数据,导入导出底层还得使用MapReduce框架所以操作步骤多一点也是情有可原。退一亿步讲,也比手动写MapReduce继承Mapper和Reducer 实现map和reduce方法,再搞个Driver去配置程序方便的多不是吗?
如果业务数据是放在phoenix中的,那么数据备份或者冷藏,一定是绕不开的。这时候就会需要将phoenix数据导出到HDFS,导出到HDFS了后面你不就可以随心所欲了。
1)hadoop-hdfs可以正常使用。
2)hadoop-yarn可以正常使用。
3)MapReduce程序可以正常跑。
4)sqoop程序配置完成。
5)Hbase可以正常使用。
6)phoenix可以正常使用。
sqoop import \
-D org.apache.sqoop.splitter.allow_text_splitter=true \
-driver org.apache.phoenix.jdbc.PhoenixDriver \
--connect jdbc:phoenix:{hbase对应zookeeper节点的ip或主机名,多个之间用逗号连接}:2181 \
--query "{查询语句,中间要带有\$CONDITIONS}" \
--target-dir "{数据导出的目的文件,即导出的数据打算放到哪个文件夹}" \
--fields-terminated-by ',' \ <----指定字段分隔符
--split-by seq \<-----当“-m ”的值大于1,此处必须设置一个字段,表示按该字段切分map任务对应的数据。
--delete-target-dir \<-----设置了此项之后,当“--target-dir”设置的文件夹已存在,程序会覆盖原文件夹中的内容。
--null-string '\\N' \<-----空字符串以“\\N”的形式写入文件中。
--null-non-string '\\N' \<-----空字符串以“\\N”的形式写入文件中。
-m 1<-----本次任务仅使用一个map,在节点较多或者是配置较高的集群环境下,该值增大有利于任务的执行效率,唯一的缺点就是生成的文件可能也会比较多。
sqoop import \
-D org.apache.sqoop.splitter.allow_text_splitter=true \
-driver org.apache.phoenix.jdbc.PhoenixDriver \
--connect jdbc:phoenix:hadoop02,hadoop03,hadoop04:2181 \
--query "select * from zdp.alarminfo where \$CONDITIONS" \
--target-dir "/sqoop-output/zdp-alarminfo-test-3/" \
--fields-terminated-by ',' \
--split-by seq \
--delete-target-dir \
--null-string '\\N' \
--null-non-string '\\N' \
-m 1
运行之后可以在yarn的web界面(resourceManager所在机器的ip:8088)查看任务进度。
完成之后,可以在hdfs中看到导出的文件。
1)yarn-site.xml配置
如果平时主要用HDFS的环境,注意根据自己实际的机器资源情况配置yarn-site.xml文件的这些资源管理参数,否则容易导致MR程序跑不起来。是增加这些配置,不是只配置这些!
yarn.scheduler.minimum-allocation-mb
2048
单个任务可申请最少内存,默认1024MB
yarn.nodemanager.resource.memory-mb
2048
nodemanager默认内存大小,默认为8192MB(value单位为MB)
yarn.nodemanager.resource.cpu-vcores
2
nodemanager cpu内核数
2)sqoop的配置
配置sqoop-env.sh
格式:
export HADOOP_COMMON_HOME={hadoop目录的完整地址}
export HADOOP_MAPRED_HOME={hadoop目录的完整地址}
export HBASE_HOME={hbase目录的完整地址}
export ZOOCFGDIR={zookeeper目录的完整地址}
实例:
export HADOOP_COMMON_HOME=/home/hadoop/hadoop
export HADOOP_MAPRED_HOME=/home/hadoop/hadoop
export HBASE_HOME=/home/hadoop/hbase
export ZOOCFGDIR=/home/hadoop/zookeeper
复制mysql-connector到sqoop/lib/
sqoop/lib/mysql-connector-java-5.1.32-bin.jar
mysql-connector-java-5.1.32-bin.jar自己在网上下,版本不要太旧就好
当冷数据有一天需要拿出来使用了,或者是数据迁移到目的地之后,需要从文件导入phoenix中。
1)hadoop-hdfs可以正常使用。
2)hadoop-yarn可以正常使用。
3)MapReduce程序可以正常跑。
4)Hbase可以正常使用。
5)phoenix可以正常使用。
HADOOP_CLASSPATH={hbase-protocol-*.jar的完整路径}:{hbase的conf目录的完整路径}\
hadoop jar {phoenix-*-HBase-*-client.jar的完整路径} \
org.apache.phoenix.mapreduce.CsvBulkLoadTool --table "{数据要导入的目的表的全名,即namespace.tablename}" \
--input {数据文件在HDFS中的完整路径}
HADOOP_CLASSPATH=/home/hadoop/hbase/lib/hbase-protocol-1.3.0.jar:/home/hadoop/hbase/conf/ \
hadoop jar /home/phoenix/apache-phoenix-4.8.1-HBase-1.2-bin/phoenix-4.8.1-HBase-1.2-client.jar \
org.apache.phoenix.mapreduce.CsvBulkLoadTool --table "ZDP.LOG_IMSI_RESULT_LONGDATA" \
--input /sqoop-output/zdp-alarminfo-test-LOG_IMSI_RESULT_LONGDATA/part-m-00000
执行之后,可以在命令行看到进度:
19/07/16 14:42:41 INFO mapreduce.Job: Running job: job_1563247996195_0001
19/07/16 14:43:18 INFO mapreduce.Job: Job job_1563247996195_0001 running in uber mode : false
19/07/16 14:43:18 INFO mapreduce.Job: map 0% reduce 0%
19/07/16 14:44:00 INFO mapreduce.Job: map 2% reduce 0%
19/07/16 14:44:03 INFO mapreduce.Job: map 3% reduce 0%
19/07/16 14:44:06 INFO mapreduce.Job: map 4% reduce 0%
19/07/16 14:44:09 INFO mapreduce.Job: map 6% reduce 0%
19/07/16 14:44:12 INFO mapreduce.Job: map 7% reduce 0%
19/07/16 14:44:15 INFO mapreduce.Job: map 8% reduce 0%
…
待完成之后,查看目标表的数据量,确认导入成功。
跑一个wordcount作为测试。
1.1 上传测试数据:
hadoop fs -put {hadoop主目录}/NOTICE.txt /
1.2 运行hadoop的examples程序中的wordcount。
hadoop jar \
{hadoop主目录}/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar \
wordcount /NOTICE.txt /wordscounted.txt
根据自己的集群规模,选择一张不大不小的表,如表A。
1).统计表A的数据行数
2).导出测试
3).删除表A的所有数据
4).导入测试
5).统计表A的数据行数