Sqoop导入 - 带有CDH5的镶木地板文件

时间:2015-01-09 13:43:05

标签: hadoop sqoop

我试图直接从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文件格式没有问题,但是镶木地板是个问题...你知道为什么会这样吗?

谢谢:)

6 个答案:

答案 0 :(得分:9)

请不要将<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

答案 1 :(得分:4)

这是我在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用户:我必须作为源表的所有者连接,否则必须指定&#34; MRT_OWNER.TIME_DIM&#34;,并且收到错误org.kitesdk.data.ValidationException:Namespace MRT_OWNER .TIME_DIM不是字母数字(加上&#39; _&#39;),似乎是一个sqoop错误。)

(ps2。表名必须全部大写..不确定这是否特定于Oracle(不应该是),如果这是另一个sqoop错误。)

(ps3 .--compress --compression-codec snappy参数被识别,但似乎没有任何效果)

2)上面的命令创建一个名为

的目录
/user/hive/warehouse/TIME_DIM

将其移动到特定的Hive数据库目录是个明智的想法,例如:

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

假设Hive数据库/架构的名称是&#34; dwh&#34;。

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

答案 2 :(得分:1)

  

- AS-parquetfile

在Sqoop 1.4.6(CDH 5.5)中添加。

答案 3 :(得分:0)

您的发行版中似乎缺少database支持。看起来它最近才被添加。尝试将--hive-table设置为--hive-table pages_users3并删除--target-dir

如果上述方法无效,请尝试:

  1. blog post
  2. docs
  3. 查看user@sqoop.apache.org邮件列表。

答案 4 :(得分:0)

我找到了一个解决方案,我删除了所有的配置单元并使用目标目录来存储数据......似乎工作:

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 :(得分:0)

(ps。对于Oracle用户:我必须作为源表的所有者连接,否则必须指定&#34; MRT_OWNER.TIME_DIM&#34;,并且收到错误org.kitesdk.data.ValidationException:Namespace MRT_OWNER .TIME_DIM不是字母数字(加上&#39; _&#39;),似乎是一个sqoop错误。)

如果将数据库名称和表名写为db_name / table_name而不是db_name.table_name,则可以修复此问题。