sqoop导入——作为与cdh5的parquetfile

nmpmafwu  于 2021-05-30  发布在  Hadoop
关注(0)|答案(6)|浏览(312)

我试图直接从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是一个问题。。。你知道为什么会这样吗?
谢谢:)

pengsaosao

pengsaosao1#

请不要使用 <db>.<table>--hive-table . 这不适用于Parquet地板进口。sqoop使用kitesdk来编写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
wswtfjt7

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,则可以修复此问题。

i5desfxk

i5desfxk3#

我找到了一个解决方案,我放弃了所有的Hive部分,并使用目标目录来存储数据。。。似乎有效:

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生成一个外部表。。。

inkz8wg9

inkz8wg94#

--作为Parquet文件
在sqoop 1.4.6(cdh 5.5)中添加了。

hsgswve4

hsgswve45#

您的发行版中似乎缺少数据库支持。好像是最近才加的。尝试设置 --hive-table--hive-table pages_users3 以及移除 --target-dir .
如果上述方法无效,请尝试:
这篇博文。
文件。
请与user@sqoop.apache.org 邮件列表。

a11xaf1n

a11xaf1n6#

下面是我在cdh5.5中的管道,用于从jdbc导入hiveparquet文件。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\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) 上面的命令创建一个名为

/user/hive/warehouse/TIME_DIM

明智的做法是将其移动到特定的配置单元数据库目录,例如:

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

假设配置单元数据库/架构的名称为“dwh”。
3) 通过直接从parquet文件获取架构来创建配置单元表:

$ 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

如果上面的命令返回多个parquet文件(这意味着您有多个Map器--num mappers参数),您可以在下面的命令中选择任何parquet文件。
这个命令应该在 Impala 中运行,而不是在Hive中。hive当前无法从Parquet文件推断架构,但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'
;

另外,也可以使用spark从Parquet地板中推断出模式。

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

相关问题