我试图直接从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文件格式没有问题,但是镶木地板是个问题...你知道为什么会这样吗?
谢谢:)
答案 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
。
如果上述方法无效,请尝试:
答案 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,则可以修复此问题。