簡體   English   中英

Sqoop導入 - 帶有CDH5的鑲木地板文件

[英]Sqoop import --as-parquetfile with CDH5

我正在嘗試將數據直接從mysql導入到鑲木地板,但它似乎無法正常工作......

我正在使用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)

我沒有問題導入數據到hive文件格式,但實木復合地板是一個問題...你知道為什么會這樣嗎?

謝謝 :)

請不要將<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

這是我在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-mappers為1,因為TIME_DIM表只有大約20k行,並且不建議將鑲木桌分成多個文件用於這樣一個小數據集。 每個映射器創建一個單獨的輸出(鑲木地板)文件。

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

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

(ps3 .--壓縮--compression-codec snappy參數被識別但似乎沒有任何效果)

2)上面的命令創建一個名為的目錄

/user/hive/warehouse/TIME_DIM

將它移動到特定的Hive數據庫目錄是明智的想法,例如:

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

假設Hive數據庫/模式的名稱是“dwh”。

3)通過直接從鑲木地板文件中獲取模式來創建Hive表:

$ 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-mappers參數),你可以在下面的命令中選擇任何鑲木地板文件。

此命令應在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)由於表格不是在Hive中創建的(自動收集統計數據),因此收集統計數據是個好主意:

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

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

--as-parquetfile

在Sqoop 1.4.6(CDH 5.5)中加入。

您的發行版中似乎缺少數據庫支持。 看起來它最近才被添加。 嘗試將--hive-table設置為--hive-table pages_users3並刪除--target-dir

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

  1. 這篇博文
  2. 文檔
  3. 請訪問user@sqoop.apache.org郵件列表。

我找到了一個解決方案,我刪除了所有的配置單元並使用目標目錄來存儲數據......似乎工作:

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制作外部表的目錄...

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

如果數據庫名稱和表名稱寫為db_name / table_name而不是db_name.table_name,則可以修復此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM