我试图直接从mysql导入数据到parquet,但它似乎不能正常工作。。。
我使用的是cdh5.3,其中包括sqoop1.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)
我没有问题导入数据到配置单元文件格式,但Parquet是一个问题。。。你知道为什么会这样吗?
谢谢:)
6条答案
按热度按时间pengsaosao1#
请不要使用
<db>.<table>
与--hive-table
. 这不适用于Parquet地板进口。sqoop使用kitesdk来编写Parquet文件,它不喜欢这样<db>.<table>
格式。相反,请使用--hive database--hive table。你的命令应该是:
wswtfjt72#
(另外,对于oracle用户:我必须作为源表的所有者连接,否则必须指定“mrt\u owner.time\u dim”,并且得到错误org.kitesdk.data.validationexception:namespace mrt\u owner.time\u dim不是字母数字(加上'),似乎是一个sqoop bug)。
如果将数据库名和表名写为db\u name/table\u name而不是db\u name.table\u name,则可以修复此问题。
i5desfxk3#
我找到了一个解决方案,我放弃了所有的Hive部分,并使用目标目录来存储数据。。。似乎有效:
然后我链接到目录,从impala生成一个外部表。。。
inkz8wg94#
--作为Parquet文件
在sqoop 1.4.6(cdh 5.5)中添加了。
hsgswve45#
您的发行版中似乎缺少数据库支持。好像是最近才加的。尝试设置
--hive-table
至--hive-table pages_users3
以及移除--target-dir
.如果上述方法无效,请尝试:
这篇博文。
文件。
请与user@sqoop.apache.org 邮件列表。
a11xaf1n6#
下面是我在cdh5.5中的管道,用于从jdbc导入hiveparquet文件。jdbc数据源是针对oracle的,但下面的解释也适用于mysql。
1) sqoop公司:
我选择--num mappers作为1,因为time\u dim表只有大约2万行,对于这样一个小的数据集,不建议将parquet表拆分为多个文件。每个Map器创建一个单独的输出(Parquet)文件。
(另外,对于oracle用户:我必须作为源表的所有者连接,否则必须指定“mrt\u owner.time\u dim”,并且得到错误org.kitesdk.data.validationexception:namespace mrt\u owner.time\u dim不是字母数字(加上'),似乎是一个sqoop bug)。
(ps2。表名必须全部大写。。不确定这是否是特定于oracle的(不应该是),以及这是否是另一个sqoop错误)。
(ps3--compress—压缩编解码器snappy参数已被识别,但似乎没有任何效果)
2) 上面的命令创建一个名为
明智的做法是将其移动到特定的配置单元数据库目录,例如:
假设配置单元数据库/架构的名称为“dwh”。
3) 通过直接从parquet文件获取架构来创建配置单元表:
如果上面的命令返回多个parquet文件(这意味着您有多个Map器--num mappers参数),您可以在下面的命令中选择任何parquet文件。
这个命令应该在 Impala 中运行,而不是在Hive中。hive当前无法从Parquet文件推断架构,但impala可以:
另外,也可以使用spark从Parquet地板中推断出模式。
4) 由于表不是在hive中创建的(它会自动收集统计信息),所以收集统计信息是个好主意:
https://sqoop.apache.org/docs/1.4.6/sqoopuserguide.html#_literal_sqoop_import_literal