目錄??
- 一.MySQL
- 1.執(zhí)行一條SQL的過程
- (A)連接器
- (B)緩存
- (C)分析器
- (D)優(yōu)化器
- (E)執(zhí)行器
- 2.MySQL引擎的區(qū)別
- (A)MyISAM:不支持事務 操作表數(shù)據(jù)鎖表
- (B)InnoDB: 支持事務 操作表數(shù)據(jù)鎖行
- 3.數(shù)據(jù)庫優(yōu)化思路
- (A)SQL語句優(yōu)化
- (B)索引優(yōu)化
- (C)數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化
- (D)服務器硬件優(yōu)化
- 1.執(zhí)行一條SQL的過程
- 二.JVM
- Java類的加載過程
- (A)加載(將class文件轉(zhuǎn)換成class實例)
- (B)驗證 (驗證類數(shù)據(jù)信息是否符合JVM規(guī)范)
- (a)格式檢查:魔數(shù)驗證谴咸,版本檢查洪唐,長度檢查
- (b)語義檢查:是否繼承final璧瞬,是否有父類缎脾,是否實現(xiàn)抽象方法
- (c)字節(jié)碼驗證:跳轉(zhuǎn)指令是否指向正確的位置袜茧,操作數(shù)類型是否合理
- (d)符號引用驗證:符號引用的直接引用是否存在
- (C)準備 (分配靜態(tài)變量的內(nèi)存空間)
- (D)解析(將常量池中的符號引用轉(zhuǎn)為直接引用)
- (E)初始化 (加載start塊和給start變量賦值)
- Java類的加載過程
- Java運行時數(shù)據(jù)區(qū)結(jié)構(gòu)
- (A)PC寄存器/程序計數(shù)器(每個線程有一個獨立的程序計數(shù)器途凫,且互不影響危纫,獨立儲存)
- (a)保存當前正在執(zhí)行的程序的內(nèi)存地址财破。
- (B)Java棧 Java Stack(每條線程對應一個棧掰派,一個棧中對應多個棧幀,執(zhí)行一個方法壓入一個棧幀左痢,結(jié)束一個方法出一個棧幀)
- (a)棧幀是每個方法關聯(lián)起來的靡羡,每運行一個方法就創(chuàng)建一個棧幀系洛,每個棧幀會含有一些局部變量,每當一個方法執(zhí)行完成時略步,該棧幀就會彈出這個棧幀的元素作為這個方法的返回值描扯,并清除這個棧幀。
- (b)Java棧頂?shù)臈褪钱斍皥?zhí)行的活動棧趟薄,也就是正在執(zhí)行的方法绽诚,
PC寄存器會指向該地址
。 - (c)棧幀的結(jié)構(gòu):
局部變量表竟趾,操作數(shù)棧憔购,動態(tài)連接方法,返回的地址
- (C)堆 Heap(堆時JVM所管理的內(nèi)存中最大的一塊岔帽,被所有的Java線程鎖共享玫鸟,不是線程安全的,在JVM啟動時創(chuàng)建)
- (a)所有對象實例以及數(shù)組都要在堆上分配犀勒。
- (b)Java堆時GC管理的主要區(qū)域屎飘,現(xiàn)在GC基本都采用
分代收集算法
,所有堆還可以細分為:新生代和老年代
新生代再細致一點有Eden空間贾费,F(xiàn)rom Survivor空間钦购,To Survivor空間
等。
- (D)方法區(qū)Method Area(方法區(qū)存放了要加載類的信息(名稱褂萧,修飾符等)類中定義為靜態(tài)常量押桃,類中的Field信息,類中的方法信息导犹,
方法區(qū)是被Java線程共享的
)- (a)方法區(qū)數(shù)據(jù)雖然時被線程共享唱凯,但是不會像Java堆一樣被GC頻繁回收,它儲存的信息相對比較穩(wěn)定谎痢,再一定條件下會被GC
- (E)常量池Constant Pool(
常量池本身是方法區(qū)的一個數(shù)據(jù)結(jié)構(gòu)磕昼。
)- (a)常量池中儲存了如字符串,final變量值节猿,類名和方法名變量值票从。常量池在編譯期間就被確定,并保存在已編譯的滨嘱。class文件中峰鄙。
- (F)本地方法棧Native Method Stack(本地方法棧和Java棧所發(fā)揮的作用非常相似,區(qū)別不過是Java棧為JVM執(zhí)行Java方法服務太雨,而本地方法棧為JVM執(zhí)行Native方法服務先馆。本地方法棧也會拋出StackOverflowError和OutOfMemoryError異常。)
- (A)PC寄存器/程序計數(shù)器(每個線程有一個獨立的程序計數(shù)器途凫,且互不影響危纫,獨立儲存)
- JMM
- 三.Hadoop
- 1.區(qū)分hdfs hbase hive 區(qū)別以及應用場景
- 四.Redis
- 五.MQ
- 六.微服務
??MySql
一躺彬,執(zhí)行一條SQL的過程
1.連接器和客戶端建立連接
- 驗證賬號密碼 -> 賬號不對煤墙,報錯:“Access denied for user”
- 認證通過梅惯,在權限表中查詢擁有的權限
1.在連接過程才會從權限表中讀取權限信息,中途對權限更新不會影響已經(jīng)建立的連接
2.若規(guī)定時間內(nèi)無活動仿野,則自動會斷開連接铣减。規(guī)定時間由wait_timeout
控制,默認為8個小時
優(yōu)化:防止數(shù)據(jù)庫中出現(xiàn)占用大量內(nèi)存的情況脚作,可以用:
1.定期斷開長連接或者占用內(nèi)存過大的連接葫哗。
2.MySQL5.7以上的版本,每次執(zhí)行一個較大的操作球涛,可執(zhí)行mysql_reset_connection
命令來初始化連接資源劣针,該操作不會重連和重新獲取授權,只是恢復到剛建立連接的狀態(tài)亿扁。
2. 查詢緩存(MySQL8.0后將刪除該功能)
- 之前執(zhí)行的過的語句捺典,會以語句為Key,執(zhí)行后的結(jié)果集為Value儲存在內(nèi)存中从祝。
- 如果緩存命中襟己,則直接返回結(jié)果
- 如果緩存沒有命中,則繼續(xù)執(zhí)行牍陌,并且將語句和結(jié)果集以key-value的形式存于內(nèi)存擎浴。
1.只要更新表,將會把該表緩存全部清空(緩存適用于不常更新的靜態(tài)表)
優(yōu)化:
1.設置默認為不適用緩存毒涧,只針對不常用的靜態(tài)表指定使用緩存(將query_cache_type 設置為 DEMAND,默認SQL不使用查詢緩存)
select SQL_CACHE * from T where ID = 10;
3.分析器
- 1.詞法分析
識別SQL關鍵字贮预,提出主要成分。MySQL根據(jù)select
得出這是一條查詢語句契讲,根據(jù)from T
識別表萌狂,將ID
識別為列名。 - 2.語法分析
根據(jù)語法規(guī)則判斷是否符合SQL的語法怀泊。如果出現(xiàn)錯誤,則提示:You have an error in your SQL syntax...
后面是錯誤的地方误趴,需要你關注use naer
后的內(nèi)容霹琼。
4.優(yōu)化器
- 選取最優(yōu)的執(zhí)行方式:
1.當涉及到多個索引時,決定用哪個索引
2.多表關聯(lián)時凉当,決定連接順序
select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
該步驟決定了先從t1表中取出`c=10`的ID值還是先查找出t2表中`d=20`的ID值枣申。
5.執(zhí)行器
- 1.根據(jù)連接器取到權限,判斷該用戶是否對T表有權限看杭。
- 2.若有權限忠藤,繼續(xù)打開表繼續(xù)操作。
打開表后楼雹,根據(jù)表的引擎定義模孩,使用提供的接口解析數(shù)據(jù):- 表T中ID字段無索引:
1. 調(diào)用InnoDB提供的接口尖阔,取出第一行,ID=10
時榨咐,將該行數(shù)據(jù)放入結(jié)果集介却。不符合則再次調(diào)用引擎接口獲取下一行,再次判斷块茁,直到執(zhí)行完最后一行齿坷。
2. 將結(jié)果集存入緩存,返回給客戶端数焊。 - 表T中的ID字段有索引:
1. 調(diào)用InnoDB的索引方法獲取滿足條件的第一行
接口永淌,server層還會再判斷一次值是否正確,然后放入結(jié)果集佩耳,接著繼續(xù)訪問滿足條件的下一行
接口遂蛀,這些結(jié)構(gòu)時引擎已經(jīng)定義好的。其原理是使用B+tree蚕愤。
- 表T中ID字段無索引:
問題:
- 如果在查詢語句中的字段不存在答恶,會在哪個階段報錯?
分析器階段萍诱。 - MySQL中解析器和預處理器有什么作用?
解析器:處理語法啊和解析查詢悬嗓,生成一顆對應的解析樹。
預處理器:進一步檢查解析樹的合法性裕坊,比如:數(shù)據(jù)表和數(shù)據(jù)列是否存在包竹,別名是否有歧義等。如果通過則生成新的解析樹籍凝,再提交給優(yōu)化器周瞎。 - Connect_timeout和wait_timeout是指什么?
Connect_timeout :連接過程中的等待時間饵蒂。
wait_timeout:連接完成后声诸,使用過程中的等待時間。
二退盯,MySQL引擎的區(qū)別
MySQL有四種引擎:ISAM , MyISAM彼乌,HEAP,InnoDB
ISAM :ISAM執(zhí)行讀取操作的速度很快渊迁,不支持事務處理慰照,也不能夠容錯。
MyISAM:MyISAM是MySQL的ISAM擴展格式和缺省的數(shù)據(jù)庫引擎琉朽。
HEAP:HEAP允許只駐留在內(nèi)存里的臨時表格毒租。駐留在內(nèi)存里讓HEAP要比ISAM和MYISAM都快。
InnoDB:支持事務等高級操作箱叁。
- MySQL5.1之前默認引擎是MyISAM墅垮,MySQL5.1之后默認引擎改為InnoDB
InnoDB支持事務并且更新數(shù)據(jù)是行鎖惕医,MyISAM不支持事務更新數(shù)據(jù)是表鎖
MyISAM數(shù)據(jù)文件比InnoDB多出一種索引文件,MyISAM比InnoDB的查詢速度塊很多噩斟。
三曹锨,數(shù)據(jù)庫優(yōu)化思路
1.SQL語句優(yōu)化:
- 盡量避免放棄使用索引而引起全表掃描,例如:
- where子句中使用剃允!=
- where子句中使用<>
- where子句中改變=號左邊的值
- where子句中對字段進行null值判斷 is null
select id from user where num is null
- 優(yōu)化建議:
- 將為null的值由0代替
select id from user where num = 0
- 很多時候使用exists代替in是一個好的選擇
- 用where子句替換having子句因為having只會在檢索出所有記錄之后才會對結(jié)果集進行過濾
- 將為null的值由0代替
2.索引優(yōu)化
- 在具有這些性質(zhì)的字段上建立索引:
- 經(jīng)常搜索(可以加快搜索速度)
- 作為主鍵的列沛简,強制該列的唯一性和組織表中的排序結(jié)構(gòu)
- 在經(jīng)常用于連接的列上(外鍵,可以加快連接速度)
- 在經(jīng)常需要根據(jù)范圍進行搜索的列上(索引以及排序斥废,指定范圍是連續(xù)的)
- 在經(jīng)常需要排序的字段
- 在經(jīng)常使用where的列上(加快條件的判斷速度)
- 不應該建立索引列的特征:
- 查詢中很少使用或者參考的列
- 數(shù)據(jù)值很少的列椒楣,例如:性別
- 類型定義為text,image和bit數(shù)據(jù)類型的列
- 修改遠遠大于檢索的列
3.數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化
- 范式優(yōu)化:
- 消除沉余(節(jié)省空間)
- 反范式優(yōu)化:
- 適當加沉余(減少join)
- 拆分表:
- 分區(qū)將在物理硬盤上分割開牡肉,不同分區(qū)的數(shù)據(jù)可以制定保存在處于不同磁盤的數(shù)據(jù)文件里捧灰。當對這個表查詢時,只需要在表分區(qū)中進行掃描统锤,而不必進行全表掃描毛俏,另外處于不同磁盤的分區(qū)也將對這個表的數(shù)據(jù)傳輸分散在不同的磁盤I/O,一個良好的分區(qū)可以將數(shù)據(jù)傳輸對磁盤I/O競爭均勻地分散開饲窿。對數(shù)據(jù)量大的時候可采用此方法煌寇。
- 例:1.產(chǎn)品表(數(shù)據(jù)量10萬,穩(wěn)定)逾雄,2.訂單表(數(shù)據(jù)量200萬阀溶,且有增長趨勢)3.用戶表(數(shù)據(jù)量100萬,且有增長趨勢)
- 垂直拆分
- 方案:吧產(chǎn)品表和用戶表放在一個server上訂單表單獨放到一個server上
- 解決問題:表于表之間的io競爭
- 不解決的問題:單表中數(shù)據(jù)量增加出現(xiàn)的壓力
- 水平拆分
- 方案:用戶表通過性別拆分男用戶和女用戶鸦泳,訂單表通過已完成訂單和未完成訂單拆分银锻,將未完成數(shù)據(jù)單獨放在一個server上,已完成訂單和男用戶放在一個server上
- 解決問題:單表中數(shù)據(jù)量增加出現(xiàn)的壓力
- 不解決的問題:表與表之間的io爭奪
4.服務器硬件的優(yōu)化
- 花錢擴展服務器性能做鹰,搭建集群等等
??JVM
Java類的加載過程
- 類從被加載到JVM中開始击纬,到卸載為止,整個生命周期包括:
加載
钾麸、驗證
更振、準備
、解析
喂走、初始化
、使用
和卸載
七個階段谋作。 - 其中類加載過程包括
加載
芋肠、驗證
、準備
遵蚜、解析
和初始化
五個階段帖池。
加載(將Class文件轉(zhuǎn)換成Class對象實例)
- 1.類加載器根據(jù)一個類的全限定名來讀取此類的二進制字節(jié)流到JVM中奈惑,然后轉(zhuǎn)換為一個與類目標對應的java.lang.Class對象實例。
- ①BootstrapClassLoader:負責加載$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++實現(xiàn)睡汹,不是ClassLoader子類肴甸。
- ②ExtClassLoader:負責加載java平臺中擴展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包囚巴。
- ③AppClassLoader:負責加載ClassPath中指定的jar包及目錄中的class
- ④CustomClassLoader:屬于應用程序根據(jù)自身需要自定義的ClassLoader原在,如tomcat,Jboss都會根據(jù)j2ee規(guī)范自行實現(xiàn)ClassLoader彤叉。
- defineClass方法將字節(jié)碼的byte數(shù)組轉(zhuǎn)換為一個類的class對象實例庶柿,如果希望在類被加載到JVM時就被鏈接,可以在自定義類加載器中調(diào)用resolve'Class方法秽浇。
-
自定義類加載器需要繼承抽象類ClassLoader,實現(xiàn)findClass方法浮庐,該方法會在lodClass調(diào)用的時候被調(diào)用,findClass默認會拋出異常柬焕。
- findClass:表示根據(jù)類名查找類對象审残。
- loadClass:表示根據(jù)類名進行雙親委派模型進行類加載并返回類對象。
- defineClass:表示根據(jù)類的字節(jié)碼轉(zhuǎn)換為類對象斑举。
-
自定義類加載器需要繼承抽象類ClassLoader,實現(xiàn)findClass方法浮庐,該方法會在lodClass調(diào)用的時候被調(diào)用,findClass默認會拋出異常柬焕。
驗證(驗證數(shù)信息是否符合JVM規(guī)范搅轿,是否是一個有效的字節(jié)碼文件)
- 驗證內(nèi)容:
類數(shù)據(jù)信息的格式驗證,語義分析懂昂,操作驗證
等介时。- 格式驗證:
驗證是否符合class文件規(guī)范
- 語義驗證:
檢查一個被標記為final的類型是否包含子類;檢查一個類中的final方法視頻被子類進行重寫凌彬;確保父類和子類之間沒有不兼容的一些方法聲明(比如方法簽名相同沸柔,但方法的返回值不同)
- 操作驗證:
在操作數(shù)棧中的數(shù)據(jù)必須進行正確的操作,對常量池中的各種符號引用執(zhí)行驗證(通常在解析階段執(zhí)行铲敛,檢查是否通過富豪引用中描述的全局定名定位到指定類型上褐澎,以及類成員信息的訪問修飾符)
- 格式驗證:
準備(為類追蹤的所有靜態(tài)變量分配內(nèi)存空間,并為其設置一個初始值(由于還沒產(chǎn)生對象伐蒋,實例變量不在此操作范圍內(nèi)))
- 被final修飾的靜態(tài)變量工三,會直接賦予原值。
- 類字段的字段屬性表中存在ConstantValue屬性先鱼,則在準備階段俭正,其值就是ConstantValue的值。
解析(將常量池中的符號引用轉(zhuǎn)為直接引用(得到類或者字段焙畔,方法在內(nèi)存中的指針或者偏移量掸读,一遍直接調(diào)用該方法,這個可以在初始化之后再執(zhí)行))
- 可以認為是一些靜態(tài)綁定的會被解析,動態(tài)綁定則只會在運行時進行解析儿惫。
- 靜態(tài)綁定包括一些final方法(不可重寫)澡罚,static方法(只屬于當前類),構(gòu)造器(不會被重寫)
初始化(將一個類中所有被static關鍵字表示得代碼統(tǒng)一執(zhí)行一遍)
- 如果執(zhí)行得是靜態(tài)變量肾请,那么就會使用用戶指定得值覆蓋之前在準備階段設置得初始值
- 如果執(zhí)行得是static代碼塊留搔,那么在初始化階段,JVM就會執(zhí)行static代碼塊中定義的所有操作铛铁。
- 所有類變量初始化語句和靜態(tài)代碼塊都會在編譯時被前端編譯器放在收集器里頭隔显,存放到一個特殊的方法中,這個方法就是<clinit>方法避归,即類/接口初始化方法荣月。該方法的作用就是初始化一個中的變量,使用用戶指定的值覆蓋之前在準備階段里設定的初始值梳毙,任何invoke之類的字節(jié)碼都無法調(diào)用<clinit>方法哺窄,由JVM負責保證一個類的<clinit>方法執(zhí)行之前,它的父類<clinit>方法已經(jīng)被執(zhí)行账锹。
- JVM必須確保一個類在初始化的過程中萌业,如果多線程需要同時初始化它,僅僅只能允許其中一個線程對其執(zhí)行操作奸柬,其余線程必須等待生年,只有在活動線程執(zhí)行完對類的初始化操作之后,菜會通知正在等待的其他線程廓奕。
Java運行時數(shù)據(jù)區(qū)結(jié)構(gòu)
- (A)PC寄存器/程序計數(shù)器(每個線程有一個獨立的程序計數(shù)器抱婉,且互不影響,獨立儲存)
- (a)保存當前正在執(zhí)行的程序的內(nèi)存地址桌粉。
- (B)Java棧 Java Stack(每條線程對應一個棧蒸绩,一個棧中對應多個棧幀,執(zhí)行一個方法壓入一個棧幀铃肯,結(jié)束一個方法出一個棧幀)
- ![](https://upload-images.jianshu.io/upload_images/14037200-6f9066f05140f0ef.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- (a)棧幀是每個方法關聯(lián)起來的患亿,每運行一個方法就創(chuàng)建一個棧幀,每個棧幀會含有一些局部變量押逼,每當一個方法執(zhí)行完成時步藕,該棧幀就會彈出這個棧幀的元素作為這個方法的返回值,并清除這個棧幀挑格。
- (b)Java棧頂?shù)臈褪钱斍皥?zhí)行的活動棧咙冗,也就是正在執(zhí)行的方法,`PC寄存器會指向該地址`漂彤。
- (c)棧幀的結(jié)構(gòu):`局部變量表雾消,操作數(shù)棧瞬逊,動態(tài)連接方法,返回的地址`
- (C)堆 Heap(堆時JVM所管理的內(nèi)存中最大的一塊仪或,被所有的Java線程鎖共享,不是線程安全的士骤,在JVM啟動時創(chuàng)建)
- (a)所有對象實例以及數(shù)組都要在堆上分配范删。
- (b)Java堆時GC管理的主要區(qū)域,現(xiàn)在GC基本都采用`分代收集算法`拷肌,所有堆還可以細分為:`新生代和老年代`新生代再細致一點有`Eden空間到旦,F(xiàn)rom Survivor空間,To Survivor空間`等巨缘。
- (D)方法區(qū)Method Area(方法區(qū)存放了要加載類的信息(名稱添忘,修飾符等)類中定義為靜態(tài)常量,類中的Field信息若锁,類中的方法信息搁骑,`方法區(qū)是被Java線程共享的`)
- (a)方法區(qū)數(shù)據(jù)雖然時被線程共享,但是不會像Java堆一樣被GC頻繁回收又固,它儲存的信息相對比較穩(wěn)定仲器,再一定條件下會被GC
- (E)常量池Constant Pool(`常量池本身是方法區(qū)的一個數(shù)據(jù)結(jié)構(gòu)。`)
- (a)常量池中儲存了如字符串仰冠,final變量值乏冀,類名和方法名變量值。常量池在編譯期間就被確定洋只,并保存在已編譯的辆沦。class文件中。
- (F)本地方法棧Native Method Stack(本地方法棧和Java棧所發(fā)揮的作用非常相似识虚,區(qū)別不過是Java棧為JVM執(zhí)行Java方法服務肢扯,而本地方法棧為JVM執(zhí)行Native方法服務。本地方法棧也會拋出StackOverflowError和OutOfMemoryError異常舷礼。)
??Hadoop
區(qū)分hdfs hbase hive 區(qū)別以及應用場景
Hive
Hive在Hadoop中扮演數(shù)據(jù)倉庫的角色鹃彻。建立在Hadoop集群的最頂層,對存儲在Hadoop群上的數(shù)據(jù)提供類SQL的接口進行操作妻献。你可以用HiveQL進行selelct蛛株,join等等操作。
特點:支持SQL查詢
注意:Hive現(xiàn)在適合再離線下進行數(shù)據(jù)操作育拨,不使用于在線查詢谨履,因為一個字“慢”
適用場景:不想用程序語言開發(fā)MapReduce的朋友們,熟悉SQL的朋友可以使用Hive開離線進行數(shù)據(jù)處理分析工作熬丧。如果你有數(shù)據(jù)倉庫的需求并且你擅長寫SQL并且不想寫MapReduce jobs就可以用Hive代替笋粟。
HBase
HBase是一個數(shù)據(jù)庫,一個NoSql數(shù)據(jù)庫,像其他數(shù)據(jù)庫一樣提供隨即讀寫功能害捕,Hadoop不能滿足于實時需要绿淋,HBase正可以滿足。
特點:即時讀寫
適用場景:需要實時訪問一些數(shù)據(jù)尝盼,就可以把它存入HBase吞滞,你也可以用Hadoop作為靜態(tài)數(shù)據(jù)倉庫,HBase作為數(shù)據(jù)存儲盾沫,放那些進行一些操作會改變的數(shù)據(jù)茶凳。
問題:
什么情況下應用HBase?
- 1.成熟的數(shù)據(jù)分析主題唉匾,查詢模式已經(jīng)確立,并且不會輕易改變。
- 2.傳統(tǒng)的關系型數(shù)據(jù)庫已經(jīng)無法承受負荷灶伊,高速插入减响,大量存取覆积。
- 3.適合海量的共缕,但同時也是簡單的操作(例如 key-value)。
官方解釋
Use Apache HBase? when you need random, realtime read/write access to your Big Data. This project's goal is the hosting of very large tables -- billions of rows X millions of columns -- atop clusters of commodity hardware. Apache HBase is an open-source, distributed, versioned, non-relational database modeled after Google's Bigtable: A Distributed Storage System for Structured Data by Chang et al. Just as Bigtable leverages the distributed data storage provided by the Google File System, Apache HBase provides Bigtable-like capabilities on top of Hadoop and HDFS.
Pig VS Hive
Hive更適合于數(shù)據(jù)倉庫的任務谭确,Hive主要用于靜態(tài)的結(jié)構(gòu)以及需要經(jīng)常分析的工作掀潮,Hive于SQL相似促使其成為Hadoop與其他BI工具結(jié)合的理想交集。
Pig賦予開發(fā)人員在大數(shù)據(jù)集領域更多的靈活性琼富,并允許開發(fā)簡介的腳本用于轉(zhuǎn)換數(shù)據(jù)流以便潛入到較大的應用程序仪吧。
Pig相比Hive輕量,它主要的優(yōu)勢時相比于直接使用Hadoop Java APIs可大幅削減代碼量鞠眉。正因如此薯鼠,Pig仍然是吸引大量的軟件開發(fā)人員。
Hive和Pig都可以與HBase組合使用械蹋,Hive和Pig還為HBase提供了高層語言支持出皇,使得在HBase上進行數(shù)據(jù)統(tǒng)計處理變的非常簡單。
Hive VS HBase
Hive 是建立在Hadoop之上為了減少MapReduce jobs編寫工作的批處理程序,HBases是為了支持彌補Hadoop對實時操作的缺陷彌補的項目哗戈。
想象你在操作RMDB數(shù)據(jù)庫郊艘,如果是全表掃描,就用Hive+Hadoop唯咬,如果索引訪問纱注,就用HBase+Hadoop。
Hive query就是MapReduce jobs 可以從5分鐘到數(shù)小時不止胆胰,HBase是非常高效的狞贱,肯定比Hive高效的多。
JDBC
未完待續(xù)~
文中有錯誤希望大家在評論區(qū)指出蜀涨,謝謝~~~~~~~~~