-------------------- 本文介紹hadoop/hbase的開發環境搭建
hadoop介紹
Hadoop框架中最核心的設計就是:MapReduce和HDFS。MapReduce的思想是由Google的一篇論文所提及而被廣爲流傳的,簡單的一句話解釋MapReduce就是“任務的分解與結果的彙總”。HDFS是Hadoop分佈式文件系統(Hadoop Distributed File System)的縮寫,爲分佈式計算存儲提供了底層支持。
hdfs 分佈式文件系統
圖1 hdfs分佈式文件系統結構
從上圖可以看到hdfs這個分佈式文件系統;由一個namenode作爲索引,存放每個數據節點(DataNode)上存放的數據塊(blocks)的索引;DataNode心跳向namenode報告自己存放的blocks的索引;hadoop通過在DataNode節點間複製備份多份數據來保證一個節點掛掉後,提供了很高的可用性;默認配置複製的塊數爲3;即在自己DataNode上一份,在相同機架上另一個DataNode上一份,在不同機架上的一個DataNode上一份; NameNode保存一份block都在那幾個DataNode上的索引數據;
任務分派:
圖2 :hadoop 的並行任務結構
從上圖看出:hadoop的並行任務通過JobTracker來統一管理所有節點上的TaskTracker; JobTracker來負責調度,負載均衡健康檢查,監控各個任務的執行情況;jobtracker 心跳向taskTracker彙報任務運行情況;
Map/Reduce
任務運行時:本地DataNode上的數據根據Key爲簇,依次輸入map程序進行運算;運算結果經過排序合併輸入reducer程序進行彙總計算操作;
爲什麼使用hadoop
官方網站已經給了很多的說明,這裏就大致說一下其優點及使用的場景(沒有不好的工具,只用不適用的工具,因此選擇好場景才能夠真正發揮分佈式計算的作用):
- 可擴展:不論是存儲的可擴展還是計算的可擴展都是Hadoop的設計根本。
- 經濟:框架可以運行在任何普通的PC上。
- 可靠:分佈式文件系統的備份恢復機制以及MapReduce的任務監控保證了分佈式處理的可靠性。
- 高效:分佈式文件系統的高效數據交互實現以及MapReduce結合Local Data處理的模式,爲高效處理海量的信息作了基礎準備。
使用場景:個人覺得最適合的就是海量數據的分析,其實Google最早提出MapReduce也就是爲了海量數據分析。同時HDFS最早是爲了搜索引擎實現而開發的,後來才被用於分佈式計算框架中。海量數據被分割於多個節點,然後由每一個節點並行計算,將得出的結果歸併到輸出。同時第一階段的輸出又可以作爲下一階段計算的輸入,因此可以想象到一個樹狀結構的分佈式計算圖,在不同階段都有不同產出,同時並行和串行結合的計算也可以很好地在分佈式集羣的資源下得以高效的處理。
hadoop/hbase搭建(開發環境我們只搭建一個虛擬並行平臺:單臺機器運行)
下載hadoop: http://hadoop.apache.org/ ; 下載,解壓;
下載hbase:http://hbase.apache.org/ 下載;解壓;
配置hadoop: 在hadoop/conf下
配置hadoop-env.sh
新增環境變量:
export JAVA_HOME=/usr/java
export HADOOP_HOME=/home/zhaopeng/workspace/software/hadoop-0.20.2
export PATH=$PATH:$HADOOP_HOME/bin
配置hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
配置core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop/hadoop-${user.name}</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
配置hbase:(hbase/conf)
hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
<description>The directory shared by region servers.
</description>
</property>
</configuration>
並將hbase/lib/hbase-0.20.6.jar和zookeeper-3.2.2.jar 和 conf/hbase-default.xml和conf/hbase-site.xml都複製到hadoop/conf下;(因爲任務運行默認加載conf/下的文件到classpath)
運行hadoop/hbase:
1. hadoop/bin/hadoop namenode -format
2. hadoop/bin/start-all.sh
3.hbase/bin/start-hbase.sh
hadoop常用命令
hadoop dfs -ls :查看hdfs文件系統文件列表
hadoop dfs -cat output/* :查看output目錄下所有文件內容
hadoop job -list :列出所有正在執行的任務信息
hadoop job -status jobid :列出jobid這個任務的詳細信息;
hadoop jar taskClassName : 執行一個任務;
hadoop dfs -du :查看hdfs的文件大小;
hadoop job -kill jobid :殺掉一個job;
hbase常用命令
hbase shell :打開hbase 數據庫的shell客戶端
list :查看所有表
create 'tableName','columnName1','columenName3' :新建表;並新建2個column
put 'tableName','rowId','columnName1:1','value1' :在表裏插入一條記錄
scan 'tableName; 全表select
get 'tableName','rowId' :查找指定rowId的記錄
hadoop/hbase 程序
- public class OfferMapper extends TableMapper<Text, IntWritable> {
- private final static IntWritable one = new IntWritable(1);
- private Text word = new Text();
- /**
- * rowkey,value,context
- */
- public void map(ImmutableBytesWritable key, Result value, Context context) throws IOException,
- InterruptedException {
- String titleValue = Bytes.toString(value.getValue(Bytes.toBytes("title"), null));
- for(KeyValue kv : value.list()){
- System.out.println(kv.getValue().toString());
- word.set(kv.getValue());
- context.write(word, one);
- }
- }
- }
- public class OfferReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
- private IntWritable result = new IntWritable();
- public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException,
- InterruptedException {
- int sum = 0;
- for (IntWritable val : values) {
- sum += val.get();
- }
- result.set(sum);
- context.write(key, result);
- }
- }
- public class OfferTask {
- final static String NAME = "OfferTask";
- /**
- * Sets up the actual job.
- *
- * @param conf The current configuration.
- * @param args The command line parameters.
- * @return The newly created job.
- * @throws IOException When setting up the job fails.
- */
- public static Job createSubmittableJob(Configuration conf, String[] args) throws IOException {
- String tableName = args[0];
- // Path inputDir = new Path(args[1]);
- Job job = new Job(conf, NAME + "_" + tableName);
- job.setJarByClass(OfferTask.class);
- Scan myScan = new Scan();
- TableMapReduceUtil.initTableMapperJob(tableName, myScan, OfferMapper.class, Text.class,
- IntWritable.class, job);
- TableMapReduceUtil.initTableReducerJob(tableName, OfferReducer.class, job);
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(IntWritable.class);
- FileOutputFormat.setOutputPath(job, new Path(args[1]));
- return job;
- }
- /**
- * @param args
- */
- public static void main(String[] args) throws Exception {
- Configuration conf = new Configuration();
- String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
- if (otherArgs.length != 2) {
- System.err.println("Usage: OfferTask <tableName> <out>");
- System.exit(2);
- }
- Job job = createSubmittableJob(conf, otherArgs);
- System.exit(job.waitForCompletion(true) ? 0 : 1);
- }