2015-01-09 85 views
2

我想直接從MySQL數據導入到實木複合地板,但它似乎沒有正常工作......Sqoop進口--as-parquetfile與CDH5

我使用CDH5.3包括Sqoop 1.4.5。

這裏是我的命令行:

sqoop import --connect jdbc:mysql://xx.xx.xx.xx/database --username username --password mypass --query 'SELECT page_id,user_id FROM pages_users WHERE $CONDITIONS' --split-by page_id --hive-import --hive-table default.pages_users3 --target-dir hive_pages_users --as-parquetfile 

然後我得到這個錯誤:

Warning: /opt/cloudera/parcels/CDH-5.3.0-1.cdh5.3.0.p0.30/bin/../lib/sqoop/../accumulo does not exist! Accumulo imports will fail. 
Please set $ACCUMULO_HOME to the root of your Accumulo installation. 
15/01/09 14:31:49 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5-cdh5.3.0 
15/01/09 14:31:49 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead. 
15/01/09 14:31:49 INFO tool.BaseSqoopTool: Using Hive-specific delimiters for output. You can override 
15/01/09 14:31:49 INFO tool.BaseSqoopTool: delimiters with --fields-terminated-by, etc. 
15/01/09 14:31:49 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset. 
15/01/09 14:31:49 INFO tool.CodeGenTool: Beginning code generation 
15/01/09 14:31:50 INFO manager.SqlManager: Executing SQL statement: SELECT page_id,user_id FROM pages_users WHERE (1 = 0) 
15/01/09 14:31:50 INFO manager.SqlManager: Executing SQL statement: SELECT page_id,user_id FROM pages_users WHERE (1 = 0) 
15/01/09 14:31:50 INFO manager.SqlManager: Executing SQL statement: SELECT page_id,user_id FROM pages_users WHERE (1 = 0) 
15/01/09 14:31:50 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce 
Note: /tmp/sqoop-root/compile/b90e7b492f5b66554f2cca3f88ef7a61/QueryResult.java uses or overrides a deprecated API. 
Note: Recompile with -Xlint:deprecation for details. 
15/01/09 14:31:51 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-root/compile/b90e7b492f5b66554f2cca3f88ef7a61/QueryResult.jar 
15/01/09 14:31:51 INFO mapreduce.ImportJobBase: Beginning query import. 
15/01/09 14:31:51 INFO Configuration.deprecation: mapred.jar is deprecated. Instead, use mapreduce.job.jar 
15/01/09 14:31:51 INFO manager.SqlManager: Executing SQL statement: SELECT page_id,user_id FROM pages_users WHERE (1 = 0) 
15/01/09 14:31:51 INFO manager.SqlManager: Executing SQL statement: SELECT page_id,user_id FROM pages_users WHERE (1 = 0) 
15/01/09 14:31:51 WARN spi.Registration: Not loading URI patterns in org.kitesdk.data.spi.hive.Loader 
15/01/09 14:31:51 ERROR sqoop.Sqoop: Got exception running Sqoop: org.kitesdk.data.DatasetNotFoundException: Unknown dataset URI: hive?dataset=default.pages_users3 
org.kitesdk.data.DatasetNotFoundException: Unknown dataset URI: hive?dataset=default.pages_users3 
    at org.kitesdk.data.spi.Registration.lookupDatasetUri(Registration.java:109) 
    at org.kitesdk.data.Datasets.create(Datasets.java:189) 
    at org.kitesdk.data.Datasets.create(Datasets.java:240) 
    at org.apache.sqoop.mapreduce.ParquetJob.createDataset(ParquetJob.java:81) 
    at org.apache.sqoop.mapreduce.ParquetJob.configureImportJob(ParquetJob.java:70) 
    at org.apache.sqoop.mapreduce.DataDrivenImportJob.configureMapper(DataDrivenImportJob.java:112) 
    at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:262) 
    at org.apache.sqoop.manager.SqlManager.importQuery(SqlManager.java:721) 
    at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:499) 
    at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:605) 
    at org.apache.sqoop.Sqoop.run(Sqoop.java:143) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 
    at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179) 
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218) 
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227) 
    at org.apache.sqoop.Sqoop.main(Sqoop.java:236) 

我沒有問題,將數據導入配置單元文件格式,但實木複合地板是一個問題......你有什麼想法爲什麼發生這種情況?

謝謝:)

回答

0

好像database支持在您的分佈失蹤。它看起來像是最近添加的。嘗試將--hive-table設置爲--hive-table pages_users3並刪除--target-dir

如果上述方法無效,請嘗試:

  1. blog post
  2. docs
  3. 請使用[email protected]郵件列表進行檢查。
+0

從文檔:當導入自由格式查詢,您必須使用--target-dir指定目標目錄。 – timfeirg

0

我找到了一個解決方案,我droppped所有的蜂巢部件和使用目標目錄來存儲數據......似乎工作:

sqoop import --connect jdbc:mysql://xx.xx.xx.xx/database --username username --password mypass --query 'SELECT page_id,user_id FROM pages_users WHERE $CONDITIONS' --split-by page_id --target-dir /home/cloudera/user/hive/warehouse/soprism.db/pages_users3 --as-parquetfile -m 1 

然後我鏈接到目錄使外部表來自Impala ...

5

請不要使用<db>.<table>--hive-table。這不適用於Parquet導入。 Sqoop使用Kite SDK編寫Parquet文件,它不喜歡這種<db>.<table>格式。

請改用--hive-database --hive-table。爲你的命令,它應該是:

sqoop import --connect jdbc:mysql://xx.xx.xx.xx/database \ 
    --username username --password mypass \ 
    --query 'SELECT page_id,user_id FROM pages_users WHERE $CONDITIONS' --split-by page_id \ 
    --hive-import --hive-database default --hive-table pages_users3 \ 
    --target-dir hive_pages_users --as-parquetfile 
0

--as-parquetfile

在Sqoop 1.4.6(CDH 5.5)加入。

3

這是我在CDH 5.5中的管道,用於從jdbc導入到Hive實木複合地板文件。 JDBC數據源是針對Oracle的,但下面的解釋也適合MySQL。

1)Sqoop:

$ sqoop import --connect "jdbc:oracle:thin:@(complete TNS descriptor)" \ 
    --username MRT_OWNER -P \ 
    --compress --compression-codec snappy \ 
    --as-parquetfile \ 
    --table TIME_DIM \ 
    --warehouse-dir /user/hive/warehouse \ 
    --num-mappers 1 

我選擇--num映射器爲1,因爲TIME_DIM表剛剛左右〜20K行,這不是勸拆地板表分成多個文件,這樣一個小數據集。每個映射器都會創建一個單獨的輸出(parquet)文件。

(適用於Oracle用戶的ps:我必須連接作爲源表的所有者,否則必須指定「MRT_OWNER」。TIME_DIM「,並且出現錯誤org.kitesdk.data.ValidationException:命名空間MRT_OWNER.TIME_DIM不是字母數字(加上'_'),似乎是一個sqoop bug)

(ps2。表名必須全部爲大寫..不知道這是否是特定於Oracle(不應該),如果這是另一個sqoop錯誤)。

(ps3。--compress --compression-codec snappy參數被識別,但似乎沒有任何影響)

2)上面的命令創建一個名爲

/user/hive/warehouse/TIME_DIM 

這是將其移動到一個特定的蜂房數據庫目錄一個明智的想法,例如:

$ hadoop fs -mv /hivewarehouse/TIME_DIM /hivewarehouse/dwh.db/time_dim 

假設蜂巢數據庫/模式是「數據倉庫」的名稱。

3)創建蜂巢表,由木文件採取的模式直接:

$ hadoop fs -ls /user/hive/warehouse/dwh.db/time_dim | grep parquet 

-rwxrwx--x+ 3 hive hive  1216 2016-02-04 23:56 /user/hive/warehouse/dwh.db/time_dim/62679a1c-b848-426a-bb8e-9372328ddad7.parquet 

如果上面的命令返回比拼花文件的更多(這意味着你有一個以上的映射,在--num映射器參數),你可以選擇任何實木複合地板文件到下面的命令。

該命令應該在Impala中運行,而不是在Hive中運行。 Hive目前無法從實木複合地板文件推斷架構,但Impala可以:

[impala-shell] > CREATE TABLE dwh.time_dim 
LIKE PARQUET '/user/hive/warehouse/dwh.db/time_dim/62679a1c-b848-426a-bb8e-9372328ddad7.parquet' 
COMMENT 'sqooped from MRT_OWNER.TIME_DIM' 
STORED AS PARQUET 
LOCATION  'hdfs:///user/hive/warehouse/dwh.db/time_dim' 
; 

ps。也可以使用Spark來推斷來自實木複合地板的圖案,例如,

spark.read.schema('hdfs:///user/hive/warehouse/dwh.db/time_dim') 

4)由於表中未蜂巢(自動收集數據)創建的,它收集的統計是一個好主意:

[impala-shell] > compute stats dwh.time_dim; 

https://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_literal_sqoop_import_literal

+0

很好地說明。 – Sud