【问题标题】:Saving Hive tables between different warehouse directories in HDFS via Spark App通过 Spark App 在 HDFS 中不同仓库目录之间保存 Hive 表
【发布时间】:2017-08-24 17:14:30
【问题描述】:

到目前为止,我目前正在研究如何正确保存从特定数据库中的映射源表派生的特定配置单元表。假设测试人员和开发人员都将有一个单独的数据库。如何将他们可以访问的表列表相互隔离?

目前,我通过 HUE 监控两个数据库的状态。现在,我有一个运行在 yarn 集群上的 spark 程序,它根据他是开发人员还是测试人员创建一个要存储的表。

我刚刚创建的 spark 程序是一个简单的应用程序,它从当前仓库位置读取一个表并保存一个名为 new_table

的新表

我有如下配置 xml 如下:

<configuration>
  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://xxxx:9083</value>
  </property>
  <property>
    <name>hive.metastore.client.socket.timeout</name>
    <value>300</value>
  </property>
  <!--<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/yyyy/warehouse</value>
  </property>-->
  <property>
    <name>hive.warehouse.subdir.inherit.perms</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.auto.convert.join</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.auto.convert.join.noconditionaltask.size</name>
    <value>20971520</value>
  </property>
  <property>
    <name>hive.optimize.bucketmapjoin.sortedmerge</name>
    <value>false</value>
  </property>
  <property>
    <name>hive.smbjoin.cache.rows</name>
    <value>10000</value>
  </property>
  <property>
    <name>hive.server2.logging.operation.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.server2.logging.operation.log.location</name>
    <value>/var/log/hive/operation_logs</value>
  </property>
  <property>
    <name>mapred.reduce.tasks</name>
    <value>-1</value>
  </property>
  <property>
    <name>hive.exec.reducers.bytes.per.reducer</name>
    <value>67108864</value>
  </property>
  <property>
    <name>hive.exec.copyfile.maxsize</name>
    <value>33554432</value>
  </property>
  <property>
    <name>hive.exec.reducers.max</name>
    <value>1099</value>
  </property>
  <property>
    <name>hive.vectorized.groupby.checkinterval</name>
    <value>4096</value>
  </property>
  <property>
    <name>hive.vectorized.groupby.flush.percent</name>
    <value>0.1</value>
  </property>
  <property>
    <name>hive.compute.query.using.stats</name>
    <value>false</value>
  </property>
  <property>
    <name>hive.vectorized.execution.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.vectorized.execution.reduce.enabled</name>
    <value>false</value>
  </property>
  <property>
    <name>hive.merge.mapfiles</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.merge.mapredfiles</name>
    <value>false</value>
  </property>
  <property>
    <name>hive.cbo.enable</name>
    <value>false</value>
  </property>
  <property>
    <name>hive.fetch.task.conversion</name>
    <value>minimal</value>
  </property>
  <property>
    <name>hive.fetch.task.conversion.threshold</name>
    <value>268435456</value>
  </property>
  <property>
    <name>hive.limit.pushdown.memory.usage</name>
    <value>0.1</value>
  </property>
  <property>
    <name>hive.merge.sparkfiles</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.merge.smallfiles.avgsize</name>
    <value>16777216</value>
  </property>
  <property>
    <name>hive.merge.size.per.task</name>
    <value>268435456</value>
  </property>
  <property>
    <name>hive.optimize.reducededuplication</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.optimize.reducededuplication.min.reducer</name>
    <value>4</value>
  </property>
  <property>
    <name>hive.map.aggr</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.map.aggr.hash.percentmemory</name>
    <value>0.5</value>
  </property>
  <property>
    <name>hive.optimize.sort.dynamic.partition</name>
    <value>false</value>
  </property>
  <property>
    <name>hive.execution.engine</name>
    <value>mr</value>
  </property>
  <property>
    <name>spark.executor.memory</name>
    <value>996461772</value>
  </property>
  <property>
    <name>spark.driver.memory</name>
    <value>966367641</value>
  </property>
  <property>
    <name>spark.executor.cores</name>
    <value>4</value>
  </property>
  <property>
    <name>spark.yarn.driver.memoryOverhead</name>
    <value>102</value>
  </property>
  <property>
    <name>spark.yarn.executor.memoryOverhead</name>
    <value>167</value>
  </property>
  <property>
    <name>spark.dynamicAllocation.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>spark.dynamicAllocation.initialExecutors</name>
    <value>1</value>
  </property>
  <property>
    <name>spark.dynamicAllocation.minExecutors</name>
    <value>1</value>
  </property>
  <property>
    <name>spark.dynamicAllocation.maxExecutors</name>
    <value>2147483647</value>
  </property>
  <property>
    <name>hive.metastore.execute.setugi</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.support.concurrency</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.zookeeper.quorum</name>
    <value>xxxx,xxxx</value>
  </property>
  <property>
    <name>hive.zookeeper.client.port</name>
    <value>2181</value>
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>xxxx,xxxx</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.clientPort</name>
    <value>2181</value>
  </property>
  <property>
    <name>hive.zookeeper.namespace</name>
    <value>hive_zookeeper_namespace_hive</value>
  </property>
  <property>
    <name>hive.cluster.delegation.token.store.class</name>
    <value>org.apache.hadoop.hive.thrift.MemoryTokenStore</value>
  </property>
  <property>
    <name>hive.server2.enable.doAs</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.server2.use.SSL</name>
    <value>false</value>
  </property>
  <property>
    <name>spark.shuffle.service.enabled</name>
    <value>true</value>
  </property>
</configuration>

根据我目前的理解,如果我在通过hive.warehouse.dir 使用--files /file/hive-site.xml 在纱线集群上提交 spark 应用程序时将仓库位置更改为某个值,例如 hdfs:/user/diff/warehouse,spark 应用上的 hive 配置应该会检测到特定目录中存在的以下 hive 表。

但是,这样做后,它仍会保留到默认数据库的位置 hive.metastore.uris 指向目录 hdfs:/user/hive/warehouse。据我了解,hive.metastore.uris 会覆盖hive.metastore.dir 中的数据库位置。

此时我做错了什么?我需要在 Hive-site.xml 中正确配置什么吗?任何答案将不胜感激。谢谢你。在 spark 和 hadoop 方面,我目前是一名新手开发人员。

【问题讨论】:

    标签: hadoop apache-spark hive


    【解决方案1】:

    创建单独的数据库

    演示

    创建数据库是一次性的

    hive> create database dev_db location '/user/hive/my_databases/dev';
    hive> create database tst_db location '/user/hive/my_databases/tst';
    

    创建表时,您选择要使用的数据库

    hive> create table dev_db.my_dev_table (i int);
    hive> create table tst_db.my_tst_table (i int);
    

    hive> desc formatted dev_db.my_dev_table;
    

    # col_name              data_type               comment             
             
    i                       int                                         
             
    # Detailed Table Information         
    Database:               dev_db                   
    ...                  
    Location:               hdfs://quickstart.cloudera:8020/user/hive/my_databases/dev/my_dev_table  
    ...      
    

    hive> desc formatted tst_db.my_tst_table;
    

    Database:               tst_db                   
    ...              
    Location:               hdfs://quickstart.cloudera:8020/user/hive/my_databases/tst/my_tst_table  
    ...
    

    【讨论】:

    • 有没有办法将 hive-site.xml 配置为指向我想要访问的数据库,而无需实际调用 use tablecreate database ...'?我正在通过在 yarn cluster 上提交的 spark 应用程序创建或覆盖表。 .
    • 除了明确说明数据库名称(例如select * from db1.name)之外,我只想查询而不包括数据库名称。我只是想知道有没有其他方法。但我明白你的意思,谢谢。
    猜你喜欢
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 2016-04-17
    • 1970-01-01
    • 2019-06-11
    相关资源
    最近更新 更多