2015-01-09 52 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