1. 程式人生 > >Hadoop Hive Spark hive建表語句對錶在hdfs上儲存的file或block數量、以及後續spark讀檔案跑模型的影響

Hadoop Hive Spark hive建表語句對錶在hdfs上儲存的file或block數量、以及後續spark讀檔案跑模型的影響

問題描述:

前段時間使用hive語句建了兩張較為相似的資料表,後來在spark上用這兩張表跑相同的模型,發現兩張表的模型訓練時間不同,其中一張表跑起來非常慢。而兩張表的欄位數量和資料量並沒有太大的差別,頗為奇怪。

解決方法:

先說結論:

以上問題是兩張表在hdfs上儲存的檔案數量不一樣導致的,初始原因是在執行建表語句的時候兩張表用的reducer個數不同。
hive語句建的表在hdfs上儲存的file個數( 即fs -ls命令展示的items個數)等於語句執行時候的reducer個數,而spark又是根據file的讀取檔案。所以若資料表的資料量過大而檔案數量太少,導致每個檔案過大,容易拖慢spark的執行速度。
可以通過設定reducer個數調整在hadoop上儲存的file個數,從而調節spark讀取的每個檔案的大小,進一步提高模型訓練速度。
需要注意:


若file的大小若超過hdfs設定的block size,則會對應多個block(即,file數量總數大於等於block個數),
hadoop叢集上的有block.Size引數的設定,一般是64M、128M、256M等,hive上也有一個dfs.block.size引數,但是這個應該和map數量有關。

可以從以下原理、命令自行實驗理解,此處不再贅述。

Hive部分:
Map與Reducer個數的確定:
Map數的計算公式:

num_Map_tasks = max[${Mapred.min.split.size},
                min(${dfs.block.size
}, ${Mapred.max.split.size})]

Reducer個數:
1. 直接指定 : set mapred.reduce.tasks=100;
2. 調整每個reducer處理的資料大小:

 num_Reduce_tasks = min[${Hive.exec.Reducers.max}, 
                      (${input.size} / ${ Hive.exec.Reducers.bytes.per.Reducer})]

Mapred.min.split.size指的是資料的最小分割單元大小。
Mapred.max.split.size指的是資料的最大分割單元大小。
dfs.block.size指的是HDFS設定的資料塊大小。

Hadoop命令:
查看錶檔案

hadoop fs -ls /xx/xx.db/xxtable

檢視file和block

 hadoop fsck /xx/xx.db/dual    -files   -blocks  

檢視某個block的block.size設定值以及備份個數

 hadoop fs -stat "%o %r"  /xx/xx.db/dual/000000_0

相關推薦

Hadoop Hive Spark hive表語hdfs儲存fileblock數量以及後續spark檔案模型影響

問題描述: 前段時間使用hive語句建了兩張較為相似的資料表,後來在spark上用這兩張表跑相同的模型,發現兩張表的模型訓練時間不同,其中一張表跑起來非常慢。而兩張表的欄位數量和資料量並沒有太大的差別,頗為奇怪。 解決方法: 先說結論: 以上問題是兩

hive表語(不同的資料儲存格式,包括txtorc分割槽)

use sx_360_safe; create table sx_360_safe.sx_ela_bp_info ( id_ela_bp_info   string   ,code            string ,agent_no        string ,ope

hive程式設計指南學習筆記之一:表語以及分隔符定義

/*建立包括基本資料型別string\float,以及集合資料型別array、map 、struct的表,並指定表中的列、元素、map中鍵值之間的分隔符 很好的一個例子。 */ create table employees (     name string, &nbs

如何獲取hive表語(轉載)

說明:本文轉載自http://www.imphrack.com/?p=21  DWer 謝謝原創作者分享! 該指令碼是基於hive0.4.2版本,現在最新的0.8.1版本 hive元資料庫已經有過些許改變。 需要要將指令碼中表名COLUMNS修改為COL

Hive_ Hive 表語詳解

參考文章:最近博主在編寫一個每天定時建立Hive 分割槽的指令碼,其中需要建立Hive表,開始的時候我以為建立Hive 表的語句順序是比較寬鬆的,經過測試發現不然,Hive 建立表需要比較固定的書寫順序雖然暫時不知道這個順序,可以查閱什麼樣的文件找到,如果知道的朋友,可以在底

hive表語(包括txtOrc和分割槽)

-------------------------------- txt格式  無分割槽 ------------------------------- use sx_360_safe; create table sx_360_safe.sx_ela_bp_info ( i

oracle經典表語--scott

research def num div del col incr value 實現 create table EMP ( EMPNO NUMBER(4) PRIMARY KEY, ENAME VARCHAR2(10), JOB VARCHAR2(9),

oracle導出表的表語拼接SQL

del ora cal 導出表 evel lec ica nts rac 前段時間有個需求需要導出數據庫的500張表結構,使用PLSQLDEV工具也可以導出建表語句,但是需要手動一個表一個表選,非常費勁。就寫了個拼接sql。 select ‘select dbms_met

Mysql DBA 高級運維學習筆記-mysql表語及表知識

ase rac 範圍 cte roc .com 相關 fff size 9.9 表操作 9.9.1以默認字符集建庫 以默認格式的為例,指定字符集建庫 system@ceshi 07:0205->create database wwn; Query OK, 1 row

如何使用plsql導出oracle中的表語文件

ffd -i IT SQ 當下 sel acl user self 1 首先打開plsql,登陸所需要訪問的數據庫。 2 點擊工具欄的tools。 3 選擇下拉框中的export user object。 4 此時會彈出一個窗

MySQL幾種常用的表語(一)

span mysq 圖片 pan ont tab 數據類型 默認 primary 幾種常用的建表語句: 1、最簡單的建表語句:   create table 表名(     列名1 數據類型(長度),     列名2 數據類型(長度),     ...     )   如下

將mysql資料庫的表語修改成green plum資料庫中可執行的指令碼

#用來獲取輸入的對應的表名稱的建表語句 #首先輸入需要獲取的mysql或者sql server的資料庫表名稱,到對應的資料庫中抓出建表語句, #然後,將建表語句進行對應的修改,形成可以在pg中可用的語句 #連線mysql資料 import pymysql import sys impor

ORA-00904:識別符號無效的一個奇葩原因--工具生成表語的問題

這個問題相信大家都很常見,這就是表中無該欄位導致的。但是本文所述的問題比較特殊,請看下面的語句: 1、SELECT t.person_id FROM  TAX_DED_CHILD_T t 2、SELECT t.* FROM  TAX_DED_CHILD_T t 3

java生成mysql資料庫表語欄位欄位型別欄位註釋,可實現不用mysqldump備份資料庫

使用 mysqldump 備份資料庫也是可行的,因為每次備份的時候都需要mysqldump這個檔案, 我在windows備份時沒問題,但是放到linux上面時,centos系統死活不認這個檔案,但又不想裝mysql,一氣之下自己研究了個不需要mysqldump就可以備份的程式, 如果看了以下程式

Java,基於SSM,省市區三級聯動後臺查詢(單表),附(表語+查詢Sql)

1、建表語句 CREATE TABLE "hxdb"."sys_area" ( "id" varchar(64) COLLATE "default" NOT NULL, "code" varchar(

sqlserver2008r2表語優化

USE [master]; GO DROP DATABASE [mydata]; GO CREATE DATABASE [mydata]; GO USE [mydata]; GO CREATE TABLE [dbo].[t_user] (     [id] [int] IDE

MySQL表語句轉PostgreSQL表語全紀錄

個人習慣用MySQL workbench EER資料建模,然後生成SQL語句到資料庫中執行,這樣表之間的關係比較直觀。 像下面這樣: 畫圖 正向工程,生成DDL語句: 忽略生成外來鍵,以及外來鍵索引啥的: 生成的DDL語句: 到資料庫執行。 踩坑了 最

Oracle資料庫 迴圈表語及多表迴圈插入語句

Oracle資料庫的迴圈建表語句及多表迴圈插入語句 --建多張表的儲存過程 create  or replace procedure  createtables is i number (10) :=

DDL表語 線上轉換為 javaBean

給大家推薦一款     好用的線上 DDL建表語句轉  javaBean 的工具,  對於提高開發效率也是不錯的 https://www.jlshare.top/sqlBean https://www.jlshare.top 

mysql workbench 匯出表語 匯出資料

前言 本教程主要講述,利用mysql workbench匯出建表語句,過程很簡單,有兩種方法。 教程 方法一 概述 這種方法是比較正規的,也是mysql workbench提供的正式的匯出建表語句或者匯出資料的方式。 匯出建表語句和