Taiwan Hadoop Forum

台灣 Hadoop 技術討論區
現在的時間是 2022-07-03, 20:04

所有顯示的時間為 UTC + 8 小時




發表新文章 回覆主題  [ 4 篇文章 ] 
發表人 內容
 文章主題 : hive是如何實現將查詢后的結果輸出到stdout上的?
文章發表於 : 2013-12-12, 11:00 
離線

註冊時間: 2013-12-05, 10:05
文章: 8
我們都知道,Mapreduce執行后的結果會輸出到HDFS上去,但是Hive執行SQL查詢后其結果可以輸出到STDOUT,hive是怎麼實現的呢?大牛幫小弟解釋一下哦!!


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: hive是如何實現將查詢后的結果輸出到stdout上的?
文章發表於 : 2013-12-12, 11:24 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
trageman 寫:
我們都知道,Mapreduce執行后的結果會輸出到HDFS上去,但是Hive執行SQL查詢后其結果可以輸出到STDOUT,hive是怎麼實現的呢?大牛幫小弟解釋一下哦!!


跟前面的討論一樣,Hive 的 Shell 是一隻 Java 程式,它會先將 HiveQL 經過 Execution Plan 轉換成 MapReduce Code,
提交 MapReduce Job,計算完的結果存放於 HDFS。相信它是將算完的結果透過將 HDFS 的輸出傾印到 STDOUT,一如前面討論過的類似在 main 中跑 hadoop fs -cat 一樣。

若有興趣,這裡告知程式碼的進入點是 org.apache.hadoop.hive.cli.CliDriver
代碼:
exec /usr/lib/hadoop/bin/hadoop jar /usr/lib/hive/lib/hive_cli.jar org.apache.hadoop.hive.cli.CliDriver

可以看原始碼 CliDriver.java 怎麼寫。
http://grepcode.com/file/repository.cloudera.com/content/repositories/releases/org.apache.hadoop.hive/hive-cli/0.7.1-cdh3u1/org/apache/hadoop/hive/cli/CliDriver.java

代碼:
## 將 STDOUT 接到 PrintStream 物件 ss.out
434      ss.out = new PrintStream(System.out, true, "UTF-8");
## 產生 PrintStream Reference out 指向 ss.out 物件
157      PrintStream out = ss.out;
## 透過 client 提交 HiveQL 查詢,結果放在 results 的 List<String> 物件
161          client.execute(cmd_trimmed);
162          List<String> results;
163          do {
164            results = client.fetchN(LINES_TO_FETCH);
165            for (String line: results) {
166              out.println(line);
167            }
168          } while (results.size() == LINES_TO_FETCH);


- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: hive是如何實現將查詢后的結果輸出到stdout上的?
文章發表於 : 2013-12-12, 13:14 
離線

註冊時間: 2013-12-05, 10:05
文章: 8
jazz 寫:

跟前面的討論一樣,Hive 的 Shell 是一隻 Java 程式,它會先將 HiveQL 經過 Execution Plan 轉換成 MapReduce Code,
提交 MapReduce Job,計算完的結果存放於 HDFS。相信它是將算完的結果透過將 HDFS 的輸出傾印到 STDOUT,一如前面討論過的類似在 main 中跑 hadoop fs -cat 一樣。

若有興趣,這裡告知程式碼的進入點是 org.apache.hadoop.hive.cli.CliDriver
代碼:
exec /usr/lib/hadoop/bin/hadoop jar /usr/lib/hive/lib/hive_cli.jar org.apache.hadoop.hive.cli.CliDriver

可以看原始碼 CliDriver.java 怎麼寫。
http://grepcode.com/file/repository.cloudera.com/content/repositories/releases/org.apache.hadoop.hive/hive-cli/0.7.1-cdh3u1/org/apache/hadoop/hive/cli/CliDriver.java

代碼:
## 將 STDOUT 接到 PrintStream 物件 ss.out
434      ss.out = new PrintStream(System.out, true, "UTF-8");
## 產生 PrintStream Reference out 指向 ss.out 物件
157      PrintStream out = ss.out;
## 透過 client 提交 HiveQL 查詢,結果放在 results 的 List<String> 物件
161          client.execute(cmd_trimmed);
162          List<String> results;
163          do {
164            results = client.fetchN(LINES_TO_FETCH);
165            for (String line: results) {
166              out.println(line);
167            }
168          } while (results.size() == LINES_TO_FETCH);


- Jazz


有個疑問,假設文件file1分佈在node1、node2、node3上,那麼在mypc上執行hadoop fs -cat file1后是如何實現將node1、node2、node3的stdout重定向到mypc上的stdout上的呢?


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: hive是如何實現將查詢后的結果輸出到stdout上的?
文章發表於 : 2013-12-12, 17:05 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
trageman 寫:
有個疑問,假設文件file1分佈在node1、node2、node3上,那麼在mypc上執行hadoop fs -cat file1后是如何實現將node1、node2、node3的stdout重定向到mypc上的stdout上的呢?


它並沒有在處理 node1~node3 的 STDOUT,它處理的是從 HDFS DataNode 讀取 block,然後印到 mypc 的 STDOUT

- Jazz


回頂端
 個人資料 E-mail  
 
顯示文章 :  排序  
發表新文章 回覆主題  [ 4 篇文章 ] 

所有顯示的時間為 UTC + 8 小時


誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 3 位訪客


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
正體中文語系由 竹貓星球 維護製作