前言
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的數據行數