技.艺.道:phoenix数据的导入与导出

前言

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->HDFS

如果业务数据是放在phoenix中的,那么数据备份或者冷藏,一定是绕不开的。这时候就会需要将phoenix数据导出到HDFS,导出到HDFS了后面你不就可以随心所欲了。

1.前置条件:

    1)hadoop-hdfs可以正常使用。

    2)hadoop-yarn可以正常使用。

    3)MapReduce程序可以正常跑。

    4)sqoop程序配置完成。

    5)Hbase可以正常使用。

    6)phoenix可以正常使用。

2.指令格式:

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,在节点较多或者是配置较高的集群环境下,该值增大有利于任务的执行效率,唯一的缺点就是生成的文件可能也会比较多。

3.指令实例:

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

4.完成

运行之后可以在yarn的web界面(resourceManager所在机器的ip:8088)查看任务进度。

完成之后,可以在hdfs中看到导出的文件。

 

5.补充

1)yarn-site.xml配置

如果平时主要用HDFS的环境,注意根据自己实际的机器资源情况配置yarn-site.xml文件的这些资源管理参数,否则容易导致MR程序跑不起来。是增加这些配置,不是只配置这些!

<property>

<name>yarn.scheduler.minimum-allocation-mb</name>

<value>2048</value>

<discription>单个任务可申请最少内存,默认1024MB</discription>

</property>

<property>

<name>yarn.nodemanager.resource.memory-mb</name>

<value>2048</value>

<discription>nodemanager默认内存大小,默认为8192MB(value单位为MB)</discription>

</property>

<property>

<name>yarn.nodemanager.resource.cpu-vcores</name>

<value>2</value>

<discription>nodemanager cpu内核数</discription>

</property>

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自己在网上下,版本不要太旧就好

 

二、导入:HDFS->phoenix

1.前言

当冷数据有一天需要拿出来使用了,或者是数据迁移到目的地之后,需要从文件导入phoenix中。

2.前置条件

    1)hadoop-hdfs可以正常使用。

    2)hadoop-yarn可以正常使用。

    3)MapReduce程序可以正常跑。

    4)Hbase可以正常使用。

    5)phoenix可以正常使用。

3.指令格式

HADOOP_CLASSPATH={hbase-protocol-*.jar的完整路径}:{hbase的conf目录的完整路径}\

hadoop jar {phoenix-*-HBase-*-client.jar的完整路径} \

org.apache.phoenix.mapreduce.CsvBulkLoadTool --table "{数据要导入的目的表的全名,即namespace.tablename}" \

--input {数据文件在HDFS中的完整路径}

4.指令实例

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

5.完成

执行之后,可以在命令行看到进度:

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%

…

待完成之后,查看目标表的数据量,确认导入成功。

测试建议:

1.测试hadoop-MapReduce是否可以正常运行

跑一个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

2.整体测试

根据自己的集群规模,选择一张不大不小的表,如表A。

    1).统计表A的数据行数
    2).导出测试
    3).删除表A的所有数据
    4).导入测试
    5).统计表A的数据行数

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章