技.藝.道: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的數據行數

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