【问题标题】:What's wrong with this HIVE script to export from DynamoDB to S3 in an AWS Data Pipeline?这个从 DynamoDB 导出到 AWS 数据管道中的 S3 的 HIVE 脚本有什么问题?
【发布时间】:2015-03-12 21:26:04
【问题描述】:

下面的 HIVE 脚本是否存在问题,或者这是另一个问题,可能与 AWS Data Pipeline 安装的 HIVE 版本有关?

我的 AWS Data Pipeline 的第一部分必须将大型表从 DynamoDB 导出到 S3,以便以后使用 EMR 进行处理。我用于测试的 DynamoDB 表只有几行,所以我知道数据格式正确。

与 AWS Data Pipeline“将 DynamoDB 导出到 S3”构建块关联的脚本适用于仅包含 primitive_types 但不导出 array_types 的表。 (参考-http://archive.cloudera.com/cdh/3/hive/language_manual/data-manipulation-statements.html

我提取了所有特定于 Data Pipeline 的东西,现在正试图让以下基于 DynamoDB 文档的最小示例工作 - (参考 - http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EMR_Hive_Commands.html

-- Drop table
DROP table dynamodb_table;

--http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EMR_Hive_Commands.html
CREATE EXTERNAL TABLE dynamodb_table (song string, artist string, id string, genres array<string>)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "InputDB",
"dynamodb.column.mapping" = "song:song,artist:artist,id:id,genres:genres");

INSERT OVERWRITE DIRECTORY 's3://umami-dev/output/colmap/' SELECT *
FROM dynamodb_table;

这是我在运行上述脚本时看到的堆栈跟踪/EMR 错误 -

Diagnostic Messages for this Task:
java.io.IOException: IO error in map input file hdfs://172.31.40.150:9000/mnt/hive_0110/warehouse/dynamodb_table
at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.moveToNext(MapTask.java:244)
at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.next(MapTask.java:218)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:48)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:441)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:377)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1132)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
Caused by: java.io.IOException: java.lang.NullPointerException
at org.apache.hadoop.hive.io.HiveIOExceptionHandlerChain.handleRecordReaderNextException(HiveIOExceptionHandlerChain.java:121)
at org.apache.hadoop.hive.io.HiveIOExceptionHandlerUtil.handleRecordReaderNextException(HiveIOExceptionHandlerUtil.java:77)
at org.apache.hadoop.hive.ql.io.HiveContextAwareRecordReader.doNext(HiveContextAwareRecordReader.java:276)
at org.apache.hadoop.hive.ql.io.HiveRecordReader.doNext(HiveRecordReader.java:79)
at org.apache.hadoop.hive.ql.io.HiveRecordReader.doNext(HiveRecordReader.java:33)
at org.apache.hadoop.hive.ql.io.HiveContextAwareRecordReader.next(HiveContextAwareRecordReader.java:108)
at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.moveToNext(MapTask.java:238)
... 9 more
Caused by: java.lang.NullPointerException
at org.apache.hadoop.dynamodb.read.AbstractDynamoDBRecordReader.scan(AbstractDynamoDBRecordReader.java:176)
at org.apache.hadoop.hive.dynamodb.read.HiveDynamoDBRecordReader.fetchItems(HiveDynamoDBRecordReader.java:87)
at org.apache.hadoop.hive.dynamodb.read.HiveDynamoDBRecordReader.next(HiveDynamoDBRecordReader.java:44)
at org.apache.hadoop.hive.dynamodb.read.HiveDynamoDBRecordReader.next(HiveDynamoDBRecordReader.java:25)
at org.apache.hadoop.hive.ql.io.HiveContextAwareRecordReader.doNext(HiveContextAwareRecordReader.java:274)
... 13 more

FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask
MapReduce Jobs Launched: 
Job 0: Map: 1   HDFS Read: 0 HDFS Write: 0 FAIL
Total MapReduce CPU Time Spent: 0 msec
Command exiting with ret '255'

我已经尝试了一些调试方法,但都没有成功 - 使用几个不同的 JSON SerDes 创建一个带格式的外部表。我不确定接下来要尝试什么。

非常感谢。

【问题讨论】:

  • 您是否在 EMR AMI 3.3.2 或更高版本中尝试过此操作?
  • 是的。我试过了,但仍然没有运气。谢谢。在 3.3.2 中,我得到了带有字符串字段的行,但没有 array 字段。三行输出看起来像这样 - 2The CureInbetween Days\N\n 1The CureBoys Dont Cry\N\n 3Depeche ModePimpf\N\n "\N" 实际上在输出中,而 "\n" 是真正的换行符。

标签: amazon-web-services amazon-s3 hive amazon-dynamodb amazon-data-pipeline


【解决方案1】:

我通过创建 EMR 集群并使用 Hue 在 Amazon 环境中快速运行 HIVE 查询来回答我自己的问题。

解决方案是更改 DynamoDB 中项目的格式 - 最初的字符串列表现在是字符串集。然后我的 Hive 表可以在阵列上成功运行。

从逻辑上讲,我可能会丢失字符串的顺序,因为我假设 List 是有序的,而 Set 不是。这对我的具体问题无关紧要。

这是最终运行的 Hive 脚本的相关块 -

-- depends on genres2 to be a StringSet (or not exist)
CREATE EXTERNAL TABLE sauce (id string, artist string, song string, genres2 array<string>)
STORED BY "org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler"
TBLPROPERTIES ("dynamodb.table.name" = "InputDB",
"dynamodb.column.mapping" = "id:id,artist:artist,song:song,genres2:genres2");

-- s3 location for export to
CREATE EXTERNAL TABLE pasta (id int, artist string, song string, genres array<string>)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY '|'
LOCATION "s3n://umami-dev/tmp2";

-- do the export
INSERT OVERWRITE TABLE pasta
SELECT * FROM sauce;

【讨论】:

    猜你喜欢
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多