將hive中的表使用sqoop導出到mysql數據庫中(報錯與問題解決)

今天在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,以後記住了。記錄一下。

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