惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Exploit Database - CXSecurity.com
G
Google Developers Blog
爱范儿
爱范儿
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 叶小钗
C
Check Point Blog
F
Fortinet All Blogs
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
博客园 - 【当耐特】
Jina AI
Jina AI
T
The Blog of Author Tim Ferriss
P
Palo Alto Networks Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LINUX DO - 热门话题
M
MIT News - Artificial intelligence
Vercel News
Vercel News
博客园 - 司徒正美
Recorded Future
Recorded Future
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
P
Privacy & Cybersecurity Law Blog
Webroot Blog
Webroot Blog
博客园_首页
C
CXSECURITY Database RSS Feed - CXSecurity.com
云风的 BLOG
云风的 BLOG
D
DataBreaches.Net
Y
Y Combinator Blog
J
Java Code Geeks
B
Blog
A
About on SuperTechFans
O
OpenAI News
aimingoo的专栏
aimingoo的专栏
T
Tor Project blog
Stack Overflow Blog
Stack Overflow Blog
月光博客
月光博客
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - Franky
AWS News Blog
AWS News Blog
GbyAI
GbyAI
Application and Cybersecurity Blog
Application and Cybersecurity Blog
IT之家
IT之家
V
V2EX
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
大猫的无限游戏
大猫的无限游戏
Help Net Security
Help Net Security
W
WeLiveSecurity
C
Cyber Attacks, Cyber Crime and Cyber Security

博客园 - 后厂村思维导图馆

一道小学一年级数学题,国产大模型全军覆没 Java日志框架的依赖设置备查(SLF4J, Log4j, Logback) 简单了解一下国产操作系统 我整理了近五年的开发者报告,看看国内外有什么差异? 简单了解一下国产GPU Docsify on VPS,搭建最简个人博客 简单了解一下国产CPU 向量数据库Pinecone,治疗ChatGPT幻觉的药方? 今天看到博客园的捐款求助,园龄17年6个月的我有些感慨 如何假装你懂机器学习? 如何假装你懂Meta Segment Anything? 如何假装你懂GPU? 如何假装你懂图片生成AI(Midjourney、文心一格)? 如何假装你懂ChatGPT? APP开发,微信第三方登录的介绍 Java Lambda基础——Function, Consumer, Predicate, Supplier, 及FunctionalInterface接口 程序员生存指南——镜像加速 Kerberos ticket lifetime及其它 HBase + Kerberos 配置示例(二) HBase + Kerberos 配置示例(一)
Hadoop-2.6.0 + Zookeeper-3.4.6 + HBase-0.98.9-hadoop2环境搭建示例
后厂村思维导图馆 · 2015-02-07 · via 博客园 - 后厂村思维导图馆

1    基本信息

1.1     软件信息

hadoop-2.6.0

zookeeper-3.4.6

hbase-0.98.9-hadoop2

(以下示例中使用的操作系统是Centos 6.5,请将下载的3个tar包分别解压并放置在/usr/local/目录下)

(Hbase包中lib里可以看到zookeeper的jar包,从文件名可以确定使用的zookeeper版本)

1.2     集群组成:

Server Name

Hadoop Cluster

Zookeeper Ensemble

HBase Cluster

hadoopnamenode

Name node & Resource manager

Master

hadoop2ndnamenode

Secondary name node

hadoopdatanode1

Data node & Node manager

Region server

hadoopdatanode2

Data node & Node manager

Region server

hadoopdatanode3

Data node & Node manager

Region server

2    Hadoop集群

2.1     配置

2.1.1      core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoopnamenode:9000</value>
</property>
</configuration> 

2.1.2      hdfs-site.xml

<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/root/hadoopdata/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/root/hadoopdata/datanode</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop2ndnamenode:9001</value>
</property>
</configuration> 

2.1.3      mapred-site.xml

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration> 

2.1.4      yarn-site.xml

<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoopnamenode:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoopnamenode:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoopnamenode:8040</value>
</property>
</configuration>

2.1.5      slaves

hadoopdatanode1
hadoopdatanode2
hadoopdatanode3

2.1.6      /etc/hosts

153.65.170.45   hadoopnamenode.mh.com   hadoopnamenode
153.65.171.174  hadoop2ndnamenode.mh.com   hadoop2ndnamenode
153.65.171.20  hadoopdatanode1.mh.com   hadoopdatanode1
153.65.170.204  hadoopdatanode2.mh.com   hadoopdatanode2
153.65.170.85  hadoopdatanode3.mh.com   hadoopdatanode3

2.1.7      ~/.bashrc

与上一篇博客介绍的Hadoop 1类似,为了方便起见,修改.bashrc设置环境变量,注意sbin最好也要加到path中:

export HADOOP_PREFIX=/usr/local/hadoop-2.6.0
export HADOOP_MAPRED_PREFIX=$HADOOP_PREFIX
export HADOOP_HDFS_PREFIX=$HADOOP_PREFIX
export HADOOP_YARN_PREFIX=$HADOOP_PREFIX
export PATH=$PATH:$HADOOP_PREFIX/bin
export PATH=$PATH:$HADOOP_PREFIX/sbin

2.1.8      分发到集群的其它机器

把hadoop-2.6.0文件夹连同修改后的配置文件以及hosts文件,通过scp拷贝到其它四台机器上。

(并没有要求说所有的机器上都使用一样的配置文件,比如namenode的hdfs-site.xml应该是不需要dfs.datanode.data.dir配置,而datanode的hdfs-site.xml应该不需要dfs.namenode.name.dir配置。而也只有namenode上需要配置slaves文件。这里是为了简单起见,我们让所有机器上都保持一样的配置)

2.1.9      设置ssh免密码访问

参见上一篇博客。

2.1.10   一些配置参数的解释

Hadoop 2中没有mapred.job.tracker了,新框架中已改为yarn-site.xml 中的 resouceManager 及 nodeManager具体配置项,新框架中历史 job 的查询已从Job tracker剥离,归入单独的mapreduce.jobtracker.jobhistory 相关配置。

yarn.resourcemanager.address---NodeManager 与 RM 通信的接口地址

yarn.resourcemanager.scheduler.address---NodeManger 需要知道 RM 主机的 scheduler 调度服务接口地址

yarn.resourcemanager.resource-tracker.address---NodeManager 需要向 RM 报告任务运行状态供 Resouce 跟踪,因此 NodeManager 节点主机需要知道 RM 主机的 tracker 接口地址

yarn.resourcemanager.webapp.address---各个 task 的资源调度及运行状况通过通过该 web 界面访问

2.2     创建目录

在namenode上创建: /root/hadoopdata/namenode

在3台datanode上创建: /root/hadoopdata/datanode

(也可以让hadoop自动创建) 

2.3     启动/关闭

start-dfs.sh,执行之后,使用jps命令查看java进程情况:

hadoopnamenode上有namenode进程,

hadoop2ndnamenode上有secondarynamenode进程,

hadoopdatanode1, hadoopdatanode2, hadoopdatanode3上有datanode进程

start-yarn.sh,执行之后的java进程情况:

hadoopnamenode上有namenode, resourcemanager进程,

hadoop2ndnamenode上有secondarynamenode进程,

hadoopdatanode1, hadoopdatanode2, hadoopdatanode3上有datanode, nodemanager进程

关闭的命令对应的是stop-dfs.sh, stop-yarn.sh

2.4     测试

hdfs dfsadmin -report //查看hdfs的一些基本信息

yarn node –list //查看yarn的一些基本信息

可以使用hadoop的share目录下的一些mapreduce示例程序进行测试,比如wordcount:

先使用copyFromLocal命令(后续有介绍用法)把一个本地文本文件放到hdfs的/book目录下,然后执行:

hadoop jar /usr/local/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount   /book   /out2

即对/book目录下的书进行单词统计,然后输出到/out2目录。

可以登录web界面检查hadoop是否运行正常:

hdfs管理界面同hadoop 1: http://hadoopnamenode:50070/ 

yarn的管理界面不再是原来的50030端口,而是http://hadoopnamenode:8088/

2.5     注意事项

若namenode上的core-site.xml中的fs.defaultFS缺失,则启动时会报错。

若各机器上的yarn-site.xml中的yarn.resourcemanager.resource-tracker.address缺失,虽然resourcemanager与nodemanager进程能够正常启动,但是在执行yarn node -list会出现node数量为0的情况。

若各机器上的yarn-site.xml中的yarn.resourcemanager.scheduler.address或yarn.resourcemanager.address缺失,则在运行job时,会卡在INFO mapreduce.Job: Job job_1422695884569_0001 running in uber mode : false

2.6     几个Hadoop fs shell命令

hadoop fs -ls / ---列出hdfs根目录下的文件、目录

hadoop fs -ls /out2 ---列出out2目录下的文件、目录

hadoop fs -lsr / ---递归显示文件

hadoop fs -cat /out2/part-r-00000 ---打出文件内容

hadoop dfs -copyFromLocal  <local_FS_filename> <target_on_HDFS>

hadoop fs -du hdfs://namenodehost/user/hadoop ---查看目录大小

hadoop fs -rm /user/hadoop/file ---删除文件或空目录

hadoop fs -rmr /user/hadoop/dir ---删除文件或目录,递归之意

hafoop fs -tail /user/hadoop/sales.dat ---查看文件内容

注1:

dfs was deprecated in favor of "fs" command.

所以原来的hadoop dfs -copyFromLocal  <local_FS_filename> <target_on_HDFS>,现在的写法是

hadoop fs -copyFromLocal  <local_FS_filename> <target_on_HDFS>

注2:

hadoop fs -copyFromLocal /root/Downloads/small/war_and_peace.txt /test 这样生成的test是文件,而不是文件夹

所以一般hadoop fs -copyFromLocal /root/Downloads/small  /test,这样small下的文件会被copy到test文件夹下

又或者hadoop fs -copyFromLocal /root/Downloads/small/war_and_peace.txt /test4/,注意最后的/,前提是要用hadoop fs -mkdir先创建出test4目录

3    Zookeeper集群

3.1     配置

3.1.1      zoo.cfg

tickTime=2000
dataDir=/root/zookeeperdata
clientPort=2181
initLimit=5
syncLimit=2
server.1=hadoopnamenode:2888:3888
server.2=hadoop2ndnamenode:2888:3888
server.3=hadoopdatanode1:2888:3888

3.1.2      分发到集群的其它机器

把zookeeper文件夹连同修改后的配置文件通过scp拷贝到另外两台机器(hadoop2ndnamenode, hadoopdatanode)上。

3.1.3      设置myid

hadoopnameonde上echo”1” > /root/zookeeperdata/myid

hadoop2ndnamenode上echo “2” > /root/zookeeperdata/myid

hadoopdatanode上echo”3” > /root/zookeeperdata/myid

3.1.4      一些配置参数的解释

tickTime :心跳时间,单位毫秒。同时tickTime又是zookeeper中的基本单位,比如后面的initLimit=5就是指5个tickTime时间,在这里是10秒。 

dataDir :存储数据信息的本地目录。 

3.2     创建目录

在hadoopnamenode, hadoop2ndnamenode, hadoopdatanode1上创建dataDir中配置的目录/root/zookeeperdata。

3.3     启动/关闭

{ZOOKEEPER_HOME} /bin/zkServer.sh start

启动和关闭命令必须到zookeeper集群的每个机器上,没有像start-dfs.sh那样的命令可以一下子把整个集群启动。

关闭:{ZOOKEEPER_HOME} /bin/zkServer.sh stop

3.4     测试

{ZOOKEEPER_HOME} /bin/zkServer.sh status

以下是结果示例,可以看到各机器的角色是follower还是leader。

[root@hadoopnamenode zookeeper-3.4.6]# bin/zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg

Mode: follower

[root@hadoop2ndnamenode zookeeper-3.4.6]# bin/zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg

Mode: leader

[root@hadoopdatanode1 zookeeper-3.4.6]# bin/zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg

Mode: follower

3.5     注意事项

对于一个包含3台server的Zookeeper集群,最多容许关闭一台(如果被关闭的是leader,则会重新选举出一个)。如果关闭两台,则剩下那台虽然进程QuorumPeerMain还在,但zkServer.sh status查看状态则显示Error contacting service. It is probably not running。

对于一个包含5台server的Zookeeper集群,最多容许关闭两台。关闭三台,则剩下两台虽然进程QuorumPeerMain还在,但也显示同样的错误。

(如果这个时候用Java程序去连接Hbase,则会提示:org.apache.hadoop.hbase.ZooKeeperConnectionException: Can't connect to ZooKeeper)

这里面有两个常见的疑问:

1) 当3台server关闭一台时,只剩下两台时,无法形成majority,那么它是如何选举出leader的?

2) 当5台server关闭三台时,剩下两台,为什么不能像1)中一样仍然正常工作?

这两个问题的答案是同一个,Zookeeper中的所谓majority voting机制,其majority是针对原始的server数量,不是指变化后的数量,这个原始的数量即你配置在zoo.cfg中的server个数。 

还有一个常见的问题是为什么推荐使用奇数个Zookeeper server,那是因为3个server与4个server能够提供的可靠性是一样的,3台server的集群允许其中一台server宕机,而4台server的集群也只能容许其中一台server宕机,因为如果两台server宕机,那么剩下两台,对比于原来的4台,2/4不够成大多数。

4    Hbase集群

4.1     配置

4.1.1      hbase-env.sh

其它不变,export HBASE_MANAGES_ZK=false,这表示不使用hbase自带的zookeeper,而使用外部的zookeeper(这里指我们在上面建的zookeeper)

4.1.2      hbase-site.xml

<configuration>
<property>
 <name>hbase.rootdir</name>
 <value>hdfs://hadoopnamenode:9000/hbase</value>
 <description>The directory shared by region servers.</description>
</property>
<property>
 <name>hbase.zookeeper.property.clientPort</name>
 <value>2181</value>
 <description>Property from ZooKeeper's config zoo.cfg. The port at which the clients will connect.
 </description>
</property>
<property>
 <name>zookeeper.session.timeout</name>
 <value>120000</value>
</property>
<property>
 <name>hbase.zookeeper.quorum</name>
 <value>hadoopnamenode,hadoop2ndnamenode,hadoopdatanode1</value>
</property>
<property>
 <name>hbase.tmp.dir</name>
 <value>/root/hbasedata</value>
</property>
<property>
 <name>hbase.cluster.distributed</name>
 <value>true</value>
</property>
</configuration>

4.1.3      regionservers

hadoopdatanode1
hadoopdatanode2
hadoopdatanode3

4.1.4      一些配置参数的解释

hbase.zookeeper.property.clientPort:指定zk的连接端口

zookeeper.session.timeout:RegionServer与Zookeeper间的连接超时时间。当超时时间到后,ReigonServer会被Zookeeper从RS集群清单中移除,HMaster收到移除通知后,会对这台server负责的regions重新balance,让其他存活的RegionServer接管.

hbase.zookeeper.quorum:默认值是 localhost,列出zookeepr ensemble中的servers

4.2     启动/关闭

bin/start-hbase.sh

bin/stop-hbase.sh

4.3     测试

在hadoopnamenode上执行

{HBASE_HOME}/bin/hbase shell

进入shell命令行,通过创建表等操作来检查不是不工作正常。

或者通过一个简单的Java程序来测试:

Configuration config = HBaseConfiguration.create();
config.set( "hbase.zookeeper.quorum", "hadoopnamenode,hadoop2ndnamenode,hadoopdatanode1" );
config.set( "hbase.zookeeper.property.clientport", "2181" );
//config.set("zookeeper.znode.parent", "/hbase-unsecure"); // this is what most people miss :) 
HBaseAdmin.checkHBaseAvailable( config );
HTable    t    = new HTable( config, "test" );
Scan    s    = new Scan();
//s.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("name")); 
ResultScanner rs = t.getScanner( s );
try{
    for ( Result r : rs )
    {
        for ( Cell cell : r.rawCells() )
        {
            System.out.println( "RowName:" + new String( CellUtil.cloneRow( cell ) ) + " " );
            System.out.println( "Timetamp:" + cell.getTimestamp() + " " );
            System.out.println( "column Family:" + new String( CellUtil.cloneFamily( cell ) ) + " " );
            System.out.println( "row Name:" + new String( CellUtil.cloneQualifier( cell ) ) + " " );
            System.out.println( "value:" + new String( CellUtil.cloneValue( cell ) ) + " " );
        }
    }
} finally {
    t.close();
}

System.out.println( "Done!" );

注意,java测试程序所在机器的hosts文件,注意必须有全FDQN(fully qualified domain name, 参见上面linux中的hosts文件),否则有java访问时会提示找不到hadoopnamenode.mh.com 

4.4     注意事项

HBase集群需要依赖于一个Zookeeper ensemble。HBase集群中的所有节点以及要访问HBase的客户端都需要能够访问到该Zookeeper  ensemble。HBase自带了Zookeeper,但为了方便其他应用程序使用Zookeeper,最好使用单独安装的Zookeeper ensemble。

此外,Zookeeper ensemble一般配置为奇数个节点,并且Hadoop集群、Zookeeper ensemble、HBase集群是三个互相独立的集群,并不需要部署在相同的物理节点上,他们之间是通过网络通信的。

需要注意的是,如果要禁止启动hbase自带的zookeeper,那么,不仅仅需要刚才的export HBASE_MANAGES_ZK=false配置,还需要hdfs-site.xml中的hbase.cluster.distributed为true,否则你在启动时会遇到Could not start ZK at requested port of 2181 错误,这是因为hbase尝试启动自带的zookeeper,而我们已经启动了自己安装的那个zookeeper,默认都使用2181端口,所以出错。

还有,有时候会遇到stop-hbase.sh执行很长时间未结束,很可能的原因是你之前把zookeeper关闭了.

最后,Hbase不需要mapreduce,所以只要start-dfs.sh启动hdfs,然后到zookeeper各节点上启动zookeeper,最后再hbase-start.sh启动hbase即可.


送书了,送书了,关注公众号“后厂村思维导图馆”,送出O'Reilly《Spark快速大数据分析》纸质书(亦有一批PDF分享)! —— 2018年12月