今天在hue上將數據統計了一下,然後需要導出到mysql中給別人進行展示。由於是第一次在這裏導出數據,所以出了一些問題,這裏總結一下解決思路與解決辦法。
一、首先先在mysql中創建導出的表
這裏要確認字段屬性與hive中的一致。
CREATE TABLE `unperceived` (
`humanid` varchar(50) NOT NULL,
`credentialsnum` varchar(50) DEFAULT NULL COMMENT '用戶學號或教職工號',
`facepicurl` varchar(255) DEFAULT NULL COMMENT '人員照片',
`credentialstype` int(10) DEFAULT NULL,
`listlibid` int(10) DEFAULT NULL,
`humanname` varchar(255) DEFAULT NULL COMMENT '姓名',
`duty` varchar(255) DEFAULT NULL COMMENT '用戶類型',
`depart` varchar(255) DEFAULT NULL COMMENT '部門或專業',
`type` int(10) DEFAULT NULL COMMENT '用戶類型(1教職工:2學生)',
`license` varchar(255) DEFAULT NULL COMMENT '車牌信息',
`num` varchar(50) DEFAULT NULL,
`gztime` varchar(50) DEFAULT NULL COMMENT '未感知的日期',
`date_time` varchar(50)
)
二、導出數據表到mysql中
先看看這個表的文件存放路徑:
然後我們通過sqoop來導出數據:
export --connect jdbc:mysql://xdata4:3306/jxcy_dpxs?characterEncoding=utf8 --username root --password P@ssw0rd4321 --table unperceived --fields-terminated-by "\001" --input-null-string "\\N" --input-null-non-string "\\N" --export-dir /user/hive/warehouse/activemq_topic.db/unperceived/date_time=${date_time}
這裏我們的數據表按照每天的日期來分區,所以需要外部傳參 ${date_time} 來確定導出哪個文件,慢慢文件多了也好管理一些。並且可以寫一個定時任務來每天導出一次數據。
三、export報錯與解決步驟
這裏執行報了第一個錯,報錯日誌 Could not load db driver class: com.mysql.jdbc.Driver 如下:
2019-11-19 20:21:27,049 [main] INFO org.apache.sqoop.manager.MySQLManager - Preparing to use a MySQL streaming resultset.
2019-11-19 20:21:27,049 [main] INFO org.apache.sqoop.tool.CodeGenTool - Beginning code generation
2019-11-19 20:21:27,055 [main] ERROR org.apache.sqoop.Sqoop - Got exception running Sqoop: java.lang.RuntimeException: Could not load db driver class: com.mysql.jdbc.Driver
<<< Invocation of Sqoop command completed <<<
No child hadoop job is executed.
Intercepting System.exit(1)
<<< Invocation of Main class completed <<<
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SqoopMain], exit code [1]
Oozie Launcher failed, finishing Hadoop job gracefully
這個很明顯,就是缺少mysql的驅動文件,我點擊齒輪按鈕,在hdfs上選擇對應的mysql驅動jar包:
然後再執行一次,報了一個新的錯誤,export: Export job failed! :
2019-11-19 20:24:28,436 [main] ERROR org.apache.sqoop.tool.ExportTool - Error during export:
Export job failed!
at org.apache.sqoop.mapreduce.ExportJobBase.runExport(ExportJobBase.java:439)
at org.apache.sqoop.manager.SqlManager.exportTable(SqlManager.java:930)
at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:92)
at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:111)
at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
at org.apache.oozie.action.hadoop.SqoopMain.runSqoopJob(SqoopMain.java:187)
at org.apache.oozie.action.hadoop.SqoopMain.run(SqoopMain.java:170)
at org.apache.oozie.action.hadoop.LauncherMain.run(LauncherMain.java:81)
at org.apache.oozie.action.hadoop.SqoopMain.main(SqoopMain.java:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.oozie.action.hadoop.LauncherMapper.map(LauncherMapper.java:235)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:459)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1924)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
網上很多大神說因爲hive表結構與mysql的表結構不一致,我也好好對了一下,然後果然發現一個問題,在hue中顯示的unperceived表有date_time這個字段,所以我在mysql創建表時也添加了這個字段。但是這個字段是hive中按照日期分區時添加的,我們找到這個文件目錄上,文件下載下來可以看到文件中並沒有date_time這個字段,只是hue中顯示了而已。
我們看mysql的表中:
所以找到了問題在哪,只要在mysql中將這個字段刪掉就好了。
然後執行還是報錯了,哎 一直在爬坑。
這個報錯的一時解決不了,數據類型怎麼對也都是一樣的,然後我查看Hadoop的日誌信息,在報錯信息中找到選中的這個網址,打開:
然後在打開的頁面中選擇Failed下面的1:
然後我們打開可以看到這個報錯信息。
終於知道了,因爲這個統計的數據是每天所有未感知到的人員數據,所以學號會出現重複,而我在mysql中定義表時候將num這個字段定義爲了主鍵,當然就不能執行了。這裏將這個主鍵取消掉即可:
四、解決問題後執行導出
然後再導出看看,可以發現不報錯了,導出成功:
打開mysql,看看這個表數據是否存在:
OK了,成功export,以後記住了。記錄一下。