分享

CDH3实战Hadoop(HDFS) , HBase , Zookeeper , Flume , Hive

本帖最后由 nettman 于 2014-2-5 20:14 编辑

Hadoop集群实践之 (0) 完整架构设计 [Hadoop(HDFS) , HBase , Zookeeper , Flume , Hive ]
本文内容
Hadoop集群实践之(0) 完整架构设计[Hadoop(HDFS),HBase,Zookeeper,Flume,Hive]
在进入新的环境以后,面临一项非常重要的工作“线上的Hadoop集群的运维”,而对于Hadoop我之前仅仅是耳闻,并没有实际的部署和应用过。
因此,在整个学习过程中参阅了很多的资料,经历了从对整个架构的不了解,各种概念的不熟悉到最后成功的在本地搭建好了整个集群并能够成功调用集群来执行并行计算的任务。
可谓受益良多,本着开源分享的精神,我将整个学习的过程整理成一个系列的文档,分享给大家。
下面进入正文
有一种说法我觉得非常有道理,那就是:“搞什么东西之前,第一步是要知道What(是什么),然后是Why(为什么),最后才是How(怎么做)。如果习惯先How,然后What,最后才是Why,只会让自己变得浮躁,同时往往会将技术误用于不适合的场景。”
因此,首先应该明确的就是:什么是Hadoop?
Hadoop是Apache开源组织的一个分布式计算开源框架,目前在Amazon,Facebook和Yahoo等大型网站上都已经得到了应用。
Hadoop框架中最核心的设计就是:MapReduce和HDFS。
MapReduce的思想是由Google的一篇论文所提及而被广为流传的,简单的一句话解释就是“任务的分解与结果的汇总”。
分布式计算就好比蚂蚁吃大象,廉价的机器群可以匹敌任何高性能的计算机,纵向扩展始终抵不过横向扩展。
HDFS是Hadoop分布式文件系统(HadoopDistributed File System)的缩写,为分布式计算存储提供了底层支持。
在实际的应用场景中,Hadoop并非单独出现的,它还有着众多的子项目,而应用最多的子项目就是HBase,Zookeeper,Hive。
另外,Flume也经常在整个Hadoop集群中担任重要的角色。
简单的描述一下这些系统:
HBase - Key/Value的分布式数据库
Zookeeper - 支撑分布式应用的协作系统
Hive - SQL解析引擎
Flume - 分布式的日志收集系统
下面这张图可以更好的阐述它们之间的关系:

1.png

在上面的图中,我们通过跟踪整个数据流的逻辑对每个服务器实现的功能和角色进行了描述。
总的说来就是一次通过采集原始Log文件,然后对Log文件进行分析计算,最后将结果进行存储并展现的过程。
需要介绍一点背景的是,因为是在虚拟机上搭建测试环境(条件有限),因此很多在实际场景中一般都应该分开在不同机器上部署的系统,都部署在了一起。
具体环境如下
OS: Ubuntu 10.10 Server 64-bit //选择Ubuntu是因为Cloudera的Hadoop集群套件对Ubuntu支持的很好
Servers:
hadoop-master:10.6.1.150
- namenode,jobtracker;hbase-master,hbase-thrift;
- secondarynamenode;
- hive-master,hive-metastore;
- zookeeper-server;
- flume-master
- flume-node
- datanode,taskTracker
hadoop-node-1:10.6.1.151
- datanode,taskTracker;hbase-regionServer;
- zookeeper-server;
- flume-node
hadoop-node-2:10.6.1.152
- dataNode,taskTracker;hbase-regionServer;
- zookeeper-server;
- flume-node
以上描述了三台机器各自的角色,通过 “-” 表示的每一行的几个角色都表示一般情况下是一起部署到独立的服务器上的。
下面,就让我们开始整个实战演练过程。

Hadoop集群实践之 (1) Hadoop(HDFS)搭建
本文内容
Hadoop集群实践之(1) Hadoop(HDFS)搭建
参考资料
http://www.infoq.com/cn/articles/hadoop-intro
http://www.infoq.com/cn/articles/hadoop-config-tip
http://www.infoq.com/cn/articles/hadoop-process-develop
http://www.docin.com/p-238056369.html
安装配置Hadoop(HDFS)
环境准备
OS: Ubuntu 10.10 Server 64-bit
Servers:
hadoop-master:10.6.1.150 内存1024M
- namenode,jobtracker;
- secondarynamenode;
- datanode,taskTracker
hadoop-node-1:10.6.1.151内存640M
- datanode,taskTracker;
hadoop-node-2:10.6.1.152内存640M
- dataNode,taskTracker;
对以上角色做一些简单的介绍:
namenode - 整个HDFS的命名空间管理服务
secondarynamenode - 可以看做是namenode的冗余服务
jobtracker - 并行计算的job管理服务
datanode - HDFS的节点服务
tasktracker - 并行计算的job执行服务
本文定义的规范,避免在配置多台服务器上产生理解上的混乱:
所有直接以 $ 开头,没有跟随主机名的命令,都代表需要在所有的服务器上执行,除非后面有单独的//开头的说明。
1.选择最好的安装包
为了更方便和更规范的部署Hadoop集群,我们采用Cloudera的集成包。
因为Cloudera对Hadoop相关的系统做了很多优化,避免了很多因各个系统间版本不符产生的很多Bug。
这也是很多资深Hadoop管理员所推荐的。
https://ccp.cloudera.com/display/DOC/Documentation//

2.安装Java环境
由于整个Hadoop项目主要是通过Java开发完成的,因此需要JVM的支持。
添加匹配的Java版本的APT源
$ sudo apt-get install python-software-properties
$ sudo vim/etc/apt/sources.list.d/sun-java-community-team-sun-java6-maverick.list

  1. deb http://ppa.launchpad.net/sun-java-community-team/sun-java6/ubuntu maverick main
  2. deb-src http://ppa.launchpad.net/sun-java-community-team/sun-java6/ubuntu maverick main
复制代码
安装sun-java6-jdk
$ sudo add-apt-repository ppa:sun-java-community-team/sun-java6
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk
3. 配置Cloudera的Hadoop安装源
$ sudo vim /etc/apt/sources.list.d/cloudera.list
  1. deb http://archive.cloudera.com/debian maverick-cdh3u3 contrib
  2. deb-src http://archive.cloudera.com/debian maverick-cdh3u3 contrib
复制代码
$sudo apt-get install curl
$ curl -s http://archive.cloudera.com/debian/archive.key | sudo apt-key add -
$ sudo apt-get update
4.安装Hadoop相关套件
$ sudo apt-get install hadoop-0.20-namenode //仅在hadoop-master上安装
$ sudo apt-get install hadoop-0.20-datanode
$ sudo apt-get install hadoop-0.20-secondarynamenode //仅在hadoop-master上安装
$ sudo apt-get install hadoop-0.20-jobtracker //仅在hadoop-master上安装
$ sudo apt-get install hadoop-0.20-tasktracker
5.创建Hadoop配置文件
$ sudo cp -r /etc/hadoop-0.20/conf.empty /etc/hadoop-0.20/conf.my_cluster
6.激活新的配置文件
$ sudo update-alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf/etc/hadoop-0.20/conf.my_cluster 50
这里的50是优先级别
查询当前配置的选择
$ sudo update-alternatives --display hadoop-0.20-conf

  1. hadoop-0.20-conf - auto mode
  2. link currently points to /etc/hadoop-0.20/conf.my_cluster
  3. /etc/hadoop-0.20/conf.empty - priority 10
  4. /etc/hadoop-0.20/conf.my_cluster - priority 50
  5. /etc/hadoop-0.20/conf.pseudo - priority 30
  6. Current 'best' version is '/etc/hadoop-0.20/conf.my_cluster'.
复制代码
结果说明my_cluster的优先级别最高,即'best'。
7.添加hosts记录并修改对应的主机名,以hadoop-master为例
$ sudo vim /etc/hosts

  1. 10.6.1.150 hadoop-master
  2. 10.6.1.150 hadoop-secondary
  3. 10.6.1.151 hadoop-node-1
  4. 10.6.1.152 hadoop-node-2
复制代码
$ sudo vim /etc/hostname
1        hadoop-master
$ sudo hostname hadoop-master
8. 设置服务器间的SSH密钥认证
dongguo@hadoop-master:~$ ssh-keygen -t rsa
  1. Generating public/private rsa key pair.
  2. Enter file in which to save the key (/home/dongguo/.ssh/id_rsa):
  3. Created directory '/home/dongguo/.ssh'.
  4. Enter passphrase (empty for no passphrase):
  5. Enter same passphrase again:
复制代码
dongguo@hadoop-master:~$ cd /home/dongguo/.ssh
dongguo@hadoop-master:~$ cp id_rsa.pub authorized_keys
dongguo@hadoop-master:~$ chmod 600 authorized_keys
建立与hadoop-node-1和hadoop-node-2的信任关系,实现SSH免密码登陆
dongguo@hadoop-master:~$ sudo ssh-copy-id /home/dongguo/.ssh/id_rsa.pub dongguo@10.6.1.151
dongguo@hadoop-master:~$ sudo ssh-copy-id /home/dongguo/.ssh/id_rsa.pub dongguo@10.6.1.152
9. 配置hadoop/conf下的文件
$ sudo vim /etc/hadoop/conf/hadoop-env.sh
1        export JAVA_HOME="/usr/lib/jvm/java-6-sun"
$ sudo vim /etc/hadoop/conf/masters
1        hadoop-master
$ sudo vim /etc/hadoop/conf/slaves
1        hadoop-node-1
2        hadoop-node-2
10. 创建hadoop的HDFS目录
$ sudo mkdir -p /data/storage
$ sudo mkdir -p /data/hdfs
$ sudo chmod 700 /data/hdfs
$ sudo chown -R hdfs:hadoop /data/hdfs
$ sudo chmod 777 /data/storage
$ sudo chmod o+t /data/storage
11. 配置core-site.xml - Hadoop
$ sudo vim /etc/hadoop/conf/core-site.xml
  1. <?xml version="1.0"?>
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  3. <configuration>
  4. <!--- global properties -->
  5. <property>
  6.    <name>hadoop.tmp.dir</name>
  7.    <value>/data/storage</value>
  8.    <description>A directory for other temporary directories.</description>
  9. </property>
  10. <!-- file system properties -->
  11. <property>
  12.    <name>fs.default.name</name>
  13.    <value>hdfs://hadoop-master:8020</value>
  14. </property>
  15. </configuration>
复制代码
hadoop.tmp.dir指定了所有上传到Hadoop的文件的存放目录,所以要确保这个目录是足够大的。
fs.default.name指定NameNode的地址和端口号。
12. 配置hdfs-site.xml - HDFS
$ sudo vim /etc/hadoop/conf/hdfs-site.xml
  1. <?xml version="1.0"?>
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  3. <configuration>
  4. <property>
  5.    <name>dfs.name.dir</name>
  6.    <value>${hadoop.tmp.dir}/dfs/name</value>
  7. </property>
  8. <property>
  9.    <name>dfs.data.dir</name>
  10.    <value>/data/hdfs</value>
  11. </property>
  12. <property>
  13.    <name>dfs.replication</name>
  14.    <value>2</value>
  15. </property>
  16. <property>
  17.    <name>dfs.datanode.max.xcievers</name>
  18.    <value>4096</value>
  19. </property>
  20. <property>
  21.    <name>fs.checkpoint.period</name>
  22.    <value>300</value>
  23. </property>
  24. <property>
  25.    <name>fs.checkpoint.dir</name>
  26.    <value>${hadoop.tmp.dir}/dfs/namesecondary</value>
  27. </property>
  28. <property>
  29.    <name>dfs.namenode.secondary.http-address</name>
  30.    <value>hadoop-secondary:50090</value>
  31. </property>
  32. </configuration>
复制代码
dfs.data.dir指定数据节点存放数据的位置。
dfs.replication指定每个Block需要备份的次数,起到冗余备份的作用,值必须小于DataNode的数目,否则会出错。
dfs.datanode.max.xcievers指定了HDFSDatanode同时处理文件的上限。
13.配置mapred-site.xml- MapReduce
$ sudo vim /etc/hadoop/conf/mapred-site.xml

  1. <?xml version="1.0"?>
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  3. <configuration>
  4. <property>
  5.    <name>mapred.job.tracker</name>
  6.    <value>hdfs://hadoop-master:8021</value>
  7. </property>
  8. <property>
  9.    <name>mapred.system.dir</name>
  10.    <value>/mapred/system</value>
  11. </property>
  12. <property>
  13.    <name>mapreduce.jobtracker.staging.root.dir</name>
  14.    <value>/user</value>
  15. </property>
  16. </configuration>
复制代码
mapred.job.tracker定位jobtracker的地址和端口。
mapred.system.dir定位存放在HDFS中的目录。
注:以上配置需要在所有的服务器上进行,鉴于配置内容完全一致,可以在一台服务器上配置完成以后,将整个/etc/hadoop-0.20目录覆盖到其它服务器上。
14.格式化HDFS分布式文件系统
dongguo@hadoop-master:~$ sudo -u hdfs hadoop namenode -format

  1. 12/10/07 21:52:48 INFO namenode.NameNode: STARTUP_MSG:
  2. /************************************************************
  3. STARTUP_MSG: Starting NameNode
  4. STARTUP_MSG:   host = hadoop-master/10.6.1.150
  5. STARTUP_MSG:   args = [-format]
  6. STARTUP_MSG:   version = 0.20.2-cdh3u3
复制代码
15.启动Hadoop进程
在hadoop-master上启动datanode,namenode,secondarynamenode,jobtracker
dongguo@hadoop-master:~$ sudo /etc/init.d/hadoop-0.20-datanode start
dongguo@hadoop-master:~$ sudo /etc/init.d/hadoop-0.20-namenode start
dongguo@hadoop-master:~$ sudo /etc/init.d/hadoop-0.20-jobtracker start
dongguo@hadoop-master:~$ sudo /etc/init.d/hadoop-0.20-secondarynamenode start
在hadoop-node上启动datanode,tasktracker,以hadoop-node-1为例
dongguo@hadoop-node-1:~$ sudo /etc/init.d/hadoop-0.20-datanode start
dongguo@hadoop-node-1:~$ sudo /etc/init.d/hadoop-0.20-tasktracker start
检查进程启动情况,以hadoop-master与hadoop-node-1为例
dongguo@hadoop-master:~$ sudo jps

  1. 12683 SecondaryNameNode
  2. 12716 Jps
  3. 9250 JobTracker
  4. 11736 DataNode
  5. 5816 NameNode
复制代码

dongguo@hadoop-node-1:~$sudo jps
  1. 4591 DataNode
  2. 7093 Jps
  3. 6853 TaskTracker
复制代码
16. 创建mapred.system.dir的HDFS目录
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -mkdir /mapred/system
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -chown mapred:hadoop /mapred/system
17. 测试对HDFS的相关操作
dongguo@hadoop-master:~$ echo "Hello Hadoop." > hello.txt
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -mkdir /dongguo
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -copyFromLocal hello.txt /dongguo
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -ls /dongguo
  1. Found 1 items
  2. -rw-r--r--   2 hdfs supergroup         33 2012-10-07 22:02 /dongguo/hello.txt
  3. hdfs@hadoop-master:~$ hadoop fs -cat /dongguo/hello.txt
  4. Hello Hadoop. echo Hello Hadoop.
复制代码
18.查看整个集群的状态
通过网页进行查看
http://10.6.1.150:50070
2.png
http://10.6.1.150:50030

3.png


通过命令进行查看
dongguo@hadoop-master:~$ sudo -u hdfs hadoop dfsadmin -report
  1. 12/10/07 23:22:01 INFO security.UserGroupInformation: JAAS Configuration already setup for Hadoop, not re-installing.
  2. Configured Capacity: 59858374656 (55.75 GB)
  3. Present Capacity: 53180121088 (49.53 GB)
  4. DFS Remaining: 53180010496 (49.53 GB)
  5. DFS Used: 110592 (108 KB)
  6. DFS Used%: 0%
  7. Under replicated blocks: 0
  8. Blocks with corrupt replicas: 0
  9. Missing blocks: 0
  10. -------------------------------------------------
  11. Datanodes available: 3 (3 total, 0 dead)
  12. Name: 10.6.1.152:50010
  13. Decommission Status : Normal
  14. Configured Capacity: 19952791552 (18.58 GB)
  15. DFS Used: 28672 (28 KB)
  16. Non DFS Used: 2221387776 (2.07 GB)
  17. DFS Remaining: 17731375104(16.51 GB)
  18. DFS Used%: 0%
  19. DFS Remaining%: 88.87%
  20. Last contact: Sun Oct 07 23:22:01 CST 2012
  21. Name: 10.6.1.151:50010
  22. Decommission Status : Normal
  23. Configured Capacity: 19952791552 (18.58 GB)
  24. DFS Used: 40960 (40 KB)
  25. Non DFS Used: 2221387776 (2.07 GB)
  26. DFS Remaining: 17731362816(16.51 GB)
  27. DFS Used%: 0%
  28. DFS Remaining%: 88.87%
  29. Last contact: Sun Oct 07 23:22:01 CST 2012
  30. Name: 10.6.1.150:50010
  31. Decommission Status : Normal
  32. Configured Capacity: 19952791552 (18.58 GB)
  33. DFS Used: 40960 (40 KB)
  34. Non DFS Used: 2235478016 (2.08 GB)
  35. DFS Remaining: 17717272576(16.5 GB)
  36. DFS Used%: 0%
  37. DFS Remaining%: 88.8%
  38. Last contact: Sun Oct 07 23:22:01 CST 2012
复制代码
至此,Hadoop(HDFS)的搭建就已经完成。
20.接着,我们可以开始以下过程:
Hadoop集群实践之 (2) HBase&Zookeeper搭建
本文内容
Hadoop集群实践之(2) HBase&Zookeeper搭建
参考资料
http://blog.csdn.net/hguisu/article/details/7244413
http://www.yankay.com/wp-content/hbase/book.html
http://blog.nosqlfan.com/html/3694.html
安装配置HBase&Zookeeper
环境准备
OS: Ubuntu 10.10 Server 64-bit
Servers:
hadoop-master:10.6.1.150 内存1024M
- namenode,jobtracker;hbase-master,hbase-thrift;
- secondarynamenode;
- zookeeper-server;
- datanode,taskTracker
hadoop-node-1:10.6.1.151内存640M
- datanode,taskTracker;hbase-regionServer;
- zookeeper-server;
hadoop-node-2:10.6.1.152内存640M
- datanode,taskTracker;hbase-regionServer;
- zookeeper-server;
对以上角色做一些简单的介绍:
namenode - 整个HDFS的命名空间管理服务
secondarynamenode - 可以看做是namenode的冗余服务
jobtracker - 并行计算的job管理服务
datanode - HDFS的节点服务
tasktracker - 并行计算的job执行服务
hbase-master - Hbase的管理服务
hbase-regionServer - 对Client端插入,删除,查询数据等提供服务
zookeeper-server - Zookeeper协作与配置管理服务
将HBase与Zookeeper的安装配置放在同一篇文章的原因是:
一个分布式运行的Hbase依赖一个zookeeper集群,所有的节点和客户端都必须能够访问zookeeper。
本文定义的规范,避免在配置多台服务器上产生理解上的混乱:
所有直接以 $ 开头,没有跟随主机名的命令,都代表需要在所有的服务器上执行,除非后面有单独的//开头的说明。
1.安装前的准备
已经完成了 Hadoop集群实践之 (1)Hadoop(HDFS)搭建
配置NTP时钟同步
dongguo@hadoop-master:~$ sudo /etc/init.d/ntp start
dongguo@hadoop-node-1:~$ sudo ntpdate hadoop-master
dongguo@hadoop-node-2:~$ sudo ntpdate hadoop-master
配置ulimit与nproc参数
$ sudo vim /etc/security/limits.conf
  1. hdfs        -   nofile      32768
  2. hbase       -   nofile      32768
  3. hdfs        soft    nproc       32000
  4. hdfs        hard    nproc       32000
  5. hbase       soft    nproc       32000
  6. hbase       hard    nproc       32000
复制代码
$ sudo vim/etc/pam.d/common-session
  1. session required    pam_limits.so
复制代码
退出并重新登录SSH使设置生效

2.hadoop-master上安装hbase-master
dongguo@hadoop-master:~$ sudo apt-get install hadoop-hbase-master
dongguo@hadoop-master:~$ sudo apt-get install hadoop-hbase-thrift
3.hadoop-node上安装hbase-regionserver
dongguo@hadoop-node-1:~$ sudo apt-get install hadoop-hbase-regionserver
dongguo@hadoop-node-2:~$ sudo apt-get install hadoop-hbase-regionserver
4.HDFS中创建HBase的目录
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -mkdir /hbase
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -chown hbase /hbase
5.配置hbase-env.sh
$ sudo vim /etc/hbase/conf/hbase-env.sh

  1. export JAVA_HOME="/usr/lib/jvm/java-6-sun"
  2. export HBASE_MANAGES_ZK=true
复制代码
6.配置hbase-site.xml
$ sudo vim /etc/hbase/conf/hbase-site.xml

  1. <?xml version="1.0"?>
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  3. <configuration>
  4. <property>
  5.    <name>hbase.rootdir</name>
  6.    <value>hdfs://hadoop-master:8020/hbase</value>
  7. </property>
  8. <property>
  9.    <name>hbase.cluster.distributed</name>
  10.    <value>true</value>
  11. </property>
  12. <property>
  13.    <name>hbase.zookeeper.quorum</name>
  14.    <value>hadoop-master,hadoop-node-1,hadoop-node-2</value>
  15. </property>
  16. </configuration>
复制代码
hbase.cluster.distributed指定了Hbase的运行模式。false是单机模式,true是分布式模式。
hbase.rootdir目录是regionserver的共享目录,用来持久化Hbase。
hbase.zookeeper.quorum是Zookeeper集群的地址列表,用逗号分割。
运行一个zookeeper也是可以的,但是在生产环境中,最好部署3,5,7个节点。
部署的越多,可靠性就越高,当然只能部署奇数个,偶数个是不可以的。
需要给每个zookeeper1G左右的内存,如果可能的话,最好有独立的磁盘确保zookeeper是高性能的。
如果你的集群负载很重,不要把Zookeeper和RegionServer运行在同一台机器上面,就像DataNodes和TaskTrackers一样。
7.配置regionservers
$ sudo vim /etc/hbase/conf/regionservers

  1. hadoop-node-1
  2. hadoop-node-2
复制代码
8.安装Zookeeper
$ sudo apt-get install hadoop-zookeeper-server
$ sudo vim/etc/zookeeper/zoo.cfg

  1. tickTime=2000
  2. initLimit=10
  3. syncLimit=5
  4. dataDir=/data/zookeeper
  5. clientPort=2181
  6. maxClientCnxns=0
  7. server.1=hadoop-master:2888:3888
  8. server.2=hadoop-node-1:2888:3888
  9. server.3=hadoop-node-2:2888:3888
复制代码
$sudo mkdir /data/zookeeper
$ sudo chown zookeeper:zookeeper /data/zookeeper
9.创建myid文件

1.dongguo@hadoop-master:~$ sudo -u zookeeper vim /data/zookeeper/myid

2.dongguo@hadoop-node-1:~$ sudo -u zookeeper vim /data/zookeeper/myid

3.dongguo@hadoop-node-2:~$ sudo -u zookeeper vim /data/zookeeper/myid




10.启动HbaseZookeeper服务
在hadoop-master上
dongguo@hadoop-master:~$ sudo /etc/init.d/hadoop-zookeeper-server start
dongguo@hadoop-master:~$ sudo /etc/init.d/hadoop-hbase-master start
dongguo@hadoop-master:~$ sudo /etc/init.d/hadoop-hbase-thrift start
在hadoop-node上
dongguo@hadoop-node-1:~$ sudo /etc/init.d/hadoop-zookeeper-server start
dongguo@hadoop-node-1:~$ sudo /etc/init.d/hadoop-hbase-regionserver start
dongguo@hadoop-node-2:~$ sudo /etc/init.d/hadoop-zookeeper-server start
dongguo@hadoop-node-2:~$ sudo /etc/init.d/hadoop-hbase-regionserver start

11.查看服务的状态在hadoop-node上
dongguo@hadoop-node-1:~$ sudo /etc/init.d/hadoop-zookeeper-server start
dongguo@hadoop-node-1:~$ sudo /etc/init.d/hadoop-hbase-regionserver start
dongguo@hadoop-node-2:~$ sudo /etc/init.d/hadoop-zookeeper-server start
dongguo@hadoop-node-2:~$ sudo /etc/init.d/hadoop-hbase-regionserver start
通过网页查看 http://10.6.1.150:60010

4.png
12.进行HBaseShell练习对HBase的操作
dongguo@hadoop-master:~$ hbase shell


13.通过zookeeper-clientZookeeper进行操作
dongguo@hadoop-master:~$ zookeeper-client

  1. [zk: localhost:2181(CONNECTED) 0] ls /
  2. [hbase, zookeeper]
  3. [zk: localhost:2181(CONNECTED) 1] ls /hbase
  4. [splitlog, unassigned, rs, root-region-server, table, master, shutdown]
  5. [zk: localhost:2181(CONNECTED) 2] get /hbase/rs
  6. cZxid = 0x100000004
  7. ctime = Mon Oct 08 19:31:27 CST 2012
  8. mZxid = 0x100000004
  9. mtime = Mon Oct 08 19:31:27 CST 2012
  10. pZxid = 0x10000001c
  11. cversion = 2
  12. dataVersion = 0
  13. aclVersion = 0
  14. ephemeralOwner = 0x0
  15. dataLength = 0
  16. numChildren = 2
  17. [zk: localhost:2181(CONNECTED) 4] get /hbase/master
  18. hadoop-master:60000
  19. cZxid = 0x100000007
  20. ctime = Mon Oct 08 19:31:27 CST 2012
  21. mZxid = 0x100000007
  22. mtime = Mon Oct 08 19:31:27 CST 2012
  23. pZxid = 0x100000007
  24. cversion = 0
  25. dataVersion = 0
  26. aclVersion = 0
  27. ephemeralOwner = 0x23a4021bcb60000
  28. dataLength = 19
  29. numChildren = 0
  30. . 至此,HBase&Zookeeper的搭建就已经完成。
  31. . 接着,我们可以开始以下过程:
复制代码
Hadoop集群实践之 (3) Flume搭建

本文内容
Hadoop集群实践之 (3) Flume搭建
参考资料
http://www.cnblogs.com/oubo/archive/2012/05/25/2517751.html
http://archive.cloudera.com/cdh/3/flume/UserGuide/
http://log.medcl.net/item/2012/03/flume-build-process/
http://blog.csdn.net/rzhzhz/article/details/7449767
https://blogs.apache.org/flume/entry/flume_ng_architecture
安装配置Flume
环境准备
OS: Ubuntu 10.10 Server 64-bit
Servers:
hadoop-master:10.6.1.150 内存1024M
- namenode,jobtracker;hbase-master,hbase-thrift;
- secondarynamenode;
- zookeeper-server;
- datanode,taskTracker
- flume-master
- flume-node
hadoop-node-1:10.6.1.151 内存640M
- datanode,taskTracker;hbase-regionServer;
- zookeeper-server;
- flume-node
hadoop-node-2:10.6.1.152 内存640M
- datanode,taskTracker;hbase-regionServer;
- zookeeper-server;
- flume-node
对以上角色做一些简单的介绍:
namenode - 整个HDFS的命名空间管理服务
secondarynamenode - 可以看做是namenode的冗余服务
jobtracker - 并行计算的job管理服务
datanode - HDFS的节点服务
tasktracker - 并行计算的job执行服务
hbase-master - Hbase的管理服务
hbase-regionServer - 对Client端插入,删除,查询数据等提供服务
zookeeper-server - Zookeeper协作与配置管理服务
flume-master - Flume的管理服务
flume-node - Flume的Agent与Collector服务,具体角色由flume-master决定
本文定义的规范,避免在配置多台服务器上产生理解上的混乱:
所有直接以 $ 开头,没有跟随主机名的命令,都代表需要在所有的服务器上执行,除非后面有单独的//开头的说明。
1. 安装前的准备
已经完成了 Hadoop集群实践之 (2) HBase&Zookeeper搭建
Flume分为三种角色:
Mater: master负责配置及通信管理,是集群的控制器。
Collector: collector用于对数据进行聚合,往往会产生一个更大的流,然后加载到storage中。
Agent: Agent用于采集数据,agent是flume中产生数据流的地方,同时,agent会将产生的数据流传输到collector。
Collector和Agent的配置数据必须指定Source(可以理解为数据入口)和Sink(可以理解为数据出口)。
常用的source:
text(“filename”):将文件filename作为数据源,按行发送
tail(“filename”):探测filename新产生的数据,按行发送出去
fsyslogTcp(5140):监听TCP的5140端口,并且接收到的数据发送出去
常用的sink:
console[("format")] :直接将将数据显示在桌面上
text(“txtfile”):将数据写到文件txtfile中
dfs(“dfsfile”):将数据写到HDFS上的dfsfile文件中
syslogTcp(“host”,port):将数据通过TCP传递给host节点

2. 安装Flume agent和Flume collector
$ sudo apt-get install flume-node
3. 安装Flume master
dongguo@hadoop-master:~$ sudo apt-get install flume-master
4. 启动Flume服务
$ sudo /etc/init.d/flume-node start
dongguo@hadoop-master:~$ sudo /etc/init.d/flume-master start
5. 配置flume-conf.xml
$ sudo vim /etc/flume/conf/flume-conf.xml
修改以下几段中的路径参数
  1. <property>
  2. <name>flume.collector.output.format</name>
  3. <value>raw</value>
  4. <description>The output format for the data written by a Flume
  5.     collector node.  There are several formats available:
  6.       syslog - outputs events in a syslog-like format
  7.       log4j - outputs events in a pattern similar to Hadoop's log4j pattern
  8.       raw - Event body only.  This is most similar to copying a file but
  9.         does not preserve any uniqifying metadata like host/timestamp/nanos.
  10.       avro - Avro Native file format.  Default currently is uncompressed.
  11.       avrojson - this outputs data as json encoded by avro
  12.       avrodata - this outputs data as a avro binary encoded data
  13.       debug - used only for debugging
  14. </description>
  15. </property>
  16. <property>
  17. <name>flume.master.servers</name>
  18. <value>hadoop-master</value>
  19. <description>A comma-separated list of hostnames, one for each
  20.       machine in the Flume Master.
  21. </description>
  22. </property>
  23. <property>
  24. <name>flume.collector.dfs.dir</name>
  25. <value>file:///data/flume/tmp/flume-${user.name}/collected</value>
  26. <description>This is a dfs directory that is the the final resting
  27.     place for logs to be stored in.  This defaults to a local dir in
  28.     /tmp but can be hadoop URI path that such as hdfs://namenode/path/
  29. </description>
  30. </property>
  31. <property>
  32. <name>flume.master.zk.logdir</name>
  33. <value>/data/flume/tmp/flume-${user.name}-zk</value>
  34. <description>The base directory in which the ZBCS stores data.</description>
  35. </property>
  36. <property>
  37. <name>flume.agent.logdir</name>
  38. <value>/data/flume/tmp/flume-${user.name}/agent</value>
  39. <description> This is the directory that write-ahead logging data
  40.       or disk-failover data is collected from applications gets
  41.       written to. The agent watches this directory.
  42. </description>
  43. </property>
复制代码
创建Flume所需的本地与HDFS目录
$ sudo mkdir -p /data/flume/tmp
$ sudo chown -R flume:flume /data/flume/
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -mkdir -p /data/flume/tmp
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -chown -R flume:flume /data/flume/
以上配置主要是修改Flume的tmp目录并将日志文件内容以原始格式保存。
6. 配置flume-site.xml
$ sudo vim /etc/flume/conf/flume-site.xml
  1. <?xml version="1.0"?>
  2. <?xml-stylesheet type="text/xsl"  href="configuration.xsl"?>
  3. <configuration>
  4. <property>
  5. <name>flume.master.servers</name>
  6. <value>hadoop-master</value>
  7. </property>
  8. <property>
  9. <name>flume.master.store</name>
  10. <value>zookeeper</value>
  11. </property>
  12. <property>
  13. <name>flume.master.zk.use.external</name>
  14. <value>true</value>
  15. </property>
  16. <property>
  17. <name>flume.master.zk.servers</name>
  18. <value>hadoop-master:2181,hadoop-node-1:2181,hadoop-node-2:2181</value>
  19. </property>
  20. </configuration>
复制代码
以上配置主要是通过Zookeeper来管理Flume的配置并指定Flume master。
7. 操作Flume shell
dongguo@hadoop-master:~$ flume shell
  1. [flume (disconnected)] connect localhost
  2. Using default admin port: 35873
  3. Using default report port: 45678
  4. Connecting to Flume master localhost:35873:45678...
  5. 2012-10-08 21:52:50,876 [main] INFO util.AdminRPCThrift: Connected to master at localhost:35873
  6. [flume localhost:35873:45678] getnodestatus
  7. Master knows about 3 nodes
  8.         hadoop-node-1 --> IDLE
  9.         hadoop-node-2 --> IDLE
  10.         hadoop-master --> IDLE
复制代码
8. 检查Zookeeper中的配置
dongguo@hadoop-master:~$ zookeeper-client

  1. [zk: localhost:2181(CONNECTED) 0] ls /
  2. [flume-cfgs, counters-config_version, flume-chokemap, hbase, zookeeper, flume-nodes]
复制代码
Web界面方式查看
http://10.6.1.150:35871
5.png
http://10.6.1.150:35862
http://10.6.1.151:35862
http://10.6.1.152:35862

6.png


9. 配置Source,SinkCollector
设计思路,通过配置hadoop-node-1与hadoop-node-2为agent,负责采集log。
然后hadoop-master作为collector,接收log并写入HDFS中。
下面将模拟在hadoop-1上采集2个log,在hadoop-node-2上采集1个log,在hadoop-master上监听3个端口来接收log并写入HDFS中。
创建存放log的HDFS目录
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -mkdir -p /flume/rawdata
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -chown -R hdfs /flume
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -chmod 777 /flume/rawdata
下面的log内容为测试数据,实际情况可以按照自身业务的特点进行写入,分隔符可以用逗号","或TAB制表符,我这里选用制表符。
在hadoop-node-1与hadoop-node-2上创建log文件 /var/log/rawdata.log
$ sudo mkdir /var/log/rawdata/
在hadoop-node-1上
dongguo@hadoop-node-1:~$ sudo vim /var/log/rawdata/rawdata-1.log

  1. hadoop-node-1-rawdata-1-value1
  2. hadoop-node-1-rawdata-1-value2
  3. hadoop-node-1-rawdata-1-value3
  4. hadoop-node-1-rawdata-1-value4
  5. hadoop-node-1-rawdata-1-value5
  6. hadoop-node-1-rawdata-1-value6
复制代码
dongguo@hadoop-node-1:~$ sudo vim/var/log/rawdata/rawdata-2.log

  1. hadoop-node-1-rawdata-2-value1
  2. hadoop-node-1-rawdata-2-value2
复制代码
在hadoop-node-2上
dongguo@hadoop-node-2:~$ sudo vim /var/log/rawdata/rawdata-1.log

  1. hadoop-node-2-rawdata-1-value1
  2. hadoop-node-2-rawdata-1-value2
复制代码
配置Flume Agent与Collector
dongguo@hadoop-master:~$ flume shell

  1. [flume (disconnected)] connect hadoop-master
  2. [flume hadoop-master:35873:45678] exec map hadoop-node-1 agent-1-a
  3. [flume hadoop-master:35873:45678] exec map hadoop-node-1 agent-1-b
  4. [flume hadoop-master:35873:45678] exec map hadoop-node-2 agent-2-a
  5. [flume hadoop-master:35873:45678] exec config agent-1-a 'tail("/var/log/rawdata/rawdata-1.log",true)' 'agentE2EChain("hadoop-master:35852")'
  6. [flume hadoop-master:35873:45678] exec config agent-1-b 'tail("/var/log/rawdata/rawdata-2.log",true)' 'agentE2EChain("hadoop-master:35853")'
  7. [flume hadoop-master:35873:45678] exec config agent-2-a 'tail("/var/log/rawdata/rawdata-1.log",true)' 'agentE2EChain("hadoop-master:35854")'
  8. [flume hadoop-master:35873:45678] exec map hadoop-master clct-1-a
  9. [flume hadoop-master:35873:45678] exec map hadoop-master clct-1-b
  10. [flume hadoop-master:35873:45678] exec map hadoop-master clct-2-a
  11. [flume hadoop-master:35873:45678] exec config clct-1-a 'collectorSource(35852)' 'collectorSink("hdfs://hadoop-master/flume/rawdata/%Y/%m/%d/%H%M/", "rawdata-1-a")'
  12. [flume hadoop-master:35873:45678] exec config clct-1-b 'collectorSource(35853)' 'collectorSink("hdfs://hadoop-master/flume/rawdata/%Y/%m/%d/%H%M/", "rawdata-1-b")'
  13. [flume hadoop-master:35873:45678] exec config clct-2-a 'collectorSource(35854)' 'collectorSink("hdfs://hadoop-master/flume/rawdata/%Y/%m/%d/%H%M/", "rawdata-2-a")'
  14. [flume hadoop-master:35873:45678]
复制代码
在界面上可以看到以上配置已经生效:
http://10.6.1.150:35871
7.png

测试往log中添加新的记录,出发日志的增量收集。
在hadoop-node-1上
dongguo@hadoop-node-1:~$ sudo vim /var/log/rawdata/rawdata-1.log
  1. hadoop-node-1-rawdata-1-value7
复制代码
查看日志是否被收集到HDFS
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -lsr /flume/rawdata

  1. drwxrwxrwx   - flume supergroup          0 2012-10-10 02:52 /flume/rawdata/2012
  2. drwxrwxrwx   - flume supergroup          0 2012-10-10 02:52 /flume/rawdata/2012/10
  3. drwxrwxrwx   - flume supergroup          0 2012-10-10 02:52 /flume/rawdata/2012/10/10
  4. drwxrwxrwx   - flume supergroup          0 2012-10-10 02:52 /flume/rawdata/2012/10/10/0252
  5. -rw-r--r--   2 flume supergroup        245 2012-10-10 02:52 /flume/rawdata/2012/10/10/0252/rawdata-1-a20121010-025216795+0800.26693113439423.00000029
复制代码
查看收集到的文件内容
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -cat/flume/rawdata/2012/10/10/0252/rawdata-1-a20121010-025216795+0800.26693113439423.00000029

  1. hadoop-node-1-rawdata-1-value1
  2. hadoop-node-1-rawdata-1-value2
  3. hadoop-node-1-rawdata-1-value3
  4. hadoop-node-1-rawdata-1-value4
  5. hadoop-node-1-rawdata-1-value5
  6. hadoop-node-1-rawdata-1-value6
  7. hadoop-node-1-rawdata-1-value7
复制代码
至此,我们可以看到日志文件在更改过后已经成功的被收集到了。
10. 至此,Flume的搭建就已经完成。
11. 接着,我们可以开始以下过程:
Hadoop集群实践之 (4) Hive搭建
本文内容
Hadoop集群实践之(4) Hive搭建
安装配置Hive
OS: Ubuntu 10.10 Server 64-bit
Servers:
hadoop-master:10.6.1.150
- namenode,jobtracker;hbase-master,hbase-thrift;
- secondarynamenode;
- hive-master,hive-metastore;
- zookeeper-server;
- flume-master
- flume-node
- datanode,taskTracker
hadoop-node-1:10.6.1.151
- datanode,taskTracker;hbase-regionServer;
- zookeeper-server;
- flume-node
hadoop-node-2:10.6.1.152
- dataNode,taskTracker;hbase-regionServer;
- zookeeper-server;
- flume-node
对以上角色做一些简单的介绍:
namenode - 整个HDFS的命名空间管理服务
secondarynamenode - 可以看做是namenode的冗余服务
jobtracker - 并行计算的job管理服务
datanode - HDFS的节点服务
tasktracker - 并行计算的job执行服务
hbase-master - Hbase的管理服务
hbase-regionServer - 对Client端插入,删除,查询数据等提供服务
zookeeper-server - Zookeeper协作与配置管理服务
flume-master - Flume的管理服务
flume-node - Flume的Agent与Collector服务,具体角色由flume-master决定
hive-master - Hive的管理服务
hive-metastore - Hive的元存储,用于对元数据进行类型检查与语法分析
本文定义的规范,避免在配置多台服务器上产生理解上的混乱:
所有直接以 $ 开头,没有跟随主机名的命令,都代表需要在所有的服务器上执行,除非后面有单独的//开头的说明。
1.安装前的准备
已经完成了 Hadoop集群实践之 (3) Flume搭建
Hive其实就是一个SQL解析引擎,它将SQL语句转译成M/R JOB然后在Hadoop执行,来达到快速开发的目的。
Hive是由Facebook贡献给Hadoop开源社区的。
2.安装Hive
dongguo@hadoop-master:~$ sudo apt-get install hadoop-hive hadoop-hive-metastorehadoop-hive-server
dongguo@hadoop-master:~$ sudo mkdir -p /var/lock/subsys
dongguo@hadoop-master:~$ sudo chown hive:hive /var/lock/subsys
3.创建Hive所需的本地目录
dongguo@hadoop-master:~$ sudo mkdir -p /var/run/hive/
dongguo@hadoop-master:~$ sudo chown hive:hive /var/run/hive/

4.启动Hive服务
dongguo@hadoop-master:~$ sudo /etc/init.d/hadoop-hive-metastore start
dongguo@hadoop-master:~$ sudo /etc/init.d/hadoop-hive-server start
5.安装MySQLJDBC Connector
由于Hive需要MySQL数据库作为元数据的存储,而Hive本身是由Java开发的,因此需要安装JDBC。
dongguo@hadoop-master:~$ wget 'http://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-5.1.22.tar.gz'
dongguo@hadoop-master:~$ tar xzf mysql-connector-java-5.1.22.tar.gz
dongguo@hadoop-master:~$ sudo cpmysql-connector-java-5.1.22/mysql-connector-java-5.1.22-bin.jar/usr/lib/hive/lib/
6.安装MySQL
dongguo@hadoop-master:~$ sudo apt-get install mysql-server
在弹出的界面中设置MySQL root密码为hadoophive
7.创建数据库并赋权
dongguo@hadoop-master:~$ mysql -uroot -phadoophive

  1. mysql> CREATE DATABASE metastore;
  2. mysql> USE metastore;
  3. mysql> SOURCE /usr/lib/hive/scripts/metastore/upgrade/mysql/hive-schema-0.7.0.mysql.sql;
  4. mysql> CREATE USER 'hiveuser'@'%' IDENTIFIED BY 'password';
  5. mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON metastore.* TO 'hiveuser'@'%';
  6. mysql> REVOKE ALTER,CREATE ON metastore.* FROM 'hiveuser'@'%';
  7. mysql> CREATE USER 'hiveuser'@'localhost' IDENTIFIED BY 'password';
  8. mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON metastore.* TO 'hiveuser'@'localhost';
  9. mysql> REVOKE ALTER,CREATE ON metastore.* FROM 'hiveuser'@'localhost';
复制代码
8.配置hive-site.xml
dongguo@hadoop-master:~$ sudo vim /etc/hive/conf/hive-site.xml

  1. <?xml version="1.0"?>
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  3. <configuration>
  4. <!-- Hive Configuration can either be stored in this file or in the hadoop configuration files  -->
  5. <!-- that are implied by Hadoop setup variables.                                                -->
  6. <!-- Aside from Hadoop setup variables - this file is provided as a convenience so that Hive    -->
  7. <!-- users do not have to edit hadoop configuration files (that may be managed as a centralized -->
  8. <!-- resource).                                                                                 -->
  9. <!-- Hive Execution Parameters -->
  10. <property>
  11. <name>javax.jdo.option.ConnectionURL</name>
  12. <value>jdbc:mysql://localhost:3306/metastore</value>
  13. </property>
  14. <property>
  15. <name>javax.jdo.option.ConnectionDriverName</name>
  16. <value>com.mysql.jdbc.Driver</value>
  17. </property>
  18. <property>
  19. <name>javax.jdo.option.ConnectionUserName</name>
  20. <value>hiveuser</value>
  21. </property>
  22. <property>
  23. <name>javax.jdo.option.ConnectionPassword</name>
  24. <value>password</value>
  25. </property>
  26. <property>
  27. <name>datanucleus.autoCreateSchema</name>
  28. <value>false</value>
  29. </property>
  30. <property>
  31. <name>datanucleus.fixedDatastore</name>
  32. <value>true</value>
  33. </property>
  34. <property>
  35. <name>hive.stats.autogather</name>
  36. <value>false</value>
  37. </property>
  38. <property>
  39. <name>hive.aux.jars.path</name>
  40. <value>file:///usr/lib/hive/lib/hive-hbase-handler-0.7.1-cdh3u3.jar,file:///usr/lib/hbase/hbase-0.90.4-cdh3u3.jar,file:///usr/lib/zookeeper/zookeeper-3.3.4-cdh3u3.jar</value>
  41. </property>
  42. <property>
  43. <name>hbase.zookeeper.quorum</name>
  44. <value>hadoop-master,hadoop-node-1,hadoop-node-2</value>
  45. </property>
  46. </configuration>
复制代码
确保hbase与zookeeper相关的jar包能被hive获取:
dongguo@hadoop-master:~$ sudo cp /usr/lib/hbase/hbase-0.90.4-cdh3u3.jar/usr/lib/hive/lib/
dongguo@hadoop-master:~$ sudo cp /usr/lib/zookeeper/zookeeper-3.3.4-cdh3u3.jar/usr/lib/hive/lib/
9.测试通过Hive执行Job并关联HBase中的数据
由于Hive降低了学习成本,无需使用Java进行Map/Reduce编程任务即可使用Hadoop的集群进行运算,并且与HBase能够有效的集成,因此我们可以直接在下面通过Hive实现对Hadoop集群的MapReduce并行计算的调用,体验Hadoop的魅力。
9.1启动Hive
dongguo@hadoop-master:~$ sudo /etc/init.d/hadoop-hive-server restart
dongguo@hadoop-master:~$ sudo /etc/init.d/hadoop-hive-metastore restart
9.2创建Hive所需的HDFS目录
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -mkdir /user/hive
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -chown hive /user/hive
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -mkdir /tmp
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -chmod 777 /tmp
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -chmod o+t /tmp
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -mkdir /data
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -chown hdfs /data
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -chmod 777 /data
dongguo@hadoop-master:~$ sudo -u hdfs hadoop fs -chmod o+t /data
9.3创建测试数据
dongguo@hadoop-master:~$ sudo -u hive vim /tmp/kv1.txt

  1. www.baidu.com
  2. www.google.com
  3. www.sina.com.cn
  4. www.163.com
  5. heylinx.com
复制代码
注:以TAB作为分隔符,而不是空格,后面我们Load数据的时候会用到。
9.4通过HiveShell进行操作
dongguo@hadoop-master:~$ sudo -u hive hive

  1. Hive history file=/tmp/hive/hive_job_log_hive_201210090516_1966038691.txt
  2. hive>
  3. #创建HBase识别的数据库
  4. hive> CREATE TABLE hbase_table_1(key int, value string)  
  5. > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
  6. > WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")  
  7. > TBLPROPERTIES ("hbase.table.name" = "xyz");
  8. OK
  9. Time taken: 17.919 seconds
  10. hive>
  11. #hbase.table.name 定义在hbase的table名称
  12. #hbase.columns.mapping 定义在hbase的列族
  13. #使用SQL导入数据,新建hive的数据表
  14. hive> CREATE TABLE IF NOT EXISTS pokes (   
  15. > foo INT,
  16. > bar STRING
  17. > )ROW FORMAT DELIMITED
  18. > FIELDS TERMINATED BY "\t"
  19. > LINES TERMINATED BY "\n";
  20. OK
  21. Time taken: 2.883 seconds
  22. hive>
  23. #选择制表符(\t)做分隔符,换行符(\n)做换行符。
  24. #批量插入数据
  25. hive> LOAD DATA LOCAL INPATH '/tmp/kv1.txt' OVERWRITE INTO TABLE pokes;
  26. Copying data from file:/tmp/kv1.txt
  27. Copying file: file:/tmp/kv1.txt
  28. Loading data to table default.pokes
  29. Deleted hdfs://hadoop-master/user/hive/warehouse/pokes
  30. OK
  31. Time taken: 4.361 seconds
  32. hive> select * from pokes;
  33. OK
  34. 1        www.baidu.com
  35. 2        www.google.com
  36. 3        www.sina.com.cn
  37. 4        www.163.com
  38. 5        heylinux.com
  39. Time taken: 0.641 seconds
  40. #使用SQL导入hbase_table_1
  41. hive> INSERT OVERWRITE TABLE hbase_table_1 SELECT * FROM pokes WHERE foo=5;
  42. Total MapReduce jobs = 1
  43. Launching Job 1 out of 1
  44. Number of reduce tasks is set to 0 since there's no reduce operator
  45. Starting Job = job_201210091928_0001, Tracking URL = http://hadoop-master:50030/jobdetails.jsp?jobid=job_201210091928_0001
  46. Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=hdfs://hadoop-master:8021 -kill job_201210091928_0001
  47. 2012-10-09 19:43:25,233 Stage-0 map = 0%,  reduce = 0%
  48. 2012-10-09 19:43:31,323 Stage-0 map = 100%,  reduce = 0%
  49. 2012-10-09 19:43:34,348 Stage-0 map = 100%,  reduce = 100%
  50. Ended Job = job_201210091928_0001
  51. 1 Rows loaded to hbase_table_1
  52. OK
  53. Time taken: 17.325 seconds
  54. hive>
  55. #可以看出Hive自动调用了Hadoop的Map/Reduce来进行并行计算,最后将ID为5的一条数据插入到了HBase中。
  56. #查看数据
  57. hive> select * from pokes;
  58. OK
  59. 1        www.baidu.com
  60. 2        www.google.com
  61. 3        www.sina.com.cn
  62. 4        www.163.com
  63. 5        heylinux.com
  64. Time taken: 0.874 seconds
  65. hive> select * from hbase_table_1;
  66. OK
  67. 5        heylinux.com
  68. Time taken: 1.174 seconds
  69. hive>
  70. #下面测试与Flume的集成,即直接LOAD之前Flume收集在HDFS中的数据。
  71. hive> LOAD DATA INPATH '/flume/rawdata/2012/10/10/0252/rawdata-1-a*' INTO TABLE pokes;      
  72. Loading data to table default.pokes
  73. OK
  74. Time taken: 1.65 seconds
  75. hive> select * from pokes;
  76. OK
  77. 1        www.baidu.com
  78. 2        www.google.com
  79. 3        www.sina.com.cn
  80. 4        www.163.com
  81. 5        heylinux.com
  82. 100        hadoop-node-1-rawdata-1-value1
  83. 101        hadoop-node-1-rawdata-1-value2
  84. 102        hadoop-node-1-rawdata-1-value3
  85. 103        hadoop-node-1-rawdata-1-value4
  86. 104        hadoop-node-1-rawdata-1-value5
  87. 105        hadoop-node-1-rawdata-1-value6
  88. 106        hadoop-node-1-rawdata-1-value7
  89. Time taken: 0.623 seconds
  90. hive>
  91. #可以看到通过Flume收集到HDFS中的数据我们也成功的LOAD了。
复制代码

9.5登录Hbase查看刚刚写入的数据
dongguo@hadoop-master:~$ sudo -u hdfs hbase shell

  1. HBase Shell; enter 'help' for list of supported commands.
  2. Type "exit" to leave the HBase Shell
  3. Version 0.90.4-cdh3u3, r, Thu Jan 26 10:13:36 PST 2012
  4. hbase(main):001:0> describe 'xyz'
  5. DESCRIPTION                                             ENABLED                                                            
  6. {NAME => 'xyz', FAMILIES => [{NAME => 'cf1', BLOOMFILTER => 'NONE',
  7. REPLICATION_SCOPE => '0', COMPRESSION => 'NONE', VERSI true ONS => '3',
  8. TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY => 'false',
  9. BLOCKCACHE => 'true'}]}   1 row(s) in 0.9640 seconds
  10. hbase(main):002:0> scan 'xyz'
  11. ROW                       COLUMN+CELL                                            
  12. 5    column=cf1:val, timestamp=1349783010142, value=heylinux.com                                               
  13. 1 row(s) in 0.0790 seconds
  14. hbase(main):003:0>
  15. #这时在Hive中可以看到刚才在Hbase中插入的数据了,即值为heylinux.com的一条记录。
  16. #测试一下在Hbase中直接插入数据。
  17. hbase(main):004:0> put 'xyz','6','cf1:val','www.360buy.com'
  18. 0 row(s) in 0.0690 seconds
  19. hbase(main):005:0> scan 'xyz'                              
  20. ROW                  COLUMN+CELL                                            
  21. 5   column=cf1:val, timestamp=1349783010142, value=heylinux.com                     
  22. 6   column=cf1:val, timestamp=1349783457396, value=www.360buy.com   
  23. 2 row(s) in 0.0320 seconds
  24. hbase(main):006:0>
复制代码
9.6通过MapReduceAdministration查看刚刚MapReduce的执行情况
通过上面执行“使用SQL导入hbase_table_1”时的输出可以看出Hive自动调用了Hadoop的MapReduce来进行并行计算,最后将ID为5的一条数据插入到了HBase中。
具体结果如何呢,我们可以通过MapReduceAdministration的WEB界面进行查看:
http://10.6.1.150:50030

8.png

可以清楚的看到,Job已经成功的完成了。
至此,我们已经完成的整个Hadoop集群架构的搭建,并且通过Hive方便的通过SQL方式实现了对Hadoop的MapReduce并行计算的调用。
在此,让我们再一次用 Hadoop集群实践之 (0) 完整架构设计中的图表来回顾一下整个架构与数据流的逻辑,
并开始我们的Hadoop之旅!
9.png



加微信w3aboutyun,可拉入技术爱好者群

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条