首页 文章

EMR:如何将Spark与Hive集成?

提问于
浏览
0

使用EMR集群,我创建了一个映射到DynamoDB表的外部Hive表(超过8亿行) . 它运作良好,我可以通过蜂巢进行查询和插入 .

如果我通过Hive中的hash_key尝试查询条件,我会在几秒钟内得到结果 . 但是使用SparkSQL和enableHiveSupport(访问Hive)通过spark-submit执行相同的查询它没有完成 . 似乎从Spark它正在对表进行全面扫描 .

我尝试了几种配置(例如,不同的hive-site.xml),但它似乎不能很好地从Spark中运行 . 我应该如何通过Spark做到这一点?有什么建议?

谢谢

1 回答

  • 0

    只需确保使用AWS的dynamo连接器opensource . 默认情况下,它可在EMR AFAIK上使用 .

    使用DynamoDBStorageHandler类创建表的语法:

    CREATE EXTERNAL TABLE hive_tablename (
        hive_column1_name column1_datatype,
        hive_column2_name column2_datatype
    )
    STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
    TBLPROPERTIES (
        "dynamodb.table.name" = "dynamodb_tablename",
        "dynamodb.column.mapping" =
            "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name"
    );
    

    对于任何Spark Job,您需要具备以下内容:

    $ spark-shell --jars /usr/share/aws/emr/ddb/lib/emr-ddb-hadoop.jar
    ...
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.dynamodb.DynamoDBItemWritable
    import org.apache.hadoop.dynamodb.read.DynamoDBInputFormat
    import org.apache.hadoop.dynamodb.write.DynamoDBOutputFormat
    import org.apache.hadoop.mapred.JobConf
    import org.apache.hadoop.io.LongWritable
    
    var jobConf = new JobConf(sc.hadoopConfiguration)
    jobConf.set("dynamodb.input.tableName", "myDynamoDBTable")
    
    jobConf.set("mapred.output.format.class", "org.apache.hadoop.dynamodb.write.DynamoDBOutputFormat")
    jobConf.set("mapred.input.format.class", "org.apache.hadoop.dynamodb.read.DynamoDBInputFormat")
    
    var orders = sc.hadoopRDD(jobConf, classOf[DynamoDBInputFormat], classOf[Text], classOf[DynamoDBItemWritable])
    
    orders.count()
    

    参考文献:https://github.com/awslabs/emr-dynamodb-connector

相关问题