HDFS

HDFS

Hadoop HDFS如何挂载多块硬盘扩容

运维 空心菜 回复了问题 2 人关注 1 个回复 7138 次浏览 2018-07-31 15:16 来自相关话题

HDFS删除了文件,但是磁盘空间没有释放,这是怎么回事?

大数据 空心菜 回复了问题 3 人关注 1 个回复 15997 次浏览 2019-09-17 16:54 来自相关话题

HDFS常用的一些命令

大数据 being 发表了文章 0 个评论 2316 次浏览 2017-07-07 14:52 来自相关话题

一、文件操作 1、列出HDFS下的文件 /usr/local/hadoop/bin/hadoop dfs -ls2、列出HDFS文件下名为in的文档中的文件 /usr/local/hadoop/bin/hado ...查看全部


一、文件操作


1、列出HDFS下的文件
/usr/local/hadoop/bin/hadoop dfs -ls
2、列出HDFS文件下名为in的文档中的文件
/usr/local/hadoop/bin/hadoop dfs -ls in
3、上传文件
将hadoop目录下的test1文件上传到HDFS上并重命名为test
/usr/local/hadoop/bin/hadoop dfs -put test1 test
4、文件被复制到本地系统中
将HDFS中的in文件复制到本地系统并命名为getin:
/usr/local/hadoop/bin/hadoop dfs -get in getin
5、删除文档
删除HDFS下名为out的文档:
/usr/local/hadoop/bin/hadoop dfs -rmr out
6、查看文件
查看HDFS下in文件中的内容:
/usr/local/hadoop/bin/hadoop dfs -cat in/*
7、建立目录
/usr/local/hadoop/bin/hadoop dfs -mkdir /user/hadoop/examples(目录/目录名)
只能一级一级的建目录。

8、复制文件
/usr/local/hadoop/bin/hadoop dfs -copyFromLocal 源路径 路径
9、通过Hadoop命令把两个文件的内容合并起来
hdfs dfs -getmerge 位于hdfs中的原文件(里面有多个文件) 合并后的文件名
例如:
hdfs dfs -getmerge hdfs://Master:9000/data/SogouResult.txt CombinedResult
 注:合并后的文件位于当前目录,不在hdfs中,是本地文件.
 


二、管理与更新
 


1、执行基本信息
查看HDFS的基本统计信息:
/usr/local/hadoop/bin/hadoop dfsadmin -report
2、退出安全模式
NameNode在启动时会自动进入安全模式。安全模式是NameNode的一种状态,在这个阶段,文件系统不允许有任何修改。

系统显示Name node in safe mode,说明系统正处于安全模式,这时只需要等待十几秒即可,也可通过下面的命令退出安全模式:
/usr/local/hadoop/bin/hadoop dfsadmin -safemode leave
3、进入安全模式
在必要情况下,可以通过以下命令把HDFS置于安全模式:
/usr/local/hadoop/bin/hadoop dfsadmin -safemode enter
4、节点添加
添加一个新的DataNode节点,先在新加节点上安装好Hadoop,要和NameNode使用相同的配置(可以直接从NameNode复制),修改$HADOOP_HOME/conf/master文件,加入NameNode主机名。然后在NameNode节点上修改$HADOOP_HOME/conf/slaves文件,加入新节点名,再建立新加节点无密码的SSH连接,运行启动命令为:
/usr/local/hadoop/bin/start-all.sh
5、负载均衡
HDFS的数据在各个DataNode中的分布可能很不均匀,尤其是在DataNode节点出现故障或新增DataNode节点时。新增数据块时NameNode对DataNode节点的选择策略也有可能导致数据块分布不均匀。用户可以使用命令重新平衡DataNode上的数据块的分布:
/usr/local/hadoop/bin/start-balancer.sh

CDH Hadoop + HBase HA 部署详解

大数据 空心菜 发表了文章 0 个评论 8140 次浏览 2016-11-07 21:07 来自相关话题

CDH 的部署和 Apache Hadoop 的部署是没有任何区别的。这里着重的是 HA的部署,需要特殊说明的是NameNode HA 需要依赖 Zookeeper。 准备Hosts文件配置: ...查看全部

CDH 的部署和 Apache Hadoop 的部署是没有任何区别的。这里着重的是 HA的部署,需要特殊说明的是NameNode HA 需要依赖 Zookeeper。


准备

Hosts文件配置:


cat > /etc/hosts << _HOSTS_
127.0.0.1 localhost
10.0.2.59 cdh-m1
10.0.2.60 cdh-m2
10.0.2.61 cdh-s1
_HOSTS_

各个节点服务情况


cdh-m1 Zookeeper JournalNode NameNode DFSZKFailoverController HMaster
cdh-m2 Zookeeper JournalNode NameNode DFSZKFailoverController HMaster
cdh-s1 Zookeeper JournalNode DataNode HRegionServer

对几个新服务说明下:


  • JournalNode 用于同步 NameNode 元数据,和 Zookeeper 一样需要 2N+1个节点存活集群才可用;
  • DFSZKFailoverController(ZKFC) 用于主备切换,类似 Keepalived 所扮演的角色。

NTP 服务

设置时区


rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

配置NTP Server


yum install -y ntp
cat > /etc/ntp.conf << _NTP_
driftfile /var/lib/ntp/drift

restrict default nomodify
restrict -6 default nomodify

server cn.ntp.org.cn prefer
server news.neu.edu.cn iburst
server dns.sjtu.edu.cn iburst
server 127.127.1.1 iburst

tinker dispersion 100
tinker step 1800
tinker stepout 3600
includefile /etc/ntp/crypto/pw

keys /etc/ntp/keys
_NTP_

# NTP启动时立即同步
cat >> /etc/ntp/step-tickers << _NTP_
server cn.ntp.org.cn prefer
server news.neu.edu.cn iburst
server dns.sjtu.edu.cn iburst
_NTP_

# 同步硬件时钟
cat >> /etc/sysconfig/ntpd << _NTPHW_
SYNC_HWCLOCK=yes
_NTPHW_

启动并设置开机自启动


/etc/init.d/ntpd start
chkconfig ntpd on

配置 NTP Client


yum install -y ntp
# 注意修改内网NTP Server地址
cat > /etc/ntp.conf << _NTP_
driftfile /var/lib/ntp/drift

restrict default nomodify
restrict -6 default nomodify

restrict 127.0.0.1
restrict -6 ::1

server 10.0.2.59 prefer

tinker dispersion 100
tinker step 1800
tinker stepout 3600
includefile /etc/ntp/crypto/pw

keys /etc/ntp/keys
_NTP_

# NTP启动时立即同步
cat >> /etc/ntp/step-tickers << _NTP_
server 10.0.2.59 prefer
_NTP_

# 同步硬件时钟
cat >> /etc/sysconfig/ntpd << _NTPHW_
SYNC_HWCLOCK=yes
_NTPHW_

启动并设置开机自启动


/etc/init.d/ntpd start
chkconfig ntpd on

检查 NTP 同步


ntpq -p

# 结果
remote refid st t when poll reach delay offset jitter
==============================================================================
*time7.aliyun.co 10.137.38.86 2 u 17 64 3 44.995 5.178 0.177
news.neu.edu.cn .INIT. 16 u - 64 0 0.000 0.000 0.000
202.120.2.90 .INIT. 16 u - 64 0 0.000 0.000 0.000

JDK配置

创建目录


mkdir -p /data/{install,app,logs,pid,appData}
mkdir /data/appData/tmp

cd /data/install
wget -c http://oracle.com/jdk-7u51-linux-x64.gz
tar xf jdk-7u51-linux-x64.gz -C /data/app
cd /data/app
ln -s jdk1.7.0_51 jdk1.7
cat >> /etc/profile << _PATH_
export JAVA_HOME=/data/app/jdk1.7
export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
export PATH=\$JAVA_HOME/bin:\$PATH
_PATH_
source /etc/profile

创建运行账户


useradd -u 600 run

下载 安装包

# http://archive.cloudera.com/cdh5/cdh/5/
cd /data/install
wget -c http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.4.5.tar.gz
wget -c http://archive.apache.org/dist/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz
wget -c http://archive.cloudera.com/cdh5/cdh/5/hbase-1.0.0-cdh5.4.5.tar.gz

安装 Zookeeper

cd /data/install
tar xf zookeeper-3.4.5.tar.gz -C /data/app
cd /data/app
ln -s zookeeper-3.4.5 zookeeper

设置环境变量


sed -i '/^export PATH=/i\export ZOOKEEPER_HOME=/data/app/zookeeper' /etc/profile
sed -i 's#export PATH=#&\$ZOOKEEPER_HOME/bin:#' /etc/profile
source /etc/profile

删除无用文件


cd $ZOOKEEPER_HOME
rm -rf *xml *txt zookeeper-3.4.5.jar.* src recipes docs dist-maven contrib
rm -f $ZOOKEEPER_HOME/bin/*.cmd $ZOOKEEPER_HOME/bin/*.txt
rm -f $ZOOKEEPER_HOME/conf/zoo_sample.cfg

创建数据目录


mkdir -p /data/appData/zookeeper/{data,logs}

配置


cat > $ZOOKEEPER_HOME/conf/zoo.cfg << _ZOO_
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/data/appData/zookeeper/data
dataLogDir=/data/appData/zookeeper/logs
server.1=cdh-m1:2888:3888
server.2=cdh-m2:2888:3888
server.3=cdh-s1:2888:3888
_ZOO_

修改Zookeeper的日志打印方式,与日志路径设置, 编辑


$ZOOKEEPER_HOME/bin/zkEnv.sh

在27行后加入两个变量


ZOO_LOG_DIR=/data/logs/zookeeper
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"

创建 myid文件


# 注意myid与配置文件保持一致
echo 1 >/data/appData/zookeeper/data/myid

设置目录权限


chown -R run.run /data/{app,appData,logs}

启动、停止


# 启动
runuser - run -c 'zkServer.sh start'
# 停止
runuser - run -c 'zkServer.sh stop'

安装 Hadoop

tar xf hadoop-2.6.0-cdh5.4.5.tar.gz -C /data/app
cd /data/app
ln -s hadoop-2.6.0-cdh5.4.5 hadoop

设置环境变量


sed -i '/^export PATH=/i\export HADOOP_HOME=/data/app/hadoop' /etc/profile
sed -i 's#export PATH=#&\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin:#' /etc/profile
source /etc/profile

删除无用文件


cd $HADOOP_HOME
rm -rf *txt share/doc src examples* include bin-mapreduce1 cloudera
find . -name "*.cmd"|xargs rm -f

新建数据目录


mkdir -p /data/appData/hdfs/{name,edits,data,jn,tmp}

配置

切换到配置文件目录


cd $HADOOP_HOME/etc/hadoop

编辑 core-site.xml


<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- HDFS 集群名称,可指定端口 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hdfs-cdh</value>
</property>

<!-- 临时文件目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/data/appData/hdfs/tmp</value>
</property>

<!-- 回收站设置,0不启用回收站,1440 表示1440分钟后删除 -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>

<!-- SequenceFiles在读写中可以使用的缓存大小,单位 bytes 默认 4096 -->
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>

<!-- 可用压缩算法,启用在hdfs-site.xml中,需要编译动态链接库才能用 -->
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
</configuration>

编辑 hdfs-site.xml


<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定hdfs 集群名称,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>hdfs-cdh</value>
</property>

<!-- 指定 Zookeeper 用于NameNode HA,默认官方配置在core-site.xml中,为了查看清晰配置到hdfs-site.xml也是可用的 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>cdh-m1:2181,cdh-m2:2181,cdh-s1:2181</value>
</property>

<!-- hdfs-cdh 下有两个NameNode,分别为 nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.hdfs-cdh</name>
<value>nn1,nn2</value>
</property>

<!-- nn1 RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.hdfs-cdh.nn1</name>
<value>cdh-m1:9000</value>
</property>

<!-- nn1 HTTP通信地址 -->
<property>
<name>dfs.namenode.http-address.hdfs-cdh.nn1</name>
<value>cdh-m1:50070</value>
</property>

<!-- nn2 RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.hdfs-cdh.nn2</name>
<value>cdh-m2:9000</value>
</property>

<!-- nn2 HTTP通信地址 -->
<property>
<name>dfs.namenode.http-address.hdfs-cdh.nn2</name>
<value>cdh-m2:50070</value>
</property>

<!-- 指定NameNode元数据在JournalNode上的存储路径 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://cdh-m1:8485;cdh-m2:8485;cdh-s1:8485;/hdfs-cdh</value>
</property>

<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

<!-- 配置主备切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.hdfs-cdh</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!-- 配置主备切换方法,每个方法一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>

<!-- 指定运行用户的秘钥,需要NameNode双向免密码登录,用于主备自动切换 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/run/.ssh/id_rsa</value>
</property>

<!-- 配置sshfence 超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>50000</value>
</property>

<!-- NameNode 数据本地存储路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/appData/hdfs/name</value>
</property>

<!-- DataNode 数据本地存储路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/appData/hdfs/data</value>
</property>

<!-- JournalNode 数据本地存储路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/appData/hdfs/jn</value>
</property>

<!-- 修改文件存储到edits,定期同步到DataNode -->
<property>
<name>dfs.namenode.edits.noeditlogchannelflush</name>
<value>true</value>
</property>

<!-- edits 数据本地存储路径 -->
<property>
<name>dfs.namenode.edits.dir</name>
<value>/data/appData/hdfs/edits</value>
</property>

<!-- 开启Block Location metadata允许impala知道数据块在哪块磁盘上 默认关闭 -->
<property>
<name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
<value>true</value>
</property>

<!-- 权限检查 默认开启 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>

<!-- block 大小设置 -->
<property>
<name>dfs.blocksize</name>
<value>64m</value>
</property>
</configuration>

小于5个DataNode建议添加如下配置


<!-- 数据副本数量,不能超过DataNode数量,大集群建议使用默认值 默认 3 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>

<!-- 当副本写入失败时不分配新节点,小集群适用 -->
<property>
<name>dfs.client.block.write.replace-datanode-on-failure.policy</name>
<value>NEVER</value>
</property>

在 hadoop-env.sh 中添加如下变量


export JAVA_HOME=/data/app/jdk1.7
export HADOOP_LOG_DIR=/data/logs/hadoop
export HADOOP_PID_DIR=/data/pid
# SSH端口 可选
export HADOOP_SSH_OPTS="-p 22"

Heap 设置,单位 MB


export HADOOP_HEAPSIZE=1024

权限设置


chown -R run.run /data/{app,appData,logs}
chmod 777 /data/pid

格式化

格式化只需要执行一次,格式化之前启动Zookeeper


切换用户


su - run

启动所有 JournalNode


hadoop-daemon.sh start journalnode

格式化 Zookeeper(为 ZKFC 创建znode)


hdfs zkfc -formatZK

NameNode 主节点格式化并启动


hdfs namenode -format
hadoop-daemon.sh start namenode

NameNode 备节点同步数据并启动


hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode

启动 ZKFC


hadoop-daemon.sh start zkfc

启动 DataNode


hadoop-daemon.sh start datanode

启动与停止

切换用户


su - run

集群批量启动
需要配置运行用户ssh-key免密码登录,与$HADOOP_HOME/etc/hadoop/slaves


# 启动
start-dfs.sh
# 停止
stop-dfs.sh

单服务启动停止
启动HDFS

hadoop-daemon.sh start journalnode
hadoop-daemon.sh start namenode
hadoop-daemon.sh start zkfc
hadoop-daemon.sh start datanode

停止HDFS


hadoop-daemon.sh stop datanode
hadoop-daemon.sh stop namenode
hadoop-daemon.sh stop journalnode
hadoop-daemon.sh stop zkfc

测试

HDFS HA 测试
打开 NameNode 状态页:
http://cdh-m1:50010
http://cdh-m2:50010


在 Overview 后面能看见 active 或 standby,active 为当前 Master,停止 active 上的 NameNode,检查 standby是否为 active。


HDFS 测试


hadoop fs -mkdir /test
hadoop fs -put /etc/hosts /test
hadoop fs -ls /test

结果:


-rw-r--r--   2 java supergroup         89 2016-06-15 10:30 /test/hosts
# 其中权限后面的列(这里的2)代表文件总数,即副本数量。

HDFS 管理命令


# 动态加载 hdfs-site.xml
hadoop dfsadmin -refreshNodes

HBase安装配置

cd /data/install
tar xf hbase-1.0.0-cdh5.4.5.tar.gz -C /data/app
cd /data/app
ln -s hbase-1.0.0-cdh5.4.5 hbase

设置环境变量


sed -i '/^export PATH=/i\export HBASE_HOME=/data/app/hbase' /etc/profile
sed -i 's#export PATH=#&\$HBASE_HOME/bin:#' /etc/profile
source /etc/profile

删除无用文件


cd $HBASE_HOME
rm -rf *.txt pom.xml src docs cloudera dev-support hbase-annotations hbase-assembly hbase-checkstyle hbase-client hbase-common hbase-examples hbase-hadoop2-compat hbase-hadoop-compat hbase-it hbase-prefix-tree hbase-protocol hbase-rest hbase-server hbase-shell hbase-testing-util hbase-thrift
find . -name "*.cmd"|xargs rm -f

配置
进入配置文件目录

cd $HBASE_HOME/conf

编辑 hbase-site.xml


<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- HBase 数据存储路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://hdfs-cdh/hbase</value>
</property>

<!-- 完全分布式模式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>

<!-- HMaster 节点 -->
<property>
<name>hbase.master</name>
<value>cdh-m1:60000,cdh-m2:60000</value>
</property>

<!-- Zookeeper 节点 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>cdh-m1:2181,cdh-m2:2181,cdh-s1:2181</value>
</property>

<!-- znode 路径,Zookeeper集群中有多个HBase集群需要设置不同znode -->
<property>
<name>zookeeper.znode.parent</name>
<value>/hbase</value>
</property>

<!-- HBase 协处理器 -->
<property>
<name>hbase.coprocessor.user.region.classes</name>
<value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>
</property>
</configuration>

在 hbase-env.sh 中添加如下变量


export JAVA_HOME=/data/app/jdk1.7
export HBASE_LOG_DIR=/data/logs/hbase
export HBASE_PID_DIR=/data/pid
export HBASE_MANAGES_ZK=false
# SSH 默认端口 可选
export HBASE_SSH_OPTS="-o ConnectTimeout=1 -p 36000"

Heap 设置,单位 MB


export HBASE_HEAPSIZE=1024

可选设置 regionservers 中添加所有RegionServer主机名,用于集群批量启动、停止。


启动与停止
切换用户

su - run

集群批量启动
需要配置运行用户ssh-key免密码登录,与$HBASE_HOME/conf/regionservers


# 启动
start-hbase.sh
# 停止
stop-hbase.sh

单服务启动停止
HMaster

# 启动
hbase-daemon.sh start master
# 停止
hbase-daemon.sh stop master

HRegionServer


# 启动
hbase-daemon.sh start regionserver
# 停止
hbase-daemon.sh stop regionserver

测试
HBase HA 测试
浏览器打开两个HMaster状态页:
http://cdh-m1:60010
http://cdh-m2:60010


可以在Master后面看见其中一个主机名,Backup Masters中看见另一个。
停止当前Master,刷新另一个HMaster状态页会发现Master后面已经切换,HA成功。

HBase 测试
进入hbase shell 执行:

create 'users','user_id','address','info'
list
put 'users','anton','info:age','24'
get 'users','anton'

# 最终结果
COLUMN CELL
info:age timestamp=1465972035945, value=24
1 row(s) in 0.0170 seconds

清除测试数据:


disable 'users'
drop 'users'

到这里安装就全部完成。

Name node is in safe mode解决

大数据 Nock 发表了文章 0 个评论 3146 次浏览 2016-10-16 21:05 来自相关话题

将本地文件拷贝到hdfs上去,结果上错误:Name node is in safe mode 这是因为在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直 ...查看全部
将本地文件拷贝到hdfs上去,结果上错误:Name node is in safe mode

这是因为在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
 
可以通过以下命令来手动离开安全模式:
bin/hadoop dfsadmin -safemode leave  
用户可以通过dfsadmin -safemode value 来操作安全模式,参数value的说明如下:
enter - 进入安全模式
leave - 强制NameNode离开安全模式
get - 返回安全模式是否开启的信息
wait - 等待,一直到安全模式结束。

Hadoop fs命令学习小记

大数据 空心菜 发表了文章 0 个评论 4266 次浏览 2016-09-13 20:08 来自相关话题

1,hadoop fs –fs [local | ]:声明hadoop使用的文件系统,如果不声明的话,使用当前配置文件配置的,按如下顺序查找:hadoop jar里的hadoop-default.xml->[Math Proc ...查看全部
HDFS.png

1,hadoop fs –fs [local | ]:声明hadoop使用的文件系统,如果不声明的话,使用当前配置文件配置的,按如下顺序查找:hadoop jar里的hadoop-default.xml->[Math Processing Error]HADOOPCONFDIR下的hadoop−default.xml−>HADOOP_CONF_DIR下的hadoop-site.xml。使用local代表将本地文件系统作为hadoop的DFS。如果传递uri做参数,那么就是特定的文件系统作为DFS。

2,hadoop fs –ls :等同于本地系统的ls,列出在指定目录下的文件内容,支持pattern匹配。输出格式如filename(full path)     size.其中n代表replica的个数,size代表大小(单位bytes)。

3,hadoop fs –lsr :递归列出匹配pattern的文件信息,类似ls,只不过递归列出所有子目录信息。

4,hadoop fs –du :列出匹配pattern的指定的文件系统空间总量(单位bytes),等价于unix下的针对目录的du –sb /*和针对文件的du –b ,输出格式如name(full path)  size(in bytes)。

5,hadoop fs –dus :等价于-du,输出格式也相同,只不过等价于unix的du -sb。

6,hadoop fs –mv :将制定格式的文件 move到指定的目标位置。当src为多个文件时,dst必须是个目录。

7,hadoop fs –cp :拷贝文件到目标位置,当src为多个文件时,dst必须是个目录。

8,hadoop fs –rm [-skipTrash] :删除匹配pattern的指定文件,等价于unix下的rm

9,hadoop fs –rmr [skipTrash] :递归删掉所有的文件和目录,等价于unix下的rm –rf

10,hadoop fs –rmi [skipTrash] :等价于unix的rm –rfi

11,hadoop fs –put :从本地系统拷贝文件到DFS。

12,hadoop fs –copyFromLocal :等价于-put。

13,hadoop fs –moveFromLocal :等同于-put,只不过源文件在拷贝后被删除。

14,hadoop fs –get [-ignoreCrc] [-crc] :从DFS拷贝文件到本地文件系统,文件匹配pattern,若是多个文件,则dst必须是目录。

15,hadoop fs –getmerge :顾名思义,从DFS拷贝多个文件、合并排序为一个文件到本地文件系统。

16,hadoop fs –cat :展示文件内容。

17,hadoop fs –copyToLocal [-ignoreCrc] [-crc] :等价于-get。

18,hadoop fs –mkdir :在指定位置创建目录。

19,hadoop fs –setrep [-R] [-w] :设置文件的备份级别,-R标志控制是否递归设置子目录及文件。

20,hadoop fs –chmod [-R] PATH…:修改文件的权限,-R标记递归修改。MODE为a+r,g-w,+rwx等,OCTALMODE为755这样。

21,hadoop fs -chown [-R] [OWNER][:[GROUP]] PATH…:修改文件的所有者和组。-R表示递归。

22,hadoop fs -chgrp [-R] GROUP PATH…:等价于-chown … :GROUP …。

23,hadoop fs –count[-q] :计数文件个数及所占空间的详情,输出表格的列的含义依次为:DIR_COUNT,FILE_COUNT,CONTENT_SIZE,FILE_NAME或者如果加了-q的话,还会列出QUOTA,REMAINING_QUOTA,SPACE_QUOTA,REMAINING_SPACE_QUOTA。

最后就是万能的hadoop fs –help

Hadoop运维经验杂谈

大数据 chris 发表了文章 0 个评论 3288 次浏览 2016-04-07 00:57 来自相关话题

Hadoop在蓝汛 系统架构: Cloudera和它的产品们 Ap ...查看全部


Hadoop在蓝汛


hadoop.png

系统架构
arch.png


Cloudera和它的产品们


Apache Hadoop与CDH版本关系
hacdh.png

CDH为什么更好?
    []安装升级更简单:[/]
                 yum ,tar, rpm, cloudera manager 四种安装方法 
    []更快获取新功能和修正新bug[/][]年度release,季度update[/][]Yum安装自动匹配合适的生态系统版本[/][]自动目录配置(logs,conf),以及hdfs和mapred用户创建[/][]详细的文档[/]
CDH3u3重大改善
cdh3.png
CDH3u4重大改善
cdh4.png
Cloudera Manager
m1.png
m2.png
m3.png
Cloudera Training
    []关于Training[/]
                分为Administrator和Development两门课程
    []关于认证考试[/][]关于证书[/]

运维事故

1、伤不起的内存现象1
系统上线第二天,Jobtracker不工作,web页面打不开
原因
一次提交Job数量太多,导致Jobtracker 内存溢出
解决
调大JT内存;限制Running Job数量
现象2
NN内存溢出,重启后发现50030页面显示fsimage损坏,调查发现SNN fsimage同样损坏了
原因
小文件太多导致NN/SNN内存溢出,导致fsimage文件损坏,但是重启后的NN可以正常服务。
原因
Cloudera google group去救,获得后门脚本
2、低效的MapReduce Job现象
MapReduce Job执行时间过长
原因
MR中用到了Spring,小文件导致Map方法效率低下,GZ文件读写效率低
解决
MR去Spring化;开启JVM重用;使用LZO作为输入和map输出结果;加大reduce并行copy线程数
压缩与MapReduce性能
    []前提:大量小文件[/][]输入147GB,文件数45047,平均3MB[/][]CPU 8 core;32GB内存;7200转磁盘;28台Slave机器[/]
xn.png
 3、OMG,整个集群完蛋了现象
早上来发现所有DataNode都dead了,重启后10分钟,DN陆续又都dead了;调查发现节点有8%左右丢包率
原因
交换机模块故障;DN不能Hold住大量小文件
解决
升级3u2到3u4;设置DN内存到2GB
遇到无法跨越的问题解决办法
    []加入Hadoop官方Mail List[/][]加入Cloudera Google Group[/]

监控与告警

    []监控:ganglia[/][]设备告警、服务告警:nagios[/][]业务告警:自己实现[/]

monitor.png

Nagios告警:
nagios.png

业务监控:
mo1.png

mo2.png

mo3.png

Hbase/Hdfs删除节点

大数据 空心菜 发表了文章 0 个评论 9426 次浏览 2015-11-30 00:16 来自相关话题

线上有台服务器随时可能会挂掉,所以需要把在这个服务器上hbase的regionserver和hdfs的datanode节点移除。然后重新拿台新服务器部署接管。   之前在文章 http://openskill.cn/article/17 ...查看全部
线上有台服务器随时可能会挂掉,所以需要把在这个服务器上hbase的regionserver和hdfs的datanode节点移除。然后重新拿台新服务器部署接管。
 
之前在文章 http://openskill.cn/article/178 中讲到怎么新增一个hdfs的datanode,所以我先讲一下怎么添加一个hbase的regionserver,然后再讲怎么删除! 


添加hbase regionserver节点


添加步骤如下:
1、在hbase  master上修改regionservers文件
# cd hbase_install_dir/conf
# echo "new_hbase_node_hostname" >> ./regionservers
2、如果你hbase集群使用自身zk集群的话,还需要修改hbase-site.xml文件,反之不用操作!
# cd hbase_install_dir/conf
# vim hbase-site.xml
找到hbase.zookeeper.quorum属性 -->加入新节点
3、同步以上修改的文件到hbase的各个节点上
4、在新节点上启动hbase regionserver
# cd hbase_install_dir/bin/
# ./hbase-daemon.sh start regionserver
5、在hbasemaster启动hbase shell
用status命令确认一下集群情况
hbase新增一个 regionserver节点补充完成了,下面介绍删除hbase和hdfs节点!
 
集群上既部署有Hadoop,又部署有HBase,因为HBase存储是基于Hadoop HDFS的,所以先要移除HBase节点,之后再移除Hadoop节点。添加则反之。


移除hbase regionserver节点


1、在0.90.2之前,我们只能通过在要卸载的节点上执行;我的hbase版本(0.98.7)
# cd hbase_install_dir
# ./bin/hbase-daemon.sh stop regionserver
来实现。这条语句执行后,该RegionServer首先关闭其负载的所有Region而后关闭自己。在关闭时,RegionServer在ZooKeeper中的"Ephemeral Node"会失效。此时,Master检测到RegionServer挂掉并把它作为一个宕机节点,并将该RegionServer上的Region重新分配到其他RegionServer。
 
注意:使用此方法前,一定要关闭HBase Load Balancer。关闭方法:
hbase(main):001:0> balance_switch false
true
0 row(s) in 0.3290 seconds
总结:
这种方法很大的一个缺点是该节点上的Region会离线很长时间。因为假如该RegionServer上有大量Region的话,因为Region的关闭是顺序执行的,第一个关闭的Region得等到和最后一个Region关闭并Assigned后一起上线。这是一个相当漫长的时间。以我这次的实验为例,现在一台RegionServer平均有1000个Region,每个Region Assigned需要4s,也就是说光Assigned就至少需要1个小时。
2、自0.90.2之后,HBase添加了一个新的方法,即"graceful_stop",在你移除的服务器执行:
# cd hbase_install_dir
# ./bin/graceful_stop.sh hostname
该命令会自动关闭Load Balancer,然后Assigned Region,之后会将该节点关闭。除此之外,你还可以查看remove的过程,已经assigned了多少个Region,还剩多少个Region,每个Region 的Assigned耗时。
 
补充graceful stop的一些其他命令参数:
# ./bin/graceful_stop.sh
Usage: graceful_stop.sh [--config &conf-dir>] [--restart] [--reload] [--thrift] [--rest] &hostname>
thrift If we should stop/start thrift before/after the hbase stop/start
rest If we should stop/start rest before/after the hbase stop/start
restart If we should restart after graceful stop
reload Move offloaded regions back on to the stopped server
debug Move offloaded regions back on to the stopped server
hostname Hostname of server we are to stop
最终都需要我们手动打开load balancer:
hbase(main):001:0> balance_switch false
true
0 row(s) in 0.3590 seconds
然后再开启:
hbase(main):001:0> balance_switch true
false
0 row(s) in 0.3290 seconds
对比两种方法,建议使用"graceful_stop"来移除hbase RegionServer节点。
官网说明:http://hbase.apache.org/0.94/book/node.management.html​  http://hbase.apache.org/book.html#decommission​  


移除hdfs datanode节点


1、在core-site.xml文件下新增如下内容

dfs.hosts.exclude
/hdfs_install_dir/conf/excludes
2、创建exclude文件,把需要删除节点的主机名写入
# cd hdfs_install_dir/conf
# vim excludes
添加需要删除的节点主机名,比如 hdnode1 保存退出
3、 然后在namenode节点执行如下命令,强制让namenode重新读取配置文件,不需要重启集群。
# cd hdfs_install_dir/bin/
# ./hadoop dfsadmin -refreshNodes
它会在后台进行Block块的移动
 4、 查看状态
等待第三步的操作结束后,需要下架的机器就可以安全的关闭了。
# ./hadoop dfsadmin -report
可以查看到现在集群上连接的节点 
正在执行Decommission,会显示: 
Decommission Status : Decommission in progress

执行完毕后,会显示:
Decommission Status : Decommissioned
如下:
Name: 10.0.180.6:50010
Decommission Status : Decommission in progress
Configured Capacity: 917033340928 (10.83 TB)
DFS Used: 7693401063424 (7 TB)
Non DFS Used: 118121652224 (110.00 GB)
DFS Remaining: 4105510625280(3.63 TB)
DFS Used%: 64.56%
DFS Remaining%: 34.45%
Last contact: Mon Nov 29 23:53:52 CST 2015
也可以直接通过Hadoop 浏览器查看:
LIVE的节点可以查看到:http://master_ip:50070/dfsnodelist.jsp?whatNodes=LIVE
查看看到卸载的节点状态是:Decommission in progress
等待节点完成移除后,浏览:http://master_ip:50070/dfsnodelist.jsp?whatNodes=DEAD 结果如下:
hdead.png

完成后,删除的节点显示在dead nodes中。且其上的服务停止。Live Nodes中仅剩had2,had3
以上即为从Hadoop集群中Remove Node的过程,但是,有一点一定要注意:
hdfs-site.xml配置文件中dfs.replication值必须小于或者等于踢除节点后正常datanode的数量,即:
dfs.replication <= 集群所剩节点数
修改备份系数可以参考:http://heylinux.com/archives/2047.html


重载入删除的datanode节点 


1、修改namenode的core-site.xml文件,把我们刚刚加入的内容删除或者注释掉,我这里选择注释掉。
2、 再执行重载namenode的配置文件
# ./bin/hadoop dfsadmin -refreshNodes
3、最后去启动datanode上的datanode
# ./bin/hadoop-daemon.sh start datanode
starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-root-datanode-had1.out
4、查看启动情况
# jps
18653 Jps
19687 DataNode ---->启动正常
重新载入HBase RegionServer节点
只需要重启regionserver进程即可。
参考:http://www.edureka.co/blog/commissioning-and-decommissioning-nodes-in-a-hadoop-cluster/
           https://pravinchavan.wordpress.com/2013/06/03/removing-node-from-hadoop-cluster/

新增一个hdfs的DataNode节点

大数据 空心菜 发表了文章 1 个评论 11222 次浏览 2015-11-11 01:51 来自相关话题

场景 在hadoop中的分布式文件系统hdfs中,当存储节点磁盘使用达到预警值是,我们需要新增一个数据存储节点,来存储数据!我这里hdfs的版本是2.2.0!新增方法: []静态添加[/][]动态添加[/] ...查看全部


场景


在hadoop中的分布式文件系统hdfs中,当存储节点磁盘使用达到预警值是,我们需要新增一个数据存储节点,来存储数据!我这里hdfs的版本是2.2.0!
新增方法:
    []静态添加[/][]动态添加[/]


静态添加


静态新增的方式,就是相当于我们起初部署hdfs集群规划一样,停止NameNode,新增一个DateNode数据节点,这种方法不适用于线上提供服务的场景,具体操作如下:

1、停止NameNode节点
# cd hdfs_install_dir/sbin/
# ./hadoop-deamon.sh stop namenode

2、修改配置文件slaves文件,并修改/etc/hosts记录把新增的节点对应的ip和hostname追加到各节点
# cd hdfs_install_dir/etc/hadoop/
# echo "new_datanode_hostname" >> ./slaves
# echo "new_datanode_ip new_datanode_hostname" >> /etc/hosts
然后再利用rsync 同步配置文件和hosts文件,到各节点

3、确保Hadoop/HDFS集群的NameNode可以对新节点进行SSH免密码登录。

4、重新启动NameNode节点

5、如果你希望各数据节点磁盘使用量达到一个相对平衡的状态,就是百分比,你还需要执行hadoop balance命令,后面会具体讲到!


动态添加


动态添加,不需要停止启动NameNode节点,具体步骤如下:

1、修改所有hdfs集群机器的配置文件slaves文件,并修改/etc/hosts记录把新增的节点对应的ip和hostname追加到各节点
# cd hdfs_install_dir/etc/hadoop/
# echo "new_datanode_hostname" >> ./slaves
# echo "new_datanode_ip new_datanode_hostname" >> /etc/hosts

如果你使用ansible管理的话,hdfs集群的集群做一个叫hdfs的分组,两条命令搞定:
# ansible hdfs -m shell -a 'echo "new_datanode_hostname" >> hdfs_install_dir/etc/hadoop/slaves'
# ansible hdfs -m shell -a 'echo "new_datanode_ip new_datanode_hostname" >> /etc/hosts'
这样所有的节点slaves文件和host文件都更新了!

2、启动新增的datanode节点
# cd hdfs_install_dir/sbin
# ./hadoop-daemon.sh start datanode

3、查看是否正常加入到集群
web查看方式:http://NameNode_ip:50070/dfsnodelist.jsp?whatNodes=LIVE
命令查看方式:cd hdfs_install_dir/bin/ && ./hadoop dfsadmin -report

4、数据再平衡
添加新节点时,HDFS不会自动重新平衡。然而,HDFS提供了一个手动调用的重新平衡(reblancer)工具。这个工具将整个集群中的数据块分布调整到一个可人工配置的百分比阈值。如果在其他现有的节点上有空间存储问题,再平衡就会根据阀值,然后平衡分布数据。

执行再平衡命令,可选参数-threshold指定了磁盘容量的余量百分比,用来判定一个节点的磁盘利用率是过低还是过高。一个利用不足的数据节点其利用率低于平均利用率−阈值。过度利用的数据节点其利用率高于平均利用率+阈值。该参数设置的越小,整个集群越平衡,但会花费更多的时间进行再平衡操作。默认阈值为10%。平衡执行命令如下:
# cd hdfs_install_dir/sbin/
# ./start-balancer.sh -threshold 5

-threshold参数就是是指定平衡的阈值。
-threshold的默认是10,即每个datanode节点的实际hdfs存储使用量/集群hdfs存储量

具体解释例子如下:
datanode hdfs使用量1000G;
集群总hdfs存储量10T即10000G;
则t值为1000/10000 = 0.1 = 10%
当执行balance的-t参数小于0.1时,集群进行balance;
命令为:start-balancer.sh -threshold 10 ;
Expecting a number in the range of [1.0, 100.0]: 5%
sh $HADOOP_HOME/bin/start-balancer.sh –t 10%
这个命令中-t参数后面跟的是HDFS达到平衡状态的磁盘使用率偏差值。如果机器与机器之间磁盘使用率偏差小于10%,那么我们就认为HDFS集群已经达到了平衡的状态。


标注知识点


1、 balance命令可以在namenode或者datanode上启动,也可以随时利用stop-balance.sh脚本停止平衡! 

2、balance的默认带宽是1M/s。 如果你希望修改平衡数据的带宽大小可以用./hdfs dfsadmin -setBalancerBandwidth 124288000命令指定

3、slave文件是用于重启时使用。集群的start和stop需要读取slave文件。启用datanode时只要在hdfs-site中配置了namenode位置,就可以将信息push给namenode。 这就是为什么slaves文件很重要的原因。

HDFS高可用方案之QJM

大数据 OpenSkill 发表了文章 0 个评论 3547 次浏览 2015-09-12 20:18 来自相关话题

喜欢一个人,可以为TA做任何事,得到不接受却依然心甘情愿鞍前马后,苦苦等候那一线希望。对,这就是备胎,挂在汽车背后,可能一辈子也用不到的那个圆圈状的玩意儿,大部分情况下,它都会默默地挂在那里,等待几千分之一的机会,有个倒霉的轮子兄弟出事了,于是它就能派上用场了 ...查看全部
喜欢一个人,可以为TA做任何事,得到不接受却依然心甘情愿鞍前马后,苦苦等候那一线希望。对,这就是备胎,挂在汽车背后,可能一辈子也用不到的那个圆圈状的玩意儿,大部分情况下,它都会默默地挂在那里,等待几千分之一的机会,有个倒霉的轮子兄弟出事了,于是它就能派上用场了……(摘自豆瓣)
 
在Hadoop的分布式文件系统HDFS中,NameNode用来保存文件系统的元数据(包含目录结构/数据块位置等),如果NameNode上的数据丢失,HDFS上对应的文件数据就无法找回来了。Hadoop在2.0.0之前的版本,使用SecondaryNameNode备份NameNode的数据,但SecondaryNameNode无法转成NameNode,如果NameNode挂了,整个HDFS就会挂掉,无法实现真正的failover。这篇博文总结了5种Hadoop HA(High Available,高可用)方案,Hadoop2之后官方引入了QJM(Quorum Journal Manager)和NFS用于NameNode的备份和切换。本方将介绍的是QJM方案,它使用第二个NameNode实时同步当前NameNode的数据,相比于SecondaryNameNode,他可以随时切换成为真正的NameNode(一个可转正的高级备胎)。
 
先看看没有HA的HDFS的系统架构(用draw.io画的,尼马这么好的网站也被墙了):
hd21.png

然后有HA方案的系统架构:
hd22.png

以下的实验基于4个节点的Hadoop集群。其中每个节点的运行的进程列表如下:
hd23.png

实验环境中,所有节点的运行环境基本相同:
    []Ubuntu14.04 X64[/][]4G内存[/][]OpenJDK-1.7.0[/][]100Mbps以太网[/]
下面是实现这个系统的流程(官方文档+个人注解+辅助Shell命令)。

[list=1]

  • 安装Hadoop系统
  • 严格按照单节点搭建集群搭建两个步骤,系统建起来完全没压力。我遇到的问题是刚开始在配置文件(salves和core-site.xml等文件)中使用的是ip地址而非主机名,然后在log文件里看到各种无法连接。解决方案是修改主机名并在hosts文件里建立映射关系。
    hostname {new_hostname} # 修改主机名,只有当前Session有效sudo vi /etc/hostname   # 永久修改主机名的方法
    另外,对于64位的系统,最好重新编译源码。

    [list=1]

  • 修改配置文件
  • hdfs-site.xml文件:
          dfs.namenode.name.dir    /data/hadoop/namenode        dfs.datanode.data.dir    /data/hadoop/datanode        dfs.replication    2        dfs.nameservices    mycluster        dfs.ha.namenodes.mycluster    nn1,nn2        dfs.namenode.rpc-address.mycluster.nn1    hd1:8020        dfs.namenode.rpc-address.mycluster.nn2    hd3:8020        dfs.namenode.http-address.mycluster.nn1    hd1:50070        dfs.namenode.http-address.mycluster.nn2    hd3:50070        dfs.namenode.shared.edits.dir    qjournal://hd1:8485;hd2:8485;hd4:8485/mycluster        dfs.client.failover.proxy.provider.mycluster    org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider        dfs.ha.fencing.methods    sshfence        dfs.ha.fencing.ssh.private-key-files    /home/hduser/.ssh/id_rsa        dfs.journalnode.edits.dir    /data/hadoop/journalnode  
      []其中nameservices是集群的命名空间,即使有多个集群,可以共用配置文件,但是要注意某些配置项的顺序。[/][]dfs.ha.namenodes.mycluster中的mycluster是可以任取的,但是要和dfs.nameservices对应。[/][]dfs.namenode.rpc-address.mycluster.nn1参考上一条。[/][]dfs.namenode.shared.edits.dir值的格式是"qjournal://host1:port1;host2:port2;host3:port3/journalId",用来指定对应的JN节点,journalId建议使用和nameservices相同的名称。[/][]dfs.client.failover.proxy.provider.mycluster指定激活NameNode的Java类,目前Hadoop内置的只有上面那个。[/][]dfs.ha.fencing.methods是来用来隔离失效的NameNode的方法,有sshfence和Shell两种方式。sshfence需要配置dfs.ha.fencing.ssh.private-key-files私钥文件,以便交互的过程不需要输入密码。[/][]dfs.journalnode.edits.dir是JN保存数据的文件。[/]
     core-site.xml文件:
                fs.defaultFS        hdfs://mycluster    
      []注意mycluster要和dhfs-site.xml中的dfs.nameservices对应。fs.defaultFS不用端口号。[/]
     

    [list=1]

  • 部署
  • 改好配置文件好,就要将配置文件同步到所有的机器上了。可以用rsync将文件同步到多台机器上。rsync是一个增量同步工具,需要先安装。下面的rsync.sh的功能是将当前目录的所有文件发送到文件或参数对应的机器上。
    $ cat rsync.sh #! /bin/bashdir=`pwd`pdir=`dirname $dir`send(){    echo "Sending to $2:$1"    rsync -avez -e ssh $1 $2:$3}mul_send(){    while read host    do        send $dir $host $pdir    done < $1}[ -f $1 ] && mul_send $1 || send $dir $1 $pdir
    将rsync.sh放在etc/hadoop目录下,进入目录运行
    chmod +x rsync.sh./rsync.sh slaves# or ./rsync.sh hostname
    发送完文件之后,就是启动系统。步骤如下: 启动JNs.在所有JournalNode上运行
    sbin/hadoop-daemon.sh --script hdfs start journalnode
    启动NameNode. 在原NameNode上运行
    bin/hadoop --script hdfs start namenode # NameNode需要已经format。[url=使用上面的rsync.sh文件]/code[/url]将原NameNode(nn1)上的数据复制到第二个NameNode(nn2)。然后在nn2上运行:[code]bin/hdfs namenode -bootstrapStandby
    启动其他节点在NameNode上运行
    sbin/start-dfs.sh

    [list=1]

  • 切换NameNode

  • 手动方式

    上面的NameNode默认以standby的状态启动,这时因为没有active的NameNode,所以是不能在HDFS读写文件,需要将其中的一个转成active状态。比如将nn1(对应前面的配置)转成Active:
    bin/hdfs haadmin -transitionToActive nn1
    然后在NameNode的web页面上部的括号里的standby变成active。
    转成standby的命令是:
    bin/hdfs haadmin -transitionToStandby nn1
     
    自动切换
    在当前NameNode不能使用时自动切换到第二个NameNode上,需要借助于ZooKeeper[url=ZK]/url

    ZK的安装过程和Hadoop差不多,就是下载文件、修改配置、复制到所有机器、启动。具体步骤在这里。

    配置文件conf/zoo.conf:
    tickTime=2000
    dataDir=/data/hadoop/zookeeper
    clientPort=2181
    initLimit=5
    syncLimit=2
    server.1=hd2:2888:3888
    server.2=hd3:2888:3888
    server.3=hd4:2888:3888
    hd2,hd3,hd4是主机名,至少需要三台,这个在一台机挂了整个系统还能用,ZK的数量一般是奇数,为什么为奇数可以参考这里。
     
    然后要在hdfs-site.xml上添加配置:

    dfs.ha.automatic-failover.enabled
    true


    ha.zookeeper.quorum
    hd2:2181,hd3:2181,hd4:2181
    然后就是在NameNode的机器上初始化NameNode在ZK的状态了:
    bin/hdfs zkfc -formatZK
    重启HDFS或手动启动DFSZKFailoverController(ZKFC):
    sbin/stop-dfs.sh # 重启hdfs
    sbin/start-dfs.sh
    sbin/hadoop-daemon.sh start zkfc # 启动ZKFC
    在该HA方案中,每一个NameNode都有一个对应的ZKFC。ZKFC会随NameNode启动。
     
    测试
     
    在当前NameNode运行jps看NameNode的进程ID,然后kill掉。通过Web页面( http://hdx:50070 ),可以看到standby的NameNode几乎在kill的同时转成active了。
    转载地址:原文地址

    CDH Hadoop + HBase HA 部署详解

    大数据 空心菜 发表了文章 0 个评论 8140 次浏览 2016-11-07 21:07 来自相关话题

    CDH 的部署和 Apache Hadoop 的部署是没有任何区别的。这里着重的是 HA的部署,需要特殊说明的是NameNode HA 需要依赖 Zookeeper。 准备Hosts文件配置: ...查看全部

    CDH 的部署和 Apache Hadoop 的部署是没有任何区别的。这里着重的是 HA的部署,需要特殊说明的是NameNode HA 需要依赖 Zookeeper。


    准备

    Hosts文件配置:


    cat > /etc/hosts << _HOSTS_
    127.0.0.1 localhost
    10.0.2.59 cdh-m1
    10.0.2.60 cdh-m2
    10.0.2.61 cdh-s1
    _HOSTS_

    各个节点服务情况


    cdh-m1 Zookeeper JournalNode NameNode DFSZKFailoverController HMaster
    cdh-m2 Zookeeper JournalNode NameNode DFSZKFailoverController HMaster
    cdh-s1 Zookeeper JournalNode DataNode HRegionServer

    对几个新服务说明下:


    • JournalNode 用于同步 NameNode 元数据,和 Zookeeper 一样需要 2N+1个节点存活集群才可用;
    • DFSZKFailoverController(ZKFC) 用于主备切换,类似 Keepalived 所扮演的角色。

    NTP 服务

    设置时区


    rm -f /etc/localtime
    ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

    配置NTP Server


    yum install -y ntp
    cat > /etc/ntp.conf << _NTP_
    driftfile /var/lib/ntp/drift

    restrict default nomodify
    restrict -6 default nomodify

    server cn.ntp.org.cn prefer
    server news.neu.edu.cn iburst
    server dns.sjtu.edu.cn iburst
    server 127.127.1.1 iburst

    tinker dispersion 100
    tinker step 1800
    tinker stepout 3600
    includefile /etc/ntp/crypto/pw

    keys /etc/ntp/keys
    _NTP_

    # NTP启动时立即同步
    cat >> /etc/ntp/step-tickers << _NTP_
    server cn.ntp.org.cn prefer
    server news.neu.edu.cn iburst
    server dns.sjtu.edu.cn iburst
    _NTP_

    # 同步硬件时钟
    cat >> /etc/sysconfig/ntpd << _NTPHW_
    SYNC_HWCLOCK=yes
    _NTPHW_

    启动并设置开机自启动


    /etc/init.d/ntpd start
    chkconfig ntpd on

    配置 NTP Client


    yum install -y ntp
    # 注意修改内网NTP Server地址
    cat > /etc/ntp.conf << _NTP_
    driftfile /var/lib/ntp/drift

    restrict default nomodify
    restrict -6 default nomodify

    restrict 127.0.0.1
    restrict -6 ::1

    server 10.0.2.59 prefer

    tinker dispersion 100
    tinker step 1800
    tinker stepout 3600
    includefile /etc/ntp/crypto/pw

    keys /etc/ntp/keys
    _NTP_

    # NTP启动时立即同步
    cat >> /etc/ntp/step-tickers << _NTP_
    server 10.0.2.59 prefer
    _NTP_

    # 同步硬件时钟
    cat >> /etc/sysconfig/ntpd << _NTPHW_
    SYNC_HWCLOCK=yes
    _NTPHW_

    启动并设置开机自启动


    /etc/init.d/ntpd start
    chkconfig ntpd on

    检查 NTP 同步


    ntpq -p

    # 结果
    remote refid st t when poll reach delay offset jitter
    ==============================================================================
    *time7.aliyun.co 10.137.38.86 2 u 17 64 3 44.995 5.178 0.177
    news.neu.edu.cn .INIT. 16 u - 64 0 0.000 0.000 0.000
    202.120.2.90 .INIT. 16 u - 64 0 0.000 0.000 0.000

    JDK配置

    创建目录


    mkdir -p /data/{install,app,logs,pid,appData}
    mkdir /data/appData/tmp

    cd /data/install
    wget -c http://oracle.com/jdk-7u51-linux-x64.gz
    tar xf jdk-7u51-linux-x64.gz -C /data/app
    cd /data/app
    ln -s jdk1.7.0_51 jdk1.7
    cat >> /etc/profile << _PATH_
    export JAVA_HOME=/data/app/jdk1.7
    export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
    export PATH=\$JAVA_HOME/bin:\$PATH
    _PATH_
    source /etc/profile

    创建运行账户


    useradd -u 600 run

    下载 安装包

    # http://archive.cloudera.com/cdh5/cdh/5/
    cd /data/install
    wget -c http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.4.5.tar.gz
    wget -c http://archive.apache.org/dist/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz
    wget -c http://archive.cloudera.com/cdh5/cdh/5/hbase-1.0.0-cdh5.4.5.tar.gz

    安装 Zookeeper

    cd /data/install
    tar xf zookeeper-3.4.5.tar.gz -C /data/app
    cd /data/app
    ln -s zookeeper-3.4.5 zookeeper

    设置环境变量


    sed -i '/^export PATH=/i\export ZOOKEEPER_HOME=/data/app/zookeeper' /etc/profile
    sed -i 's#export PATH=#&\$ZOOKEEPER_HOME/bin:#' /etc/profile
    source /etc/profile

    删除无用文件


    cd $ZOOKEEPER_HOME
    rm -rf *xml *txt zookeeper-3.4.5.jar.* src recipes docs dist-maven contrib
    rm -f $ZOOKEEPER_HOME/bin/*.cmd $ZOOKEEPER_HOME/bin/*.txt
    rm -f $ZOOKEEPER_HOME/conf/zoo_sample.cfg

    创建数据目录


    mkdir -p /data/appData/zookeeper/{data,logs}

    配置


    cat > $ZOOKEEPER_HOME/conf/zoo.cfg << _ZOO_
    tickTime=2000
    initLimit=10
    syncLimit=5
    clientPort=2181
    dataDir=/data/appData/zookeeper/data
    dataLogDir=/data/appData/zookeeper/logs
    server.1=cdh-m1:2888:3888
    server.2=cdh-m2:2888:3888
    server.3=cdh-s1:2888:3888
    _ZOO_

    修改Zookeeper的日志打印方式,与日志路径设置, 编辑


    $ZOOKEEPER_HOME/bin/zkEnv.sh

    在27行后加入两个变量


    ZOO_LOG_DIR=/data/logs/zookeeper
    ZOO_LOG4J_PROP="INFO,ROLLINGFILE"

    创建 myid文件


    # 注意myid与配置文件保持一致
    echo 1 >/data/appData/zookeeper/data/myid

    设置目录权限


    chown -R run.run /data/{app,appData,logs}

    启动、停止


    # 启动
    runuser - run -c 'zkServer.sh start'
    # 停止
    runuser - run -c 'zkServer.sh stop'

    安装 Hadoop

    tar xf hadoop-2.6.0-cdh5.4.5.tar.gz -C /data/app
    cd /data/app
    ln -s hadoop-2.6.0-cdh5.4.5 hadoop

    设置环境变量


    sed -i '/^export PATH=/i\export HADOOP_HOME=/data/app/hadoop' /etc/profile
    sed -i 's#export PATH=#&\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin:#' /etc/profile
    source /etc/profile

    删除无用文件


    cd $HADOOP_HOME
    rm -rf *txt share/doc src examples* include bin-mapreduce1 cloudera
    find . -name "*.cmd"|xargs rm -f

    新建数据目录


    mkdir -p /data/appData/hdfs/{name,edits,data,jn,tmp}

    配置

    切换到配置文件目录


    cd $HADOOP_HOME/etc/hadoop

    编辑 core-site.xml


    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <!-- HDFS 集群名称,可指定端口 -->
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hdfs-cdh</value>
    </property>

    <!-- 临时文件目录 -->
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/data/appData/hdfs/tmp</value>
    </property>

    <!-- 回收站设置,0不启用回收站,1440 表示1440分钟后删除 -->
    <property>
    <name>fs.trash.interval</name>
    <value>1440</value>
    </property>

    <!-- SequenceFiles在读写中可以使用的缓存大小,单位 bytes 默认 4096 -->
    <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
    </property>

    <!-- 可用压缩算法,启用在hdfs-site.xml中,需要编译动态链接库才能用 -->
    <property>
    <name>io.compression.codecs</name>
    <value>org.apache.hadoop.io.compress.SnappyCodec</value>
    </property>
    </configuration>

    编辑 hdfs-site.xml


    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <!-- 指定hdfs 集群名称,需要和core-site.xml中的保持一致 -->
    <property>
    <name>dfs.nameservices</name>
    <value>hdfs-cdh</value>
    </property>

    <!-- 指定 Zookeeper 用于NameNode HA,默认官方配置在core-site.xml中,为了查看清晰配置到hdfs-site.xml也是可用的 -->
    <property>
    <name>ha.zookeeper.quorum</name>
    <value>cdh-m1:2181,cdh-m2:2181,cdh-s1:2181</value>
    </property>

    <!-- hdfs-cdh 下有两个NameNode,分别为 nn1,nn2 -->
    <property>
    <name>dfs.ha.namenodes.hdfs-cdh</name>
    <value>nn1,nn2</value>
    </property>

    <!-- nn1 RPC通信地址 -->
    <property>
    <name>dfs.namenode.rpc-address.hdfs-cdh.nn1</name>
    <value>cdh-m1:9000</value>
    </property>

    <!-- nn1 HTTP通信地址 -->
    <property>
    <name>dfs.namenode.http-address.hdfs-cdh.nn1</name>
    <value>cdh-m1:50070</value>
    </property>

    <!-- nn2 RPC通信地址 -->
    <property>
    <name>dfs.namenode.rpc-address.hdfs-cdh.nn2</name>
    <value>cdh-m2:9000</value>
    </property>

    <!-- nn2 HTTP通信地址 -->
    <property>
    <name>dfs.namenode.http-address.hdfs-cdh.nn2</name>
    <value>cdh-m2:50070</value>
    </property>

    <!-- 指定NameNode元数据在JournalNode上的存储路径 -->
    <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://cdh-m1:8485;cdh-m2:8485;cdh-s1:8485;/hdfs-cdh</value>
    </property>

    <!-- 开启NameNode失败自动切换 -->
    <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
    </property>

    <!-- 配置主备切换实现方式 -->
    <property>
    <name>dfs.client.failover.proxy.provider.hdfs-cdh</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <!-- 配置主备切换方法,每个方法一行-->
    <property>
    <name>dfs.ha.fencing.methods</name>
    <value>
    sshfence
    shell(/bin/true)
    </value>
    </property>

    <!-- 指定运行用户的秘钥,需要NameNode双向免密码登录,用于主备自动切换 -->
    <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/run/.ssh/id_rsa</value>
    </property>

    <!-- 配置sshfence 超时时间 -->
    <property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>50000</value>
    </property>

    <!-- NameNode 数据本地存储路径 -->
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>/data/appData/hdfs/name</value>
    </property>

    <!-- DataNode 数据本地存储路径 -->
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>/data/appData/hdfs/data</value>
    </property>

    <!-- JournalNode 数据本地存储路径 -->
    <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/data/appData/hdfs/jn</value>
    </property>

    <!-- 修改文件存储到edits,定期同步到DataNode -->
    <property>
    <name>dfs.namenode.edits.noeditlogchannelflush</name>
    <value>true</value>
    </property>

    <!-- edits 数据本地存储路径 -->
    <property>
    <name>dfs.namenode.edits.dir</name>
    <value>/data/appData/hdfs/edits</value>
    </property>

    <!-- 开启Block Location metadata允许impala知道数据块在哪块磁盘上 默认关闭 -->
    <property>
    <name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
    <value>true</value>
    </property>

    <!-- 权限检查 默认开启 -->
    <property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
    </property>

    <!-- block 大小设置 -->
    <property>
    <name>dfs.blocksize</name>
    <value>64m</value>
    </property>
    </configuration>

    小于5个DataNode建议添加如下配置


    <!-- 数据副本数量,不能超过DataNode数量,大集群建议使用默认值 默认 3 -->
    <property>
    <name>dfs.replication</name>
    <value>2</value>
    </property>

    <!-- 当副本写入失败时不分配新节点,小集群适用 -->
    <property>
    <name>dfs.client.block.write.replace-datanode-on-failure.policy</name>
    <value>NEVER</value>
    </property>

    在 hadoop-env.sh 中添加如下变量


    export JAVA_HOME=/data/app/jdk1.7
    export HADOOP_LOG_DIR=/data/logs/hadoop
    export HADOOP_PID_DIR=/data/pid
    # SSH端口 可选
    export HADOOP_SSH_OPTS="-p 22"

    Heap 设置,单位 MB


    export HADOOP_HEAPSIZE=1024

    权限设置


    chown -R run.run /data/{app,appData,logs}
    chmod 777 /data/pid

    格式化

    格式化只需要执行一次,格式化之前启动Zookeeper


    切换用户


    su - run

    启动所有 JournalNode


    hadoop-daemon.sh start journalnode

    格式化 Zookeeper(为 ZKFC 创建znode)


    hdfs zkfc -formatZK

    NameNode 主节点格式化并启动


    hdfs namenode -format
    hadoop-daemon.sh start namenode

    NameNode 备节点同步数据并启动


    hdfs namenode -bootstrapStandby
    hadoop-daemon.sh start namenode

    启动 ZKFC


    hadoop-daemon.sh start zkfc

    启动 DataNode


    hadoop-daemon.sh start datanode

    启动与停止

    切换用户


    su - run

    集群批量启动
    需要配置运行用户ssh-key免密码登录,与$HADOOP_HOME/etc/hadoop/slaves


    # 启动
    start-dfs.sh
    # 停止
    stop-dfs.sh

    单服务启动停止
    启动HDFS

    hadoop-daemon.sh start journalnode
    hadoop-daemon.sh start namenode
    hadoop-daemon.sh start zkfc
    hadoop-daemon.sh start datanode

    停止HDFS


    hadoop-daemon.sh stop datanode
    hadoop-daemon.sh stop namenode
    hadoop-daemon.sh stop journalnode
    hadoop-daemon.sh stop zkfc

    测试

    HDFS HA 测试
    打开 NameNode 状态页:
    http://cdh-m1:50010
    http://cdh-m2:50010


    在 Overview 后面能看见 active 或 standby,active 为当前 Master,停止 active 上的 NameNode,检查 standby是否为 active。


    HDFS 测试


    hadoop fs -mkdir /test
    hadoop fs -put /etc/hosts /test
    hadoop fs -ls /test

    结果:


    -rw-r--r--   2 java supergroup         89 2016-06-15 10:30 /test/hosts
    # 其中权限后面的列(这里的2)代表文件总数,即副本数量。

    HDFS 管理命令


    # 动态加载 hdfs-site.xml
    hadoop dfsadmin -refreshNodes

    HBase安装配置

    cd /data/install
    tar xf hbase-1.0.0-cdh5.4.5.tar.gz -C /data/app
    cd /data/app
    ln -s hbase-1.0.0-cdh5.4.5 hbase

    设置环境变量


    sed -i '/^export PATH=/i\export HBASE_HOME=/data/app/hbase' /etc/profile
    sed -i 's#export PATH=#&\$HBASE_HOME/bin:#' /etc/profile
    source /etc/profile

    删除无用文件


    cd $HBASE_HOME
    rm -rf *.txt pom.xml src docs cloudera dev-support hbase-annotations hbase-assembly hbase-checkstyle hbase-client hbase-common hbase-examples hbase-hadoop2-compat hbase-hadoop-compat hbase-it hbase-prefix-tree hbase-protocol hbase-rest hbase-server hbase-shell hbase-testing-util hbase-thrift
    find . -name "*.cmd"|xargs rm -f

    配置
    进入配置文件目录

    cd $HBASE_HOME/conf

    编辑 hbase-site.xml


    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <!-- HBase 数据存储路径 -->
    <property>
    <name>hbase.rootdir</name>
    <value>hdfs://hdfs-cdh/hbase</value>
    </property>

    <!-- 完全分布式模式 -->
    <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
    </property>

    <!-- HMaster 节点 -->
    <property>
    <name>hbase.master</name>
    <value>cdh-m1:60000,cdh-m2:60000</value>
    </property>

    <!-- Zookeeper 节点 -->
    <property>
    <name>hbase.zookeeper.quorum</name>
    <value>cdh-m1:2181,cdh-m2:2181,cdh-s1:2181</value>
    </property>

    <!-- znode 路径,Zookeeper集群中有多个HBase集群需要设置不同znode -->
    <property>
    <name>zookeeper.znode.parent</name>
    <value>/hbase</value>
    </property>

    <!-- HBase 协处理器 -->
    <property>
    <name>hbase.coprocessor.user.region.classes</name>
    <value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>
    </property>
    </configuration>

    在 hbase-env.sh 中添加如下变量


    export JAVA_HOME=/data/app/jdk1.7
    export HBASE_LOG_DIR=/data/logs/hbase
    export HBASE_PID_DIR=/data/pid
    export HBASE_MANAGES_ZK=false
    # SSH 默认端口 可选
    export HBASE_SSH_OPTS="-o ConnectTimeout=1 -p 36000"

    Heap 设置,单位 MB


    export HBASE_HEAPSIZE=1024

    可选设置 regionservers 中添加所有RegionServer主机名,用于集群批量启动、停止。


    启动与停止
    切换用户

    su - run

    集群批量启动
    需要配置运行用户ssh-key免密码登录,与$HBASE_HOME/conf/regionservers


    # 启动
    start-hbase.sh
    # 停止
    stop-hbase.sh

    单服务启动停止
    HMaster

    # 启动
    hbase-daemon.sh start master
    # 停止
    hbase-daemon.sh stop master

    HRegionServer


    # 启动
    hbase-daemon.sh start regionserver
    # 停止
    hbase-daemon.sh stop regionserver

    测试
    HBase HA 测试
    浏览器打开两个HMaster状态页:
    http://cdh-m1:60010
    http://cdh-m2:60010


    可以在Master后面看见其中一个主机名,Backup Masters中看见另一个。
    停止当前Master,刷新另一个HMaster状态页会发现Master后面已经切换,HA成功。

    HBase 测试
    进入hbase shell 执行:

    create 'users','user_id','address','info'
    list
    put 'users','anton','info:age','24'
    get 'users','anton'

    # 最终结果
    COLUMN CELL
    info:age timestamp=1465972035945, value=24
    1 row(s) in 0.0170 seconds

    清除测试数据:


    disable 'users'
    drop 'users'

    到这里安装就全部完成。

    Hbase/Hdfs删除节点

    大数据 空心菜 发表了文章 0 个评论 9426 次浏览 2015-11-30 00:16 来自相关话题

    线上有台服务器随时可能会挂掉,所以需要把在这个服务器上hbase的regionserver和hdfs的datanode节点移除。然后重新拿台新服务器部署接管。   之前在文章 http://openskill.cn/article/17 ...查看全部
    线上有台服务器随时可能会挂掉,所以需要把在这个服务器上hbase的regionserver和hdfs的datanode节点移除。然后重新拿台新服务器部署接管。
     
    之前在文章 http://openskill.cn/article/178 中讲到怎么新增一个hdfs的datanode,所以我先讲一下怎么添加一个hbase的regionserver,然后再讲怎么删除! 


    添加hbase regionserver节点


    添加步骤如下:
    1、在hbase  master上修改regionservers文件
    # cd hbase_install_dir/conf
    # echo "new_hbase_node_hostname" >> ./regionservers
    2、如果你hbase集群使用自身zk集群的话,还需要修改hbase-site.xml文件,反之不用操作!
    # cd hbase_install_dir/conf
    # vim hbase-site.xml
    找到hbase.zookeeper.quorum属性 -->加入新节点
    3、同步以上修改的文件到hbase的各个节点上
    4、在新节点上启动hbase regionserver
    # cd hbase_install_dir/bin/
    # ./hbase-daemon.sh start regionserver
    5、在hbasemaster启动hbase shell
    用status命令确认一下集群情况
    hbase新增一个 regionserver节点补充完成了,下面介绍删除hbase和hdfs节点!
     
    集群上既部署有Hadoop,又部署有HBase,因为HBase存储是基于Hadoop HDFS的,所以先要移除HBase节点,之后再移除Hadoop节点。添加则反之。


    移除hbase regionserver节点


    1、在0.90.2之前,我们只能通过在要卸载的节点上执行;我的hbase版本(0.98.7)
    # cd hbase_install_dir
    # ./bin/hbase-daemon.sh stop regionserver
    来实现。这条语句执行后,该RegionServer首先关闭其负载的所有Region而后关闭自己。在关闭时,RegionServer在ZooKeeper中的"Ephemeral Node"会失效。此时,Master检测到RegionServer挂掉并把它作为一个宕机节点,并将该RegionServer上的Region重新分配到其他RegionServer。
     
    注意:使用此方法前,一定要关闭HBase Load Balancer。关闭方法:
    hbase(main):001:0> balance_switch false
    true
    0 row(s) in 0.3290 seconds
    总结:
    这种方法很大的一个缺点是该节点上的Region会离线很长时间。因为假如该RegionServer上有大量Region的话,因为Region的关闭是顺序执行的,第一个关闭的Region得等到和最后一个Region关闭并Assigned后一起上线。这是一个相当漫长的时间。以我这次的实验为例,现在一台RegionServer平均有1000个Region,每个Region Assigned需要4s,也就是说光Assigned就至少需要1个小时。
    2、自0.90.2之后,HBase添加了一个新的方法,即"graceful_stop",在你移除的服务器执行:
    # cd hbase_install_dir
    # ./bin/graceful_stop.sh hostname
    该命令会自动关闭Load Balancer,然后Assigned Region,之后会将该节点关闭。除此之外,你还可以查看remove的过程,已经assigned了多少个Region,还剩多少个Region,每个Region 的Assigned耗时。
     
    补充graceful stop的一些其他命令参数:
    # ./bin/graceful_stop.sh
    Usage: graceful_stop.sh [--config &conf-dir>] [--restart] [--reload] [--thrift] [--rest] &hostname>
    thrift If we should stop/start thrift before/after the hbase stop/start
    rest If we should stop/start rest before/after the hbase stop/start
    restart If we should restart after graceful stop
    reload Move offloaded regions back on to the stopped server
    debug Move offloaded regions back on to the stopped server
    hostname Hostname of server we are to stop
    最终都需要我们手动打开load balancer:
    hbase(main):001:0> balance_switch false
    true
    0 row(s) in 0.3590 seconds
    然后再开启:
    hbase(main):001:0> balance_switch true
    false
    0 row(s) in 0.3290 seconds
    对比两种方法,建议使用"graceful_stop"来移除hbase RegionServer节点。
    官网说明:http://hbase.apache.org/0.94/book/node.management.html​  http://hbase.apache.org/book.html#decommission​  


    移除hdfs datanode节点


    1、在core-site.xml文件下新增如下内容

    dfs.hosts.exclude
    /hdfs_install_dir/conf/excludes
    2、创建exclude文件,把需要删除节点的主机名写入
    # cd hdfs_install_dir/conf
    # vim excludes
    添加需要删除的节点主机名,比如 hdnode1 保存退出
    3、 然后在namenode节点执行如下命令,强制让namenode重新读取配置文件,不需要重启集群。
    # cd hdfs_install_dir/bin/
    # ./hadoop dfsadmin -refreshNodes
    它会在后台进行Block块的移动
     4、 查看状态
    等待第三步的操作结束后,需要下架的机器就可以安全的关闭了。
    # ./hadoop dfsadmin -report
    可以查看到现在集群上连接的节点 
    正在执行Decommission,会显示: 
    Decommission Status : Decommission in progress

    执行完毕后,会显示:
    Decommission Status : Decommissioned
    如下:
    Name: 10.0.180.6:50010
    Decommission Status : Decommission in progress
    Configured Capacity: 917033340928 (10.83 TB)
    DFS Used: 7693401063424 (7 TB)
    Non DFS Used: 118121652224 (110.00 GB)
    DFS Remaining: 4105510625280(3.63 TB)
    DFS Used%: 64.56%
    DFS Remaining%: 34.45%
    Last contact: Mon Nov 29 23:53:52 CST 2015
    也可以直接通过Hadoop 浏览器查看:
    LIVE的节点可以查看到:http://master_ip:50070/dfsnodelist.jsp?whatNodes=LIVE
    查看看到卸载的节点状态是:Decommission in progress
    等待节点完成移除后,浏览:http://master_ip:50070/dfsnodelist.jsp?whatNodes=DEAD 结果如下:
    hdead.png

    完成后,删除的节点显示在dead nodes中。且其上的服务停止。Live Nodes中仅剩had2,had3
    以上即为从Hadoop集群中Remove Node的过程,但是,有一点一定要注意:
    hdfs-site.xml配置文件中dfs.replication值必须小于或者等于踢除节点后正常datanode的数量,即:
    dfs.replication <= 集群所剩节点数
    修改备份系数可以参考:http://heylinux.com/archives/2047.html


    重载入删除的datanode节点 


    1、修改namenode的core-site.xml文件,把我们刚刚加入的内容删除或者注释掉,我这里选择注释掉。
    2、 再执行重载namenode的配置文件
    # ./bin/hadoop dfsadmin -refreshNodes
    3、最后去启动datanode上的datanode
    # ./bin/hadoop-daemon.sh start datanode
    starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-root-datanode-had1.out
    4、查看启动情况
    # jps
    18653 Jps
    19687 DataNode ---->启动正常
    重新载入HBase RegionServer节点
    只需要重启regionserver进程即可。
    参考:http://www.edureka.co/blog/commissioning-and-decommissioning-nodes-in-a-hadoop-cluster/
               https://pravinchavan.wordpress.com/2013/06/03/removing-node-from-hadoop-cluster/

    Hadoop HDFS如何挂载多块硬盘扩容

    回复

    运维 空心菜 回复了问题 2 人关注 1 个回复 7138 次浏览 2018-07-31 15:16 来自相关话题

    HDFS删除了文件,但是磁盘空间没有释放,这是怎么回事?

    回复

    大数据 空心菜 回复了问题 3 人关注 1 个回复 15997 次浏览 2019-09-17 16:54 来自相关话题

    HDFS常用的一些命令

    大数据 being 发表了文章 0 个评论 2316 次浏览 2017-07-07 14:52 来自相关话题

    一、文件操作 1、列出HDFS下的文件 /usr/local/hadoop/bin/hadoop dfs -ls2、列出HDFS文件下名为in的文档中的文件 /usr/local/hadoop/bin/hado ...查看全部


    一、文件操作


    1、列出HDFS下的文件
    /usr/local/hadoop/bin/hadoop dfs -ls
    2、列出HDFS文件下名为in的文档中的文件
    /usr/local/hadoop/bin/hadoop dfs -ls in
    3、上传文件
    将hadoop目录下的test1文件上传到HDFS上并重命名为test
    /usr/local/hadoop/bin/hadoop dfs -put test1 test
    4、文件被复制到本地系统中
    将HDFS中的in文件复制到本地系统并命名为getin:
    /usr/local/hadoop/bin/hadoop dfs -get in getin
    5、删除文档
    删除HDFS下名为out的文档:
    /usr/local/hadoop/bin/hadoop dfs -rmr out
    6、查看文件
    查看HDFS下in文件中的内容:
    /usr/local/hadoop/bin/hadoop dfs -cat in/*
    7、建立目录
    /usr/local/hadoop/bin/hadoop dfs -mkdir /user/hadoop/examples(目录/目录名)
    只能一级一级的建目录。

    8、复制文件
    /usr/local/hadoop/bin/hadoop dfs -copyFromLocal 源路径 路径
    9、通过Hadoop命令把两个文件的内容合并起来
    hdfs dfs -getmerge 位于hdfs中的原文件(里面有多个文件) 合并后的文件名
    例如:
    hdfs dfs -getmerge hdfs://Master:9000/data/SogouResult.txt CombinedResult
     注:合并后的文件位于当前目录,不在hdfs中,是本地文件.
     


    二、管理与更新
     


    1、执行基本信息
    查看HDFS的基本统计信息:
    /usr/local/hadoop/bin/hadoop dfsadmin -report
    2、退出安全模式
    NameNode在启动时会自动进入安全模式。安全模式是NameNode的一种状态,在这个阶段,文件系统不允许有任何修改。

    系统显示Name node in safe mode,说明系统正处于安全模式,这时只需要等待十几秒即可,也可通过下面的命令退出安全模式:
    /usr/local/hadoop/bin/hadoop dfsadmin -safemode leave
    3、进入安全模式
    在必要情况下,可以通过以下命令把HDFS置于安全模式:
    /usr/local/hadoop/bin/hadoop dfsadmin -safemode enter
    4、节点添加
    添加一个新的DataNode节点,先在新加节点上安装好Hadoop,要和NameNode使用相同的配置(可以直接从NameNode复制),修改$HADOOP_HOME/conf/master文件,加入NameNode主机名。然后在NameNode节点上修改$HADOOP_HOME/conf/slaves文件,加入新节点名,再建立新加节点无密码的SSH连接,运行启动命令为:
    /usr/local/hadoop/bin/start-all.sh
    5、负载均衡
    HDFS的数据在各个DataNode中的分布可能很不均匀,尤其是在DataNode节点出现故障或新增DataNode节点时。新增数据块时NameNode对DataNode节点的选择策略也有可能导致数据块分布不均匀。用户可以使用命令重新平衡DataNode上的数据块的分布:
    /usr/local/hadoop/bin/start-balancer.sh

    CDH Hadoop + HBase HA 部署详解

    大数据 空心菜 发表了文章 0 个评论 8140 次浏览 2016-11-07 21:07 来自相关话题

    CDH 的部署和 Apache Hadoop 的部署是没有任何区别的。这里着重的是 HA的部署,需要特殊说明的是NameNode HA 需要依赖 Zookeeper。 准备Hosts文件配置: ...查看全部

    CDH 的部署和 Apache Hadoop 的部署是没有任何区别的。这里着重的是 HA的部署,需要特殊说明的是NameNode HA 需要依赖 Zookeeper。


    准备

    Hosts文件配置:


    cat > /etc/hosts << _HOSTS_
    127.0.0.1 localhost
    10.0.2.59 cdh-m1
    10.0.2.60 cdh-m2
    10.0.2.61 cdh-s1
    _HOSTS_

    各个节点服务情况


    cdh-m1 Zookeeper JournalNode NameNode DFSZKFailoverController HMaster
    cdh-m2 Zookeeper JournalNode NameNode DFSZKFailoverController HMaster
    cdh-s1 Zookeeper JournalNode DataNode HRegionServer

    对几个新服务说明下:


    • JournalNode 用于同步 NameNode 元数据,和 Zookeeper 一样需要 2N+1个节点存活集群才可用;
    • DFSZKFailoverController(ZKFC) 用于主备切换,类似 Keepalived 所扮演的角色。

    NTP 服务

    设置时区


    rm -f /etc/localtime
    ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

    配置NTP Server


    yum install -y ntp
    cat > /etc/ntp.conf << _NTP_
    driftfile /var/lib/ntp/drift

    restrict default nomodify
    restrict -6 default nomodify

    server cn.ntp.org.cn prefer
    server news.neu.edu.cn iburst
    server dns.sjtu.edu.cn iburst
    server 127.127.1.1 iburst

    tinker dispersion 100
    tinker step 1800
    tinker stepout 3600
    includefile /etc/ntp/crypto/pw

    keys /etc/ntp/keys
    _NTP_

    # NTP启动时立即同步
    cat >> /etc/ntp/step-tickers << _NTP_
    server cn.ntp.org.cn prefer
    server news.neu.edu.cn iburst
    server dns.sjtu.edu.cn iburst
    _NTP_

    # 同步硬件时钟
    cat >> /etc/sysconfig/ntpd << _NTPHW_
    SYNC_HWCLOCK=yes
    _NTPHW_

    启动并设置开机自启动


    /etc/init.d/ntpd start
    chkconfig ntpd on

    配置 NTP Client


    yum install -y ntp
    # 注意修改内网NTP Server地址
    cat > /etc/ntp.conf << _NTP_
    driftfile /var/lib/ntp/drift

    restrict default nomodify
    restrict -6 default nomodify

    restrict 127.0.0.1
    restrict -6 ::1

    server 10.0.2.59 prefer

    tinker dispersion 100
    tinker step 1800
    tinker stepout 3600
    includefile /etc/ntp/crypto/pw

    keys /etc/ntp/keys
    _NTP_

    # NTP启动时立即同步
    cat >> /etc/ntp/step-tickers << _NTP_
    server 10.0.2.59 prefer
    _NTP_

    # 同步硬件时钟
    cat >> /etc/sysconfig/ntpd << _NTPHW_
    SYNC_HWCLOCK=yes
    _NTPHW_

    启动并设置开机自启动


    /etc/init.d/ntpd start
    chkconfig ntpd on

    检查 NTP 同步


    ntpq -p

    # 结果
    remote refid st t when poll reach delay offset jitter
    ==============================================================================
    *time7.aliyun.co 10.137.38.86 2 u 17 64 3 44.995 5.178 0.177
    news.neu.edu.cn .INIT. 16 u - 64 0 0.000 0.000 0.000
    202.120.2.90 .INIT. 16 u - 64 0 0.000 0.000 0.000

    JDK配置

    创建目录


    mkdir -p /data/{install,app,logs,pid,appData}
    mkdir /data/appData/tmp

    cd /data/install
    wget -c http://oracle.com/jdk-7u51-linux-x64.gz
    tar xf jdk-7u51-linux-x64.gz -C /data/app
    cd /data/app
    ln -s jdk1.7.0_51 jdk1.7
    cat >> /etc/profile << _PATH_
    export JAVA_HOME=/data/app/jdk1.7
    export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
    export PATH=\$JAVA_HOME/bin:\$PATH
    _PATH_
    source /etc/profile

    创建运行账户


    useradd -u 600 run

    下载 安装包

    # http://archive.cloudera.com/cdh5/cdh/5/
    cd /data/install
    wget -c http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.4.5.tar.gz
    wget -c http://archive.apache.org/dist/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz
    wget -c http://archive.cloudera.com/cdh5/cdh/5/hbase-1.0.0-cdh5.4.5.tar.gz

    安装 Zookeeper

    cd /data/install
    tar xf zookeeper-3.4.5.tar.gz -C /data/app
    cd /data/app
    ln -s zookeeper-3.4.5 zookeeper

    设置环境变量


    sed -i '/^export PATH=/i\export ZOOKEEPER_HOME=/data/app/zookeeper' /etc/profile
    sed -i 's#export PATH=#&\$ZOOKEEPER_HOME/bin:#' /etc/profile
    source /etc/profile

    删除无用文件


    cd $ZOOKEEPER_HOME
    rm -rf *xml *txt zookeeper-3.4.5.jar.* src recipes docs dist-maven contrib
    rm -f $ZOOKEEPER_HOME/bin/*.cmd $ZOOKEEPER_HOME/bin/*.txt
    rm -f $ZOOKEEPER_HOME/conf/zoo_sample.cfg

    创建数据目录


    mkdir -p /data/appData/zookeeper/{data,logs}

    配置


    cat > $ZOOKEEPER_HOME/conf/zoo.cfg << _ZOO_
    tickTime=2000
    initLimit=10
    syncLimit=5
    clientPort=2181
    dataDir=/data/appData/zookeeper/data
    dataLogDir=/data/appData/zookeeper/logs
    server.1=cdh-m1:2888:3888
    server.2=cdh-m2:2888:3888
    server.3=cdh-s1:2888:3888
    _ZOO_

    修改Zookeeper的日志打印方式,与日志路径设置, 编辑


    $ZOOKEEPER_HOME/bin/zkEnv.sh

    在27行后加入两个变量


    ZOO_LOG_DIR=/data/logs/zookeeper
    ZOO_LOG4J_PROP="INFO,ROLLINGFILE"

    创建 myid文件


    # 注意myid与配置文件保持一致
    echo 1 >/data/appData/zookeeper/data/myid

    设置目录权限


    chown -R run.run /data/{app,appData,logs}

    启动、停止


    # 启动
    runuser - run -c 'zkServer.sh start'
    # 停止
    runuser - run -c 'zkServer.sh stop'

    安装 Hadoop

    tar xf hadoop-2.6.0-cdh5.4.5.tar.gz -C /data/app
    cd /data/app
    ln -s hadoop-2.6.0-cdh5.4.5 hadoop

    设置环境变量


    sed -i '/^export PATH=/i\export HADOOP_HOME=/data/app/hadoop' /etc/profile
    sed -i 's#export PATH=#&\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin:#' /etc/profile
    source /etc/profile

    删除无用文件


    cd $HADOOP_HOME
    rm -rf *txt share/doc src examples* include bin-mapreduce1 cloudera
    find . -name "*.cmd"|xargs rm -f

    新建数据目录


    mkdir -p /data/appData/hdfs/{name,edits,data,jn,tmp}

    配置

    切换到配置文件目录


    cd $HADOOP_HOME/etc/hadoop

    编辑 core-site.xml


    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <!-- HDFS 集群名称,可指定端口 -->
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hdfs-cdh</value>
    </property>

    <!-- 临时文件目录 -->
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/data/appData/hdfs/tmp</value>
    </property>

    <!-- 回收站设置,0不启用回收站,1440 表示1440分钟后删除 -->
    <property>
    <name>fs.trash.interval</name>
    <value>1440</value>
    </property>

    <!-- SequenceFiles在读写中可以使用的缓存大小,单位 bytes 默认 4096 -->
    <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
    </property>

    <!-- 可用压缩算法,启用在hdfs-site.xml中,需要编译动态链接库才能用 -->
    <property>
    <name>io.compression.codecs</name>
    <value>org.apache.hadoop.io.compress.SnappyCodec</value>
    </property>
    </configuration>

    编辑 hdfs-site.xml


    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <!-- 指定hdfs 集群名称,需要和core-site.xml中的保持一致 -->
    <property>
    <name>dfs.nameservices</name>
    <value>hdfs-cdh</value>
    </property>

    <!-- 指定 Zookeeper 用于NameNode HA,默认官方配置在core-site.xml中,为了查看清晰配置到hdfs-site.xml也是可用的 -->
    <property>
    <name>ha.zookeeper.quorum</name>
    <value>cdh-m1:2181,cdh-m2:2181,cdh-s1:2181</value>
    </property>

    <!-- hdfs-cdh 下有两个NameNode,分别为 nn1,nn2 -->
    <property>
    <name>dfs.ha.namenodes.hdfs-cdh</name>
    <value>nn1,nn2</value>
    </property>

    <!-- nn1 RPC通信地址 -->
    <property>
    <name>dfs.namenode.rpc-address.hdfs-cdh.nn1</name>
    <value>cdh-m1:9000</value>
    </property>

    <!-- nn1 HTTP通信地址 -->
    <property>
    <name>dfs.namenode.http-address.hdfs-cdh.nn1</name>
    <value>cdh-m1:50070</value>
    </property>

    <!-- nn2 RPC通信地址 -->
    <property>
    <name>dfs.namenode.rpc-address.hdfs-cdh.nn2</name>
    <value>cdh-m2:9000</value>
    </property>

    <!-- nn2 HTTP通信地址 -->
    <property>
    <name>dfs.namenode.http-address.hdfs-cdh.nn2</name>
    <value>cdh-m2:50070</value>
    </property>

    <!-- 指定NameNode元数据在JournalNode上的存储路径 -->
    <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://cdh-m1:8485;cdh-m2:8485;cdh-s1:8485;/hdfs-cdh</value>
    </property>

    <!-- 开启NameNode失败自动切换 -->
    <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
    </property>

    <!-- 配置主备切换实现方式 -->
    <property>
    <name>dfs.client.failover.proxy.provider.hdfs-cdh</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <!-- 配置主备切换方法,每个方法一行-->
    <property>
    <name>dfs.ha.fencing.methods</name>
    <value>
    sshfence
    shell(/bin/true)
    </value>
    </property>

    <!-- 指定运行用户的秘钥,需要NameNode双向免密码登录,用于主备自动切换 -->
    <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/run/.ssh/id_rsa</value>
    </property>

    <!-- 配置sshfence 超时时间 -->
    <property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>50000</value>
    </property>

    <!-- NameNode 数据本地存储路径 -->
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>/data/appData/hdfs/name</value>
    </property>

    <!-- DataNode 数据本地存储路径 -->
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>/data/appData/hdfs/data</value>
    </property>

    <!-- JournalNode 数据本地存储路径 -->
    <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/data/appData/hdfs/jn</value>
    </property>

    <!-- 修改文件存储到edits,定期同步到DataNode -->
    <property>
    <name>dfs.namenode.edits.noeditlogchannelflush</name>
    <value>true</value>
    </property>

    <!-- edits 数据本地存储路径 -->
    <property>
    <name>dfs.namenode.edits.dir</name>
    <value>/data/appData/hdfs/edits</value>
    </property>

    <!-- 开启Block Location metadata允许impala知道数据块在哪块磁盘上 默认关闭 -->
    <property>
    <name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
    <value>true</value>
    </property>

    <!-- 权限检查 默认开启 -->
    <property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
    </property>

    <!-- block 大小设置 -->
    <property>
    <name>dfs.blocksize</name>
    <value>64m</value>
    </property>
    </configuration>

    小于5个DataNode建议添加如下配置


    <!-- 数据副本数量,不能超过DataNode数量,大集群建议使用默认值 默认 3 -->
    <property>
    <name>dfs.replication</name>
    <value>2</value>
    </property>

    <!-- 当副本写入失败时不分配新节点,小集群适用 -->
    <property>
    <name>dfs.client.block.write.replace-datanode-on-failure.policy</name>
    <value>NEVER</value>
    </property>

    在 hadoop-env.sh 中添加如下变量


    export JAVA_HOME=/data/app/jdk1.7
    export HADOOP_LOG_DIR=/data/logs/hadoop
    export HADOOP_PID_DIR=/data/pid
    # SSH端口 可选
    export HADOOP_SSH_OPTS="-p 22"

    Heap 设置,单位 MB


    export HADOOP_HEAPSIZE=1024

    权限设置


    chown -R run.run /data/{app,appData,logs}
    chmod 777 /data/pid

    格式化

    格式化只需要执行一次,格式化之前启动Zookeeper


    切换用户


    su - run

    启动所有 JournalNode


    hadoop-daemon.sh start journalnode

    格式化 Zookeeper(为 ZKFC 创建znode)


    hdfs zkfc -formatZK

    NameNode 主节点格式化并启动


    hdfs namenode -format
    hadoop-daemon.sh start namenode

    NameNode 备节点同步数据并启动


    hdfs namenode -bootstrapStandby
    hadoop-daemon.sh start namenode

    启动 ZKFC


    hadoop-daemon.sh start zkfc

    启动 DataNode


    hadoop-daemon.sh start datanode

    启动与停止

    切换用户


    su - run

    集群批量启动
    需要配置运行用户ssh-key免密码登录,与$HADOOP_HOME/etc/hadoop/slaves


    # 启动
    start-dfs.sh
    # 停止
    stop-dfs.sh

    单服务启动停止
    启动HDFS

    hadoop-daemon.sh start journalnode
    hadoop-daemon.sh start namenode
    hadoop-daemon.sh start zkfc
    hadoop-daemon.sh start datanode

    停止HDFS


    hadoop-daemon.sh stop datanode
    hadoop-daemon.sh stop namenode
    hadoop-daemon.sh stop journalnode
    hadoop-daemon.sh stop zkfc

    测试

    HDFS HA 测试
    打开 NameNode 状态页:
    http://cdh-m1:50010
    http://cdh-m2:50010


    在 Overview 后面能看见 active 或 standby,active 为当前 Master,停止 active 上的 NameNode,检查 standby是否为 active。


    HDFS 测试


    hadoop fs -mkdir /test
    hadoop fs -put /etc/hosts /test
    hadoop fs -ls /test

    结果:


    -rw-r--r--   2 java supergroup         89 2016-06-15 10:30 /test/hosts
    # 其中权限后面的列(这里的2)代表文件总数,即副本数量。

    HDFS 管理命令


    # 动态加载 hdfs-site.xml
    hadoop dfsadmin -refreshNodes

    HBase安装配置

    cd /data/install
    tar xf hbase-1.0.0-cdh5.4.5.tar.gz -C /data/app
    cd /data/app
    ln -s hbase-1.0.0-cdh5.4.5 hbase

    设置环境变量


    sed -i '/^export PATH=/i\export HBASE_HOME=/data/app/hbase' /etc/profile
    sed -i 's#export PATH=#&\$HBASE_HOME/bin:#' /etc/profile
    source /etc/profile

    删除无用文件


    cd $HBASE_HOME
    rm -rf *.txt pom.xml src docs cloudera dev-support hbase-annotations hbase-assembly hbase-checkstyle hbase-client hbase-common hbase-examples hbase-hadoop2-compat hbase-hadoop-compat hbase-it hbase-prefix-tree hbase-protocol hbase-rest hbase-server hbase-shell hbase-testing-util hbase-thrift
    find . -name "*.cmd"|xargs rm -f

    配置
    进入配置文件目录

    cd $HBASE_HOME/conf

    编辑 hbase-site.xml


    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <!-- HBase 数据存储路径 -->
    <property>
    <name>hbase.rootdir</name>
    <value>hdfs://hdfs-cdh/hbase</value>
    </property>

    <!-- 完全分布式模式 -->
    <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
    </property>

    <!-- HMaster 节点 -->
    <property>
    <name>hbase.master</name>
    <value>cdh-m1:60000,cdh-m2:60000</value>
    </property>

    <!-- Zookeeper 节点 -->
    <property>
    <name>hbase.zookeeper.quorum</name>
    <value>cdh-m1:2181,cdh-m2:2181,cdh-s1:2181</value>
    </property>

    <!-- znode 路径,Zookeeper集群中有多个HBase集群需要设置不同znode -->
    <property>
    <name>zookeeper.znode.parent</name>
    <value>/hbase</value>
    </property>

    <!-- HBase 协处理器 -->
    <property>
    <name>hbase.coprocessor.user.region.classes</name>
    <value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>
    </property>
    </configuration>

    在 hbase-env.sh 中添加如下变量


    export JAVA_HOME=/data/app/jdk1.7
    export HBASE_LOG_DIR=/data/logs/hbase
    export HBASE_PID_DIR=/data/pid
    export HBASE_MANAGES_ZK=false
    # SSH 默认端口 可选
    export HBASE_SSH_OPTS="-o ConnectTimeout=1 -p 36000"

    Heap 设置,单位 MB


    export HBASE_HEAPSIZE=1024

    可选设置 regionservers 中添加所有RegionServer主机名,用于集群批量启动、停止。


    启动与停止
    切换用户

    su - run

    集群批量启动
    需要配置运行用户ssh-key免密码登录,与$HBASE_HOME/conf/regionservers


    # 启动
    start-hbase.sh
    # 停止
    stop-hbase.sh

    单服务启动停止
    HMaster

    # 启动
    hbase-daemon.sh start master
    # 停止
    hbase-daemon.sh stop master

    HRegionServer


    # 启动
    hbase-daemon.sh start regionserver
    # 停止
    hbase-daemon.sh stop regionserver

    测试
    HBase HA 测试
    浏览器打开两个HMaster状态页:
    http://cdh-m1:60010
    http://cdh-m2:60010


    可以在Master后面看见其中一个主机名,Backup Masters中看见另一个。
    停止当前Master,刷新另一个HMaster状态页会发现Master后面已经切换,HA成功。

    HBase 测试
    进入hbase shell 执行:

    create 'users','user_id','address','info'
    list
    put 'users','anton','info:age','24'
    get 'users','anton'

    # 最终结果
    COLUMN CELL
    info:age timestamp=1465972035945, value=24
    1 row(s) in 0.0170 seconds

    清除测试数据:


    disable 'users'
    drop 'users'

    到这里安装就全部完成。

    Name node is in safe mode解决

    大数据 Nock 发表了文章 0 个评论 3146 次浏览 2016-10-16 21:05 来自相关话题

    将本地文件拷贝到hdfs上去,结果上错误:Name node is in safe mode 这是因为在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直 ...查看全部
    将本地文件拷贝到hdfs上去,结果上错误:Name node is in safe mode

    这是因为在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
     
    可以通过以下命令来手动离开安全模式:
    bin/hadoop dfsadmin -safemode leave  
    用户可以通过dfsadmin -safemode value 来操作安全模式,参数value的说明如下:
    enter - 进入安全模式
    leave - 强制NameNode离开安全模式
    get - 返回安全模式是否开启的信息
    wait - 等待,一直到安全模式结束。

    Hadoop fs命令学习小记

    大数据 空心菜 发表了文章 0 个评论 4266 次浏览 2016-09-13 20:08 来自相关话题

    1,hadoop fs –fs [local | ]:声明hadoop使用的文件系统,如果不声明的话,使用当前配置文件配置的,按如下顺序查找:hadoop jar里的hadoop-default.xml->[Math Proc ...查看全部
    HDFS.png

    1,hadoop fs –fs [local | ]:声明hadoop使用的文件系统,如果不声明的话,使用当前配置文件配置的,按如下顺序查找:hadoop jar里的hadoop-default.xml->[Math Processing Error]HADOOPCONFDIR下的hadoop−default.xml−>HADOOP_CONF_DIR下的hadoop-site.xml。使用local代表将本地文件系统作为hadoop的DFS。如果传递uri做参数,那么就是特定的文件系统作为DFS。

    2,hadoop fs –ls :等同于本地系统的ls,列出在指定目录下的文件内容,支持pattern匹配。输出格式如filename(full path)     size.其中n代表replica的个数,size代表大小(单位bytes)。

    3,hadoop fs –lsr :递归列出匹配pattern的文件信息,类似ls,只不过递归列出所有子目录信息。

    4,hadoop fs –du :列出匹配pattern的指定的文件系统空间总量(单位bytes),等价于unix下的针对目录的du –sb /*和针对文件的du –b ,输出格式如name(full path)  size(in bytes)。

    5,hadoop fs –dus :等价于-du,输出格式也相同,只不过等价于unix的du -sb。

    6,hadoop fs –mv :将制定格式的文件 move到指定的目标位置。当src为多个文件时,dst必须是个目录。

    7,hadoop fs –cp :拷贝文件到目标位置,当src为多个文件时,dst必须是个目录。

    8,hadoop fs –rm [-skipTrash] :删除匹配pattern的指定文件,等价于unix下的rm

    9,hadoop fs –rmr [skipTrash] :递归删掉所有的文件和目录,等价于unix下的rm –rf

    10,hadoop fs –rmi [skipTrash] :等价于unix的rm –rfi

    11,hadoop fs –put :从本地系统拷贝文件到DFS。

    12,hadoop fs –copyFromLocal :等价于-put。

    13,hadoop fs –moveFromLocal :等同于-put,只不过源文件在拷贝后被删除。

    14,hadoop fs –get [-ignoreCrc] [-crc] :从DFS拷贝文件到本地文件系统,文件匹配pattern,若是多个文件,则dst必须是目录。

    15,hadoop fs –getmerge :顾名思义,从DFS拷贝多个文件、合并排序为一个文件到本地文件系统。

    16,hadoop fs –cat :展示文件内容。

    17,hadoop fs –copyToLocal [-ignoreCrc] [-crc] :等价于-get。

    18,hadoop fs –mkdir :在指定位置创建目录。

    19,hadoop fs –setrep [-R] [-w] :设置文件的备份级别,-R标志控制是否递归设置子目录及文件。

    20,hadoop fs –chmod [-R] PATH…:修改文件的权限,-R标记递归修改。MODE为a+r,g-w,+rwx等,OCTALMODE为755这样。

    21,hadoop fs -chown [-R] [OWNER][:[GROUP]] PATH…:修改文件的所有者和组。-R表示递归。

    22,hadoop fs -chgrp [-R] GROUP PATH…:等价于-chown … :GROUP …。

    23,hadoop fs –count[-q] :计数文件个数及所占空间的详情,输出表格的列的含义依次为:DIR_COUNT,FILE_COUNT,CONTENT_SIZE,FILE_NAME或者如果加了-q的话,还会列出QUOTA,REMAINING_QUOTA,SPACE_QUOTA,REMAINING_SPACE_QUOTA。

    最后就是万能的hadoop fs –help

    Hadoop运维经验杂谈

    大数据 chris 发表了文章 0 个评论 3288 次浏览 2016-04-07 00:57 来自相关话题

    Hadoop在蓝汛 系统架构: Cloudera和它的产品们 Ap ...查看全部


    Hadoop在蓝汛


    hadoop.png

    系统架构
    arch.png


    Cloudera和它的产品们


    Apache Hadoop与CDH版本关系
    hacdh.png

    CDH为什么更好?
      []安装升级更简单:[/]
                     yum ,tar, rpm, cloudera manager 四种安装方法 
      []更快获取新功能和修正新bug[/][]年度release,季度update[/][]Yum安装自动匹配合适的生态系统版本[/][]自动目录配置(logs,conf),以及hdfs和mapred用户创建[/][]详细的文档[/]
    CDH3u3重大改善
    cdh3.png
    CDH3u4重大改善
    cdh4.png
    Cloudera Manager
    m1.png
    m2.png
    m3.png
    Cloudera Training
      []关于Training[/]
                    分为Administrator和Development两门课程
      []关于认证考试[/][]关于证书[/]

    运维事故

    1、伤不起的内存现象1
    系统上线第二天,Jobtracker不工作,web页面打不开
    原因
    一次提交Job数量太多,导致Jobtracker 内存溢出
    解决
    调大JT内存;限制Running Job数量
    现象2
    NN内存溢出,重启后发现50030页面显示fsimage损坏,调查发现SNN fsimage同样损坏了
    原因
    小文件太多导致NN/SNN内存溢出,导致fsimage文件损坏,但是重启后的NN可以正常服务。
    原因
    Cloudera google group去救,获得后门脚本
    2、低效的MapReduce Job现象
    MapReduce Job执行时间过长
    原因
    MR中用到了Spring,小文件导致Map方法效率低下,GZ文件读写效率低
    解决
    MR去Spring化;开启JVM重用;使用LZO作为输入和map输出结果;加大reduce并行copy线程数
    压缩与MapReduce性能
      []前提:大量小文件[/][]输入147GB,文件数45047,平均3MB[/][]CPU 8 core;32GB内存;7200转磁盘;28台Slave机器[/]
    xn.png
     3、OMG,整个集群完蛋了现象
    早上来发现所有DataNode都dead了,重启后10分钟,DN陆续又都dead了;调查发现节点有8%左右丢包率
    原因
    交换机模块故障;DN不能Hold住大量小文件
    解决
    升级3u2到3u4;设置DN内存到2GB
    遇到无法跨越的问题解决办法
      []加入Hadoop官方Mail List[/][]加入Cloudera Google Group[/]

    监控与告警

      []监控:ganglia[/][]设备告警、服务告警:nagios[/][]业务告警:自己实现[/]

    monitor.png

    Nagios告警:
    nagios.png

    业务监控:
    mo1.png

    mo2.png

    mo3.png

    Hbase/Hdfs删除节点

    大数据 空心菜 发表了文章 0 个评论 9426 次浏览 2015-11-30 00:16 来自相关话题

    线上有台服务器随时可能会挂掉,所以需要把在这个服务器上hbase的regionserver和hdfs的datanode节点移除。然后重新拿台新服务器部署接管。   之前在文章 http://openskill.cn/article/17 ...查看全部
    线上有台服务器随时可能会挂掉,所以需要把在这个服务器上hbase的regionserver和hdfs的datanode节点移除。然后重新拿台新服务器部署接管。
     
    之前在文章 http://openskill.cn/article/178 中讲到怎么新增一个hdfs的datanode,所以我先讲一下怎么添加一个hbase的regionserver,然后再讲怎么删除! 


    添加hbase regionserver节点


    添加步骤如下:
    1、在hbase  master上修改regionservers文件
    # cd hbase_install_dir/conf
    # echo "new_hbase_node_hostname" >> ./regionservers
    2、如果你hbase集群使用自身zk集群的话,还需要修改hbase-site.xml文件,反之不用操作!
    # cd hbase_install_dir/conf
    # vim hbase-site.xml
    找到hbase.zookeeper.quorum属性 -->加入新节点
    3、同步以上修改的文件到hbase的各个节点上
    4、在新节点上启动hbase regionserver
    # cd hbase_install_dir/bin/
    # ./hbase-daemon.sh start regionserver
    5、在hbasemaster启动hbase shell
    用status命令确认一下集群情况
    hbase新增一个 regionserver节点补充完成了,下面介绍删除hbase和hdfs节点!
     
    集群上既部署有Hadoop,又部署有HBase,因为HBase存储是基于Hadoop HDFS的,所以先要移除HBase节点,之后再移除Hadoop节点。添加则反之。


    移除hbase regionserver节点


    1、在0.90.2之前,我们只能通过在要卸载的节点上执行;我的hbase版本(0.98.7)
    # cd hbase_install_dir
    # ./bin/hbase-daemon.sh stop regionserver
    来实现。这条语句执行后,该RegionServer首先关闭其负载的所有Region而后关闭自己。在关闭时,RegionServer在ZooKeeper中的"Ephemeral Node"会失效。此时,Master检测到RegionServer挂掉并把它作为一个宕机节点,并将该RegionServer上的Region重新分配到其他RegionServer。
     
    注意:使用此方法前,一定要关闭HBase Load Balancer。关闭方法:
    hbase(main):001:0> balance_switch false
    true
    0 row(s) in 0.3290 seconds
    总结:
    这种方法很大的一个缺点是该节点上的Region会离线很长时间。因为假如该RegionServer上有大量Region的话,因为Region的关闭是顺序执行的,第一个关闭的Region得等到和最后一个Region关闭并Assigned后一起上线。这是一个相当漫长的时间。以我这次的实验为例,现在一台RegionServer平均有1000个Region,每个Region Assigned需要4s,也就是说光Assigned就至少需要1个小时。
    2、自0.90.2之后,HBase添加了一个新的方法,即"graceful_stop",在你移除的服务器执行:
    # cd hbase_install_dir
    # ./bin/graceful_stop.sh hostname
    该命令会自动关闭Load Balancer,然后Assigned Region,之后会将该节点关闭。除此之外,你还可以查看remove的过程,已经assigned了多少个Region,还剩多少个Region,每个Region 的Assigned耗时。
     
    补充graceful stop的一些其他命令参数:
    # ./bin/graceful_stop.sh
    Usage: graceful_stop.sh [--config &conf-dir>] [--restart] [--reload] [--thrift] [--rest] &hostname>
    thrift If we should stop/start thrift before/after the hbase stop/start
    rest If we should stop/start rest before/after the hbase stop/start
    restart If we should restart after graceful stop
    reload Move offloaded regions back on to the stopped server
    debug Move offloaded regions back on to the stopped server
    hostname Hostname of server we are to stop
    最终都需要我们手动打开load balancer:
    hbase(main):001:0> balance_switch false
    true
    0 row(s) in 0.3590 seconds
    然后再开启:
    hbase(main):001:0> balance_switch true
    false
    0 row(s) in 0.3290 seconds
    对比两种方法,建议使用"graceful_stop"来移除hbase RegionServer节点。
    官网说明:http://hbase.apache.org/0.94/book/node.management.html​  http://hbase.apache.org/book.html#decommission​  


    移除hdfs datanode节点


    1、在core-site.xml文件下新增如下内容

    dfs.hosts.exclude
    /hdfs_install_dir/conf/excludes
    2、创建exclude文件,把需要删除节点的主机名写入
    # cd hdfs_install_dir/conf
    # vim excludes
    添加需要删除的节点主机名,比如 hdnode1 保存退出
    3、 然后在namenode节点执行如下命令,强制让namenode重新读取配置文件,不需要重启集群。
    # cd hdfs_install_dir/bin/
    # ./hadoop dfsadmin -refreshNodes
    它会在后台进行Block块的移动
     4、 查看状态
    等待第三步的操作结束后,需要下架的机器就可以安全的关闭了。
    # ./hadoop dfsadmin -report
    可以查看到现在集群上连接的节点 
    正在执行Decommission,会显示: 
    Decommission Status : Decommission in progress

    执行完毕后,会显示:
    Decommission Status : Decommissioned
    如下:
    Name: 10.0.180.6:50010
    Decommission Status : Decommission in progress
    Configured Capacity: 917033340928 (10.83 TB)
    DFS Used: 7693401063424 (7 TB)
    Non DFS Used: 118121652224 (110.00 GB)
    DFS Remaining: 4105510625280(3.63 TB)
    DFS Used%: 64.56%
    DFS Remaining%: 34.45%
    Last contact: Mon Nov 29 23:53:52 CST 2015
    也可以直接通过Hadoop 浏览器查看:
    LIVE的节点可以查看到:http://master_ip:50070/dfsnodelist.jsp?whatNodes=LIVE
    查看看到卸载的节点状态是:Decommission in progress
    等待节点完成移除后,浏览:http://master_ip:50070/dfsnodelist.jsp?whatNodes=DEAD 结果如下:
    hdead.png

    完成后,删除的节点显示在dead nodes中。且其上的服务停止。Live Nodes中仅剩had2,had3
    以上即为从Hadoop集群中Remove Node的过程,但是,有一点一定要注意:
    hdfs-site.xml配置文件中dfs.replication值必须小于或者等于踢除节点后正常datanode的数量,即:
    dfs.replication <= 集群所剩节点数
    修改备份系数可以参考:http://heylinux.com/archives/2047.html


    重载入删除的datanode节点 


    1、修改namenode的core-site.xml文件,把我们刚刚加入的内容删除或者注释掉,我这里选择注释掉。
    2、 再执行重载namenode的配置文件
    # ./bin/hadoop dfsadmin -refreshNodes
    3、最后去启动datanode上的datanode
    # ./bin/hadoop-daemon.sh start datanode
    starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-root-datanode-had1.out
    4、查看启动情况
    # jps
    18653 Jps
    19687 DataNode ---->启动正常
    重新载入HBase RegionServer节点
    只需要重启regionserver进程即可。
    参考:http://www.edureka.co/blog/commissioning-and-decommissioning-nodes-in-a-hadoop-cluster/
               https://pravinchavan.wordpress.com/2013/06/03/removing-node-from-hadoop-cluster/

    新增一个hdfs的DataNode节点

    大数据 空心菜 发表了文章 1 个评论 11222 次浏览 2015-11-11 01:51 来自相关话题

    场景 在hadoop中的分布式文件系统hdfs中,当存储节点磁盘使用达到预警值是,我们需要新增一个数据存储节点,来存储数据!我这里hdfs的版本是2.2.0!新增方法: []静态添加[/][]动态添加[/] ...查看全部


    场景


    在hadoop中的分布式文件系统hdfs中,当存储节点磁盘使用达到预警值是,我们需要新增一个数据存储节点,来存储数据!我这里hdfs的版本是2.2.0!
    新增方法:
      []静态添加[/][]动态添加[/]


    静态添加


    静态新增的方式,就是相当于我们起初部署hdfs集群规划一样,停止NameNode,新增一个DateNode数据节点,这种方法不适用于线上提供服务的场景,具体操作如下:

    1、停止NameNode节点
    # cd hdfs_install_dir/sbin/
    # ./hadoop-deamon.sh stop namenode

    2、修改配置文件slaves文件,并修改/etc/hosts记录把新增的节点对应的ip和hostname追加到各节点
    # cd hdfs_install_dir/etc/hadoop/
    # echo "new_datanode_hostname" >> ./slaves
    # echo "new_datanode_ip new_datanode_hostname" >> /etc/hosts
    然后再利用rsync 同步配置文件和hosts文件,到各节点

    3、确保Hadoop/HDFS集群的NameNode可以对新节点进行SSH免密码登录。

    4、重新启动NameNode节点

    5、如果你希望各数据节点磁盘使用量达到一个相对平衡的状态,就是百分比,你还需要执行hadoop balance命令,后面会具体讲到!


    动态添加


    动态添加,不需要停止启动NameNode节点,具体步骤如下:

    1、修改所有hdfs集群机器的配置文件slaves文件,并修改/etc/hosts记录把新增的节点对应的ip和hostname追加到各节点
    # cd hdfs_install_dir/etc/hadoop/
    # echo "new_datanode_hostname" >> ./slaves
    # echo "new_datanode_ip new_datanode_hostname" >> /etc/hosts

    如果你使用ansible管理的话,hdfs集群的集群做一个叫hdfs的分组,两条命令搞定:
    # ansible hdfs -m shell -a 'echo "new_datanode_hostname" >> hdfs_install_dir/etc/hadoop/slaves'
    # ansible hdfs -m shell -a 'echo "new_datanode_ip new_datanode_hostname" >> /etc/hosts'
    这样所有的节点slaves文件和host文件都更新了!

    2、启动新增的datanode节点
    # cd hdfs_install_dir/sbin
    # ./hadoop-daemon.sh start datanode

    3、查看是否正常加入到集群
    web查看方式:http://NameNode_ip:50070/dfsnodelist.jsp?whatNodes=LIVE
    命令查看方式:cd hdfs_install_dir/bin/ && ./hadoop dfsadmin -report

    4、数据再平衡
    添加新节点时,HDFS不会自动重新平衡。然而,HDFS提供了一个手动调用的重新平衡(reblancer)工具。这个工具将整个集群中的数据块分布调整到一个可人工配置的百分比阈值。如果在其他现有的节点上有空间存储问题,再平衡就会根据阀值,然后平衡分布数据。

    执行再平衡命令,可选参数-threshold指定了磁盘容量的余量百分比,用来判定一个节点的磁盘利用率是过低还是过高。一个利用不足的数据节点其利用率低于平均利用率−阈值。过度利用的数据节点其利用率高于平均利用率+阈值。该参数设置的越小,整个集群越平衡,但会花费更多的时间进行再平衡操作。默认阈值为10%。平衡执行命令如下:
    # cd hdfs_install_dir/sbin/
    # ./start-balancer.sh -threshold 5

    -threshold参数就是是指定平衡的阈值。
    -threshold的默认是10,即每个datanode节点的实际hdfs存储使用量/集群hdfs存储量

    具体解释例子如下:
    datanode hdfs使用量1000G;
    集群总hdfs存储量10T即10000G;
    则t值为1000/10000 = 0.1 = 10%
    当执行balance的-t参数小于0.1时,集群进行balance;
    命令为:start-balancer.sh -threshold 10 ;
    Expecting a number in the range of [1.0, 100.0]: 5%
    sh $HADOOP_HOME/bin/start-balancer.sh –t 10%
    这个命令中-t参数后面跟的是HDFS达到平衡状态的磁盘使用率偏差值。如果机器与机器之间磁盘使用率偏差小于10%,那么我们就认为HDFS集群已经达到了平衡的状态。


    标注知识点


    1、 balance命令可以在namenode或者datanode上启动,也可以随时利用stop-balance.sh脚本停止平衡! 

    2、balance的默认带宽是1M/s。 如果你希望修改平衡数据的带宽大小可以用./hdfs dfsadmin -setBalancerBandwidth 124288000命令指定

    3、slave文件是用于重启时使用。集群的start和stop需要读取slave文件。启用datanode时只要在hdfs-site中配置了namenode位置,就可以将信息push给namenode。 这就是为什么slaves文件很重要的原因。

    HDFS高可用方案之QJM

    大数据 OpenSkill 发表了文章 0 个评论 3547 次浏览 2015-09-12 20:18 来自相关话题

    喜欢一个人,可以为TA做任何事,得到不接受却依然心甘情愿鞍前马后,苦苦等候那一线希望。对,这就是备胎,挂在汽车背后,可能一辈子也用不到的那个圆圈状的玩意儿,大部分情况下,它都会默默地挂在那里,等待几千分之一的机会,有个倒霉的轮子兄弟出事了,于是它就能派上用场了 ...查看全部
    喜欢一个人,可以为TA做任何事,得到不接受却依然心甘情愿鞍前马后,苦苦等候那一线希望。对,这就是备胎,挂在汽车背后,可能一辈子也用不到的那个圆圈状的玩意儿,大部分情况下,它都会默默地挂在那里,等待几千分之一的机会,有个倒霉的轮子兄弟出事了,于是它就能派上用场了……(摘自豆瓣)
     
    在Hadoop的分布式文件系统HDFS中,NameNode用来保存文件系统的元数据(包含目录结构/数据块位置等),如果NameNode上的数据丢失,HDFS上对应的文件数据就无法找回来了。Hadoop在2.0.0之前的版本,使用SecondaryNameNode备份NameNode的数据,但SecondaryNameNode无法转成NameNode,如果NameNode挂了,整个HDFS就会挂掉,无法实现真正的failover。这篇博文总结了5种Hadoop HA(High Available,高可用)方案,Hadoop2之后官方引入了QJM(Quorum Journal Manager)和NFS用于NameNode的备份和切换。本方将介绍的是QJM方案,它使用第二个NameNode实时同步当前NameNode的数据,相比于SecondaryNameNode,他可以随时切换成为真正的NameNode(一个可转正的高级备胎)。
     
    先看看没有HA的HDFS的系统架构(用draw.io画的,尼马这么好的网站也被墙了):
    hd21.png

    然后有HA方案的系统架构:
    hd22.png

    以下的实验基于4个节点的Hadoop集群。其中每个节点的运行的进程列表如下:
    hd23.png

    实验环境中,所有节点的运行环境基本相同:
      []Ubuntu14.04 X64[/][]4G内存[/][]OpenJDK-1.7.0[/][]100Mbps以太网[/]
    下面是实现这个系统的流程(官方文档+个人注解+辅助Shell命令)。

    [list=1]

  • 安装Hadoop系统
  • 严格按照单节点搭建集群搭建两个步骤,系统建起来完全没压力。我遇到的问题是刚开始在配置文件(salves和core-site.xml等文件)中使用的是ip地址而非主机名,然后在log文件里看到各种无法连接。解决方案是修改主机名并在hosts文件里建立映射关系。
    hostname {new_hostname} # 修改主机名,只有当前Session有效sudo vi /etc/hostname   # 永久修改主机名的方法
    另外,对于64位的系统,最好重新编译源码。

    [list=1]

  • 修改配置文件
  • hdfs-site.xml文件:
          dfs.namenode.name.dir    /data/hadoop/namenode        dfs.datanode.data.dir    /data/hadoop/datanode        dfs.replication    2        dfs.nameservices    mycluster        dfs.ha.namenodes.mycluster    nn1,nn2        dfs.namenode.rpc-address.mycluster.nn1    hd1:8020        dfs.namenode.rpc-address.mycluster.nn2    hd3:8020        dfs.namenode.http-address.mycluster.nn1    hd1:50070        dfs.namenode.http-address.mycluster.nn2    hd3:50070        dfs.namenode.shared.edits.dir    qjournal://hd1:8485;hd2:8485;hd4:8485/mycluster        dfs.client.failover.proxy.provider.mycluster    org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider        dfs.ha.fencing.methods    sshfence        dfs.ha.fencing.ssh.private-key-files    /home/hduser/.ssh/id_rsa        dfs.journalnode.edits.dir    /data/hadoop/journalnode  
      []其中nameservices是集群的命名空间,即使有多个集群,可以共用配置文件,但是要注意某些配置项的顺序。[/][]dfs.ha.namenodes.mycluster中的mycluster是可以任取的,但是要和dfs.nameservices对应。[/][]dfs.namenode.rpc-address.mycluster.nn1参考上一条。[/][]dfs.namenode.shared.edits.dir值的格式是"qjournal://host1:port1;host2:port2;host3:port3/journalId",用来指定对应的JN节点,journalId建议使用和nameservices相同的名称。[/][]dfs.client.failover.proxy.provider.mycluster指定激活NameNode的Java类,目前Hadoop内置的只有上面那个。[/][]dfs.ha.fencing.methods是来用来隔离失效的NameNode的方法,有sshfence和Shell两种方式。sshfence需要配置dfs.ha.fencing.ssh.private-key-files私钥文件,以便交互的过程不需要输入密码。[/][]dfs.journalnode.edits.dir是JN保存数据的文件。[/]
     core-site.xml文件:
                fs.defaultFS        hdfs://mycluster    
      []注意mycluster要和dhfs-site.xml中的dfs.nameservices对应。fs.defaultFS不用端口号。[/]
     

    [list=1]

  • 部署
  • 改好配置文件好,就要将配置文件同步到所有的机器上了。可以用rsync将文件同步到多台机器上。rsync是一个增量同步工具,需要先安装。下面的rsync.sh的功能是将当前目录的所有文件发送到文件或参数对应的机器上。
    $ cat rsync.sh #! /bin/bashdir=`pwd`pdir=`dirname $dir`send(){    echo "Sending to $2:$1"    rsync -avez -e ssh $1 $2:$3}mul_send(){    while read host    do        send $dir $host $pdir    done < $1}[ -f $1 ] && mul_send $1 || send $dir $1 $pdir
    将rsync.sh放在etc/hadoop目录下,进入目录运行
    chmod +x rsync.sh./rsync.sh slaves# or ./rsync.sh hostname
    发送完文件之后,就是启动系统。步骤如下: 启动JNs.在所有JournalNode上运行
    sbin/hadoop-daemon.sh --script hdfs start journalnode
    启动NameNode. 在原NameNode上运行
    bin/hadoop --script hdfs start namenode # NameNode需要已经format。[url=使用上面的rsync.sh文件]/code[/url]将原NameNode(nn1)上的数据复制到第二个NameNode(nn2)。然后在nn2上运行:[code]bin/hdfs namenode -bootstrapStandby
    启动其他节点在NameNode上运行
    sbin/start-dfs.sh

    [list=1]

  • 切换NameNode

  • 手动方式

    上面的NameNode默认以standby的状态启动,这时因为没有active的NameNode,所以是不能在HDFS读写文件,需要将其中的一个转成active状态。比如将nn1(对应前面的配置)转成Active:
    bin/hdfs haadmin -transitionToActive nn1
    然后在NameNode的web页面上部的括号里的standby变成active。
    转成standby的命令是:
    bin/hdfs haadmin -transitionToStandby nn1
     
    自动切换
    在当前NameNode不能使用时自动切换到第二个NameNode上,需要借助于ZooKeeper[url=ZK]/url

    ZK的安装过程和Hadoop差不多,就是下载文件、修改配置、复制到所有机器、启动。具体步骤在这里。

    配置文件conf/zoo.conf:
    tickTime=2000
    dataDir=/data/hadoop/zookeeper
    clientPort=2181
    initLimit=5
    syncLimit=2
    server.1=hd2:2888:3888
    server.2=hd3:2888:3888
    server.3=hd4:2888:3888
    hd2,hd3,hd4是主机名,至少需要三台,这个在一台机挂了整个系统还能用,ZK的数量一般是奇数,为什么为奇数可以参考这里。
     
    然后要在hdfs-site.xml上添加配置:

    dfs.ha.automatic-failover.enabled
    true


    ha.zookeeper.quorum
    hd2:2181,hd3:2181,hd4:2181
    然后就是在NameNode的机器上初始化NameNode在ZK的状态了:
    bin/hdfs zkfc -formatZK
    重启HDFS或手动启动DFSZKFailoverController(ZKFC):
    sbin/stop-dfs.sh # 重启hdfs
    sbin/start-dfs.sh
    sbin/hadoop-daemon.sh start zkfc # 启动ZKFC
    在该HA方案中,每一个NameNode都有一个对应的ZKFC。ZKFC会随NameNode启动。
     
    测试
     
    在当前NameNode运行jps看NameNode的进程ID,然后kill掉。通过Web页面( http://hdx:50070 ),可以看到standby的NameNode几乎在kill的同时转成active了。
    转载地址:原文地址

    HDFS中Datanode存在大量没有删除的Block磁盘被占满案例分析

    大数据 OpenSkill 发表了文章 0 个评论 7131 次浏览 2015-09-09 00:09 来自相关话题

    最近发现hdfs中,有的datanode节点,磁盘发生告警,然后分析了一下。 然后上网搜索了一下为什么,分析如下:   查看对应datanode的数据目录,发现确实有很多的数据块(量非常大,都超过了实际hdfs中的数据块总量 ...查看全部
    最近发现hdfs中,有的datanode节点,磁盘发生告警,然后分析了一下。
    然后上网搜索了一下为什么,分析如下:
     
    查看对应datanode的数据目录,发现确实有很多的数据块(量非常大,都超过了实际hdfs中的数据块总量)
     
    这时候,猜测应该是有很多需要被删除的数据块没有被删除。猜测可能是NameNode和DataNode之间的通讯出现异常导致。于是查看NameNode和DataNode日志,发现并没有任何异常信息,只是发现NameNode定时对其中的三台机器发出了删除指令
    BLOCK[i] ask 192.168.200.8:50010 to delete  blk_7080908721303033545_7530145 BLOCK[/i] ask 192.168.200.9:50010 to delete  blk_-6550808355677895247_7465333 BLOCK* ask 192.168.200.7:50010 to delete  blk_2415291932316966347_7460687

    按照网上的方法,通过dfsadmin证实了,确实是有大量的block在等待删除
    hadoop dfsadmin -metasave meta.txt
    然后到logs目录下查看meta.txt文件结果如下:
    Metasave: Blocks 572428 waiting deletion from 8 datanodes.
    显示有几十万的block等待删除
     
    没有办法,只好从源码着手。在FSNameSystem.java文件里面找到了最终问题的所在:
    public int computeDatanodeWork() throws IOException {
    int workFound = 0;
    int blocksToProcess = 0;
    int nodesToProcess = 0;
    // blocks should not be replicated or removed if safe mode is on
    if (isInSafeMode())
    return workFound;
    synchronized(heartbeats) {
    blocksToProcess = (int)(heartbeats.size()
    * ReplicationMonitor.REPLICATION_WORK_MULTIPLIER_PER_ITERATION);
    nodesToProcess = (int)Math.ceil((double)heartbeats.size()
    * ReplicationMonitor.INVALIDATE_WORK_PCT_PER_ITERATION / 100);

    }

    workFound = computeReplicationWork(blocksToProcess);

    // Update FSNamesystemMetrics counters
    synchronized (this) {
    pendingReplicationBlocksCount = pendingReplications.size();
    underReplicatedBlocksCount = neededReplications.size();
    scheduledReplicationBlocksCount = workFound;
    corruptReplicaBlocksCount = corruptReplicas.size();
    }

    workFound += computeInvalidateWork(nodesToProcess);

    return workFound;
    }
    computeInvalidateWork就是用于计算这次需要删除的数据块。但是并不是每次都把所有的节点都处理一遍,而是每次只处理nodesToProcess个节点,而这个数量决定于datanode的总数(heartbeats.size,我这儿是8)和一个系数(INVALIDATE_WORK_PCT_PER_ITERATION,写死的32)。
     
    也就是说每次只处理

    8*32% = 3(这就解释了为啥每次只删除三台数据节点上的数据块。)

    再查看节点选择部分:
    ……
    private Map> recentInvalidateSets =
    new TreeMap>();

    ……
    String firstNodeId = recentInvalidateSets.keySet().iterator().next();

    ……
    发现是通过iterator遍历的,然后悲剧的发现recentInvalidateSets用的是TreeMap,也就是说是有序的……

    所以只要这三个节点有数据需要删除,就不会删除到其他节点
     
    这时候,发现这个问题是调整的时候,修改了一个配置项(dfs.replication.interval,默认是3秒,我修改成了30秒)导致的,当时修改的初衷是防止过早出现数据块复制。但是修改这个配置项以后,数据块副本数检查的间隔拉长了,导致30秒内,有几台机器一直有数据块需要删除,从而无法删除其他节点上的数据块,最终导致磁盘空间无法释放。因为INVALIDATE_WORK_PCT_PER_ITERATION是系统写死的,所以只能通过把dfs.replication.interval改回来,暂时解决这个问题。
     
    Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。