创建hadoop用户创错地方了

创建hadoop用户创错地方了,第1张

说明:在安装好Centos系统后,用root创建一般用户hadoop,在hadoop用户下搭建Hadoop集群,故很多文件的路径均为/home/hadoop…下面介绍一般步骤:

1.创建一批普通用户,如test01、test02…并为其设置密码,命令如下:

useradd test01 创建用户

passwd test01 为test01设置密码

1

2

1

2

2.把该批普通用户加入hadoop用户组

gpasswd -a test01 hadoop把用户test01加入hadoop用户组

1

1

注:在文件/etc/passwd中记录着系统所有的用户;在文件/etc/shadow中记录着所有用户的密码,并一一对应;在文件/etc/group中记录着所有的用户组。

3.由于在/home/hadoop/.bashrc中配置了相关的环境变量,在启动spark-shell、hive、hbase时不需要加入相关路径,为了便于普通用户test01等的 *** 作,在test01等用户的.bashrc文件中配置相关环境变量,并用source ~./bashrc使其生效。

4.按照上述步骤设置后,可以正常启动spark-shell与hbase shell,但启动hive时出现报错:

Permission denied:user=test01,access=EXECUTE,inode="/tmp/hive":hadoop:supergroup:drwxrwx---

1

1

出现这个问题的原因是在hdfs上目录/tmp/hive的所有者为hadoop,所属用户组为supergroup,而相对于该目录用户test01属于其他用户,不具有任何权限,这里报错是不具有EXECUTE权限,要想解决这个问题,需要修改/tmp/hive的权限,命令如下:

hdfs dfs -chmod 777 /tmp修改/tmp的权限

1

1

再次启动hive便不会再报该错误。

5.在hadoop用户上可以正常运行如下程序,但是在test01用户登录运行时抛出异常

hadoop jar hadoop jar /home/hadoop/hadoop2.7.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /test/input /test/output

1

1

注:这里运行的是wordcount示例,/test/input为数据所在路径;/test/output为输出结果目录,运行时自动创建。

在test01用户上执行该程序时抛出如下异常:

这里写图片描述

出现这个异常的原因是:

原来mapreduce.jobhistory.address 和mapreduce.jobhistory.webapp.addres 这两个address的地址使用的是CDH默认的配置值,这里需要改成hostname,这样可能就是原来的位置不对造成的。

这里参考了(http://blog.csdn.net/wjcquking/article/details/41242625)

发现需要在hadoop的配置文件mapred.site.xml中添加如下内容:

</property>

<property>

<name>mapreduce.jobhistory.address</name>

<value>master:10020</value> #master为hostname

</property>

<property>

<name>mapreduce.jobhistory.webapp.address</name>

<value>master:19888</value>

</property>

<property>

<name>yarn.app.mapreduce.am.staging-dir</name>

<value>/user</value> #/user为hdfs上的一个目录

</property>

1

2

3

4

5

6

7

8

9

10

11

12

13

1

2

3

4

5

6

7

8

9

10

11

12

13

在mapred.site.xml中添加如下内容后,把该文件发送到集群其余的机器;在hdfs上创建/user并修改其权限,使得用户test01对其有写权限。由于程序运行时要在hdfs上自动创建/test/output结果目录,则用户test01要对hdfs有写权限,这里为了便于 *** 作,修改hdfs权限为777.

至此,wordcount示例可以正常运行。

两台服务器手动部署大数据平台

##### 初始服务器数量

- 2台centos7

##### 建议配置

- 32G(RAM)

- 24cpu

- 10t(SATA)

### 1.环境

- 系统centos7

- jdk:1.8.0_171(64位)

- zookeeper:3.4.8

- spark-2.1.0-bin-hadoop2.6

- kafka_2.10-0.10.2.1

- hadoop-2.7.0

- hbase-1.2.6

- elasticsearch-6.3.0

### 2.系统准备

对应的安装包文件:

elasticsearch-6.3.0.tar.gz

hadoop-2.7.0.tar.gz

hbase-1.2.6-bin.tar.gz

jdk-8u171-linux-x64.tar.gz

kafka_2.10-0.10.2.1.tgz

mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar

spark2.1.0hadoop2.6.tgz.gz

zookeeper-3.4.8.tar.gz

一、 配置好hosts

```

两台设备的host

ip1 hello1

ip2 hello2

关闭防火墙

systemctl stop firewalld

systemctl disable firewalld

二、机器之间做好免密

1. 在hello1服务器中,cd /root/

2. ssh-keygen -trsa  (全部按回车,走默认配置)

3. cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

4. chmod 600 ~/.ssh/authorized_keys

5. scp ~/.ssh/authorized_keys root@hello2:~/.ssh/

到此处时可以实现hello1机器上通过root账户登录到hello2中,但从hello2中无法通过免密码登录到hello1服务器。

6. 在hello2服务器中,cd /root/

7. ssh-keygen -trsa  (全部按回车,走默认配置)

8. cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

9. scp ~/.ssh/authorized_keys root@hello1:~/.ssh/

到此处时可以实现hello1机器与hello2机器之间免密码互通

三、建立一个用户 *** 作elasticsearch用户,后期所有安装软件放在该目录下(当前使用root账户安装)

1.添加用户:

useradd -m -s /bin/bash es

2.为该用户设置密码:

password es

四、安装JDK

如果系统自带openjdk,先将其卸载掉!

1.创建jdk安装路径(hello1、hello2都执行)

执行: mkdir /usr/java

2.解压缩jdk到安装目录

执行: tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/java/

3.添加环境变量

vi /etc/profile,添加以下语句

export JAVA_HOME=/usr/java/jdk1.8.0_171

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$PATH:$JAVA_HOME/bin

执行:source /etc/profile

4.复制安装包和数据目录到hello2

scp  -r /usr/java/jdk1.8.0_171 hello2:/usr/java/

scp /etc/profile hello2:/etc/

登录到hello2上,进入/home/es目录

执行: source /etc/profile

5、验证:

两台服务器上分别执行: java -version,查看输出的版本是否与安装的版本一致。

五、安装mysql

1.如果centos系统中自带mariadb,先卸载mariadb。

2.解压mysql安装包程序

执行:tar -xvf  mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar

3.依次安装里面rpm包组建

rpm -ivh mysql-community-common-5.7.23-1.el7.x86_64.rpm

rpm -ivh mysql-community-libs-5.7.23-1.el7.x86_64.rpm

rpm -ivh mysql-community-client-5.7.23-1.el7.x86_64.rpm

rpm -ivh mysql-community-server-5.7.23-1.el7.x86_64.rpm

rpm -ivh mysql-community-devel-5.7.23-1.el7.x86_64.rpm

4.启动MySQL

执行: systemctl start mysqld

5.登录mysql服务器

这种方式安装好后,会再my.cnf文件中自动生成一个密码,

执行:cat /var/log/mysqld.log | grep password, 出现如下记录:

2017-09-15T01:58:11.863301Z 1 [Note] A temporary password is generated for root@localhost: m-NdrSG4ipuO

其中“m-NdrSG4ipuO”为mysql root账户的初始密码。

登录:

执行: mysql -uroot -p

输入密码: m-NdrSG4ipuO,即可进入mysql服务器。

后续可自行修改root密码,创建新账户等 *** 作。

六、安装zookeeper

1.解压zookeeper安装包到指定目录(/home/es)

tar -zxvf zookeeper-3.4.8.tar.gz -C /home/es

2.创建程序软连接

cd /home/es/

ln -s zookeeper-3.4.8 zookeeper

3.添加执行路径环境

vi /etc/profile

添加

export ZOOKEEPER_HOME=/home/es/zookeeper

export PATH=$PATH:$ZOOKEEPER_HOME/bin

执行

source /etc/profile

4.修改配置文件

cd /home/es/zookeeper

cp conf/zoo_sample.cfg conf/zoo.cfg

在/home/data下创建对应的zookeeper数据存储目录

mkdir /home/data/zookeeper

mkdir /home/data/zookeeper/data

mkdir /home/data/zookeeper/log

修改配置文件:conf/zoo.cfg,添加以下语句

dataDir=/home/data/zookeeper/data

dataLogDir=/home/data/zookeeper/log

server.1=hello1:2888:3888

server.2=hello2:2888:3888

5.创建server表示符文件

touch /home/data/zookeeper/data/myid

echo echo 1>/home/data/zookeeper/data/myid

6.复制安装包和数据目录到hello2

scp -r /home/es/zookeeper-3.4.8 es@hello2:/home/es

scp -r /home/data/zookeeper es@hello2:/home/data

scp  /etc/profile es@hello2:/etc

登录到hello2上

cd /home/es

ln -s zookeeper-3.4.8 zookeeper

echo echo 2>/home/data/zookeeper/data/myid

执行

source /etc/profile

7.两台机器上分别执行

zkServer.sh start

8.验证

jps | grep QuorumPeerMain,查看是否有该进程

zkServer.sh status,查看服务状态

六、安装kafka

1.解压kafka安装包到指定目录(/home/es)

tar -zxvf kafka_2.10-0.10.2.1.tgz -C /home/es

2.创建程序软连接

cd /home/es/

ln -s kafka_2.10-0.10.2.1 kafka

3.修改配置文件

备份:

cp config/server.properties config/server.properties.bak

创建kafka日志目录:

mkdir /home/data/kafka

mkdir /home/data/kafka/kafka-logs

修改:config/server.properties,具体对应字段如下:

broker.id=0

delete.topic.enable=true

num.network.threads=10

num.io.threads=32

socket.send.buffer.bytes=102400

socket.receive.buffer.bytes=102400

socket.request.max.bytes=104857600

log.dirs=/home/data/kafka/kafka-logs

num.partitions=1

num.recovery.threads.per.data.dir=1

log.retention.hours=168

log.segment.bytes=1073741824

log.retention.check.interval.ms=300000

zookeeper.connect=hello1:2181,hello2:2181

zookeeper.connection.timeout.ms=6000

6.复制安装包和数据目录到hello2

scp -r /home/es/kafka_2.10-0.10.2.1 es@hello2:/home/es

scp -r /home/data/kafka es@hello2:/home/data

修改hello2中的配置

登录到hello2上,cd /home/es/kafka,修改config/server.properties中broker.id值为2.

7.启动kafka

在两台机器的/home/es/kafka中,创建一个日志存放目录:mkdir start_log,执行以下命令:

nohup bin/kafka-server-start.sh config/server.properties >start_log/kafka_start_log 2>&1 &

8.验证运行情况

jps | grep Kafka,查看进程

通过kafka命令查看topic。

七、安装hadoop

1.解压hadoop安装包到指定目录(/home/es)

tar -zxvf hadoop-2.7.0.tar.gz -C /home/es

2.创建程序软连接

cd /home/es/

ln -s hadoop-2.7.0 hadoop

3.创建数据存放目录

mkdir /home/data/hadoop

mkdir /home/data/hadoop/tmp

mkdir /home/data/hadoop/dfs

mkdir /home/data/hadoop/dfs/data

mkdir /home/data/hadoop/dfs/name

4.修改配置文件

修改/home/es/hadoop/etc/hadoop/core-site.xml

<configuration>

<property>

<name>fs.defaultFS</name>

<value>hdfs://hello1:9000</value>

</property>

<property>

<name>hadoop.tmp.dir</name>

<value>file:/home/data/hadoop/tmp</value>

</property>

<property>

<name>io.file.buffer.size</name>

<value>131702</value>

</property>

</configuration>

修改/home/es/hadoop/etc/hadoop/hdfs-site.xml

<configuration>

<property>

<name>dfs.namenode.name.dir</name>

<value>file:/home/data/hadoop/dfs/name</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>file:/home/data/hadoop/dfs/data</value>

</property>

<property>

<name>dfs.replication</name>

<value>2</value>

</property>

<property>

<name>dfs.namenode.secondary.http-address</name>

<value>hello1:9001</value>

</property>

<property>

<name>dfs.webhdfs.enabled</name>

<value>true</value>

</property>

</configuration>

修改/home/es/hadoop/etc/hadoop/mapred-site.xml

<configuration>

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

<property>

<name>mapreduce.jobhistory.address</name>

<value>hello1:10020</value>

</property>

<property>

<name>mapreduce.jobhistory.webapp.address</name>

<value>hello1:19888</value>

</property>

</configuration>

修改/home/es/hadoop/etc/hadoop/yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

<property>

<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>

<value>org.apache.hadoop.mapred.ShuffleHandler</value>

</property>

<property>

<name>yarn.resourcemanager.address</name>

<value>hello1:8032</value>

</property>

<property>

<name>yarn.resourcemanager.scheduler.address</name>

<value>hello1:8030</value>

</property>

<property>

<name>yarn.resourcemanager.resource-tracker.address</name>

<value>hello1:8031</value>

</property>

<property>

<name>yarn.resourcemanager.admin.address</name>

<value>hello1:8033</value>

</property>

<property>

<name>yarn.resourcemanager.webapp.address</name>

<value>hello1:8088</value>

</property>

<property>

<name>yarn.nodemanager.resource.memory-mb</name>

<value>768</value>

</property>

</configuration>

配置/home/es/hadoop/etc/hadoop目录下hadoop-env.sh、yarn-env.sh的JAVA_HOME(不设置的话,启动不了)

export JAVA_HOME=/usr/java/jdk1.8.0_171

配置/home/es/hadoop/etc/hadoop目录下的slaves,删除默认的localhost,增加2个从节点,

hello1

hello2

5、将配置好的Hadoop复制到各个节点对应位置上,通过scp传送

scp  -r /home/es/hadoop-2.7.0 hello2:/home/es/

scp  -r /home/data/hadoop hello2:/home/data/

登录到hello2上,进入/home/es目录

执行: ln -s hadoop-2.7.0 hadoop

6、格式化nameNode及启动hadoop

在主服务器启动hadoop,从节点会自动启动,进入/home/es/hadoop目录

初始化,输入命令,bin/hdfs namenode -format

全部启动sbin/start-all.sh,也可以分开sbin/start-dfs.sh、sbin/start-yarn.sh

输入命令,jps,可以看到相关信息

7、验证hadoop运行情况

浏览器打开http://hello1:8088/

浏览器打开http://hello1:50070/

8、添加hadoop环境变量到/etc/profile

export HADOOP_HOME=/home/es/hadoop export PATH=$PATH:$HADOOP_HOME/sbin

export PATH=$PATH:$HADOOP_HOME/bin

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

执行: source /etc/profile

八、安装Hbase

1.解压hbase安装包到指定目录(/home/es)

tar -zxvf hbase-1.2.6-bin.tar.gz -C /home/es

2.创建程序软连接

cd /home/es/

ln -s hbase-1.2.6 hbase

3.添加hbase环境变量到/etc/profile

export  HBASE_HOME=/home/es/hbase

export  PATH=$HBASE_HOME/bin:$PATH

执行:source /etc/profile

4.修改HBASE配置文件

vi /home/es/hbase/conf/hbase-env.sh

增加: export JAVA_HOME=/usr/java/jdk1.8.0_171

修改: export HBASE_MANAGES_ZK=false

vi /home/es/hbase/conf/hbase-site.xml

修改类容:

<configuration>

<property>

<name>hbase.rootdir</name><!-- hbase存放数据目录 -->

<value>hdfs://hello1:9000/hbase/hbase_db</value>

<!-- 端口要和Hadoop的fs.defaultFS端口一致-->

</property>

<property>

<name>hbase.cluster.distributed</name><!-- 是否分布式部署 -->

<value>true</value>

</property>

<property>

<name>hbase.zookeeper.quorum</name><!-- list of  zookooper -->

<value>hello1,hello2</value>

</property>

 <property><!--zookooper配置、日志等的存储位置 -->

<name>hbase.zookeeper.property.dataDir</name>

<value>/home/es/hbase/zookeeper</value>

 </property>

</configuration>

配置regionservers,vi /home/es/hbase/conf/regionservers

去掉默认的localhost,加入hello1、hello2

5、将配置好的hbase复制到各个节点对应位置上,通过scp传送

scp  -r /home/es/hbase-1.2.6 hello2:/home/es/

scp /etc/profile hello2:/etc/

登录到hello2上,进入/home/es目录

执行: ln -s hbase-1.2.6 hbase

source /etc/profile

6、hbase的启动

hello1中执行: start-hbase.sh

7、验证hbase运行情况

输入jps命令查看进程是否启动成功,若 hello1上出现HMaster、HRegionServer、HQuormPeer,hello2上出现HRegionServer、HQuorumPeer,就是启动成功了。

输入hbase shell 命令 进入hbase命令模式,输入status命令,查看运行状态。

在浏览器中输入http://hello1:16010就可以在界面上看到hbase的配置

注意事项:

正常安装后,创建普通不带压缩表可以正常读写,当使用snappy进行压缩创建表时,该表无法再regionServer中启动!

解决方法:

1.在hbase-site.xml文件中添加一下属性

<property>

                <name>hbase.regionserver.codecs</name>

                <value>snappy</value>

        </property>

2.每台机器中将hadoop_native.zip解压缩到hbase安装目录的lib下,执行 unzip hadoop_native.zip $HBASE_HOME/lib/

3.在$HBASE_HOME/conf/hbase-env.sh 中添加:export HBASE_LIBRARY_PATH=/home/es/hbase/lib/native

4.重启Hbase服务即可

九、Spark安装

1.解压hbase安装包到指定目录(/home/es)

tar -zxvf spark2.1.0hadoop2.6.tgz.gz -C /home/es

2.创建程序软连接

cd /home/es/

ln -s spark2.1.0hadoop2.6 spark

3.修改配置文件

mv /home/es/spark/conf/spark-env.sh.template  /home/es/spark/conf/spark-env.sh

vi /home/es/spark/conf/spark-env.sh

修改对应配置:

export JAVA_HOME=/usr/java/jdk1.8.0_171

export SPARK_MASTER_IP=hello1

export SPARK_MASTER_PORT=7077

export SPARK_LOCAL_IP=hello1

修改slaves文件

mv /home/es/spark/conf/slaves.template  /home/es/spark/conf/slaves

vi /home/es/spark/conf/slaves

将localhost修改成:

hello1

hello2

5、将配置好的hbase复制到各个节点对应位置上,通过scp传送

scp  -r /home/es/spark2.1.0hadoop2.6 hello2:/home/es/

登录到hello2上,进入/home/es目录

执行: ln -s spark2.1.0hadoop2.6 spark

在hello2中修改/home/es/spark/conf/spark-env.sh

export JAVA_HOME=/usr/java/jdk1.8.0_171

export SPARK_MASTER_IP=hello1

export SPARK_MASTER_PORT=7077

export SPARK_LOCAL_IP=hello2

6、启动spark

cd /home/es/spark

执行: sbin/start-all.sh

7、检测执行结果

jps | grep Worker,看是否有相应的进程。

十、安装elasticsearch

由于elasticsearch,用root账户无法启动,故该组件用es账户安装

1、切换到es账户: su es

2、解压hbase安装包到指定目录(/home/es)

tar -zxvf elasticsearch-6.3.0.tar.gz -C /home/es/

创建程序软连接

cd /home/es/

ln -s elasticsearch-6.3.0 elasticsearch

3、修改配置文件

vi /home/es/elasticsearch/config/elasticsearch.yml

# 集群的名字 

cluster.name: crrc-health

# 节点名字 

node.name: node-1 

# 数据存储目录(多个路径用逗号分隔) 

path.data: /home/data1/elasticsearch/data

# 日志目录 

path.logs: /home/data1/elasticsearch/logs

#本机的ip地址

network.host: hello1 

#设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点

discovery.zen.ping.unicast.hosts: ["hello1", "hello2"]

# 设置节点间交互的tcp端口(集群),(默认9300) 

transport.tcp.port: 9300

# 监听端口(默认) 

http.port: 9200

# 增加参数,使head插件可以访问es 

http.cors.enabled: true

http.cors.allow-origin: "*"

4、创建elasticsearch数据和存储目录

mkdir /home/data1/elasticsearch

mkdir /home/data1/elasticsearch/data

mkdir /home/data1/elasticsearch/logs

5、修改linux系统的默认硬限制参数

切换至root用户: su root

vim /etc/security/limits.conf

添加:

es soft nofile 65536

es hard nofile 65536

退出es登录,重新用es账户登录,使用命令:ulimit -Hn查看硬限制参数。

vi /etc/sysctl.conf

添加:

vm.max_map_count=655360

执行:

sysctl -p

6、将配置好的elasticsearch复制到各个节点对应位置上,通过scp传送

scp  -r /home/es/elasticsearch-6.3.0 hello2:/home/es/

scp  -r /home/data1/elasticsearch hello2:/home/data1/

登录到hello2上,进入/home/es目录

执行: ln -s elasticsearch-6.3.0 elasticsearch-6.3.0

在hello2中修改/home/es/elasticsearch/config/elasticsearch.yml

修改: network.host: hello2

7、启动elasticsearch

使用es账户

执行:

/home/es/elasticsearch/bin/elasticsearch -d

8、验证

控制台中输入:curl http://hello1:9200

1、HBase写入流程

HBase服务端没有提供update,delete接口,HBase中对数据的更新、删除 *** 作都认为是写入 *** 作,更新 *** 作会写入一个最小版本数据,删除 *** 作写写入一条标记为deleted的KV数据

1.1、写入流程三个阶段概况

1)客户端处理阶段:客户端将用户请求进行预处理,并根据集群元数据定位写入数据所在的RegionServer,将请求发送给RS

2)Region写入阶段:RS收到请求之后解析数据,首先把数据写入WAL,再写入对应Region对应的MemStore

3)MemStore Flush阶段:当Region中MemStore容量达到一定阈值之后,系统异步执行flush *** 作,将内存写入文件,形成HFile

1.2、用户写入请求在完成写入MemStore之后就会返回成功。MemStore Flush是一个异步执行的过程。

1.3、客户端处理阶段步骤详解:

1)客户端可以设置批量提交,如果设置了批量提交(autoflush=false)客户端会先将数据写入本地缓冲区等达到一定阈值之后才会提交。否则put请求直接会提交给服务端进行处理。

2)RS寻址,在提交之前HBase会在元数据表hbase:meta中根据rowkey找到她们归属的RS

2.1)客户端根据写入的表和rowkey在元数据中查找,如果能够查找出该rowkey所在的RS及Region,就直接发送写入请求

2.2)如果客户端没有找到rowkey信息,需要首先到zk上找到hbase:meta表所在的RS,向那RS发送查询请求获取元数据,然后在元数据中查找rowkey所在的RS,并将元数据缓存在本地,以备下次使用。

3)客户端发送远程RPC请求给RS,将数据写入目标Region的MemStore中

1.4、Region写入阶段步骤详解:

1)获取行锁,HBase中使用行锁保证对同一行数据的更新是互斥 *** 作,用以保证更新的原子性,要么成功要么失败

2)更新所有待写入keyValue的时间戳为当前系统时间

3)对一次写入同一个Region的一个或多个KeyValue构建一条WALEdit记录,这样做的目的是保证Region级别事务的写入原子性

4)把WALEdit写入HLog,HLog是存储在HDFS上需要sync *** 作把HLog真正落地到HDFS,在这一部暂时不用执行sync,HBase使用了disruptor实现了高效的生产者消费者队列,来异步实现WAL的追加写入 *** 纵

5)写入WAL之后再将数据写入MemStore

6)释放行锁

7)sync WAL:将HLog真正sync到HDFS,如果sync失败,执行回滚 *** 作将MemStore数据移除

8)结束写事务。更新对外可见,更新生效

1.5、MemStore Flush阶段详解:

1.5.1、触发flush条件

1.5.1.1、MemStore级别限制,当Rgion中任意一个MemStore大小达到阈值(hbase.hrgion.memstore.flush.size)默认128M

1.5.1.2、Region级别限制:当Region所有MemStore的大小达到了上限(hbase.hregion.memstore.block.multiplier * hbase.hrgion.memstore.flush.size)超过memstore大小的倍数达到该值则阻塞所有写入请求进行flush,自我保护默认是2.

1.5.1.3、RegionServer级别限制:当RS中MemStore的总大小超过低水位阈值hbase.regionserver.global.memstore.size.lower.limit * hbase.reagionserver.global.memstore.size RS则开始强制执行flush,按Region中MemStore大小从大到小进行flush,直到总MemStore大小下降到低水位。

1.5.1.4、当一个RegionServer中HLog数量达到一定上限(hbase.regionserver.maxlogs),系统选择最早的HLog对应的Rgion进行Flush

1.5.1.5、HBase定期Flush,默认是1小时确保MemStore不会长时间没有持久化。为了避免同一时间所有都进行flush,定期的flush *** 作有一定时间的随机延迟

1.5.1.6、手动flush,用户可以通过flush 'tablename'或者 flush 'regionname'对一个表或者Region进行flush

1.5.2、flush执行步骤

1.5.2.1、prepare阶段

遍历当前region下的MemStore做一个快照,然后新一个ConcurrentSkipListMap接受新的数据请求。此阶段需要通过锁来阻塞写请求,结束后释放锁,此过程持锁时间很短

1.5.2.2、flush阶段

对快照数据按照特定格式生成HFile持久化为临时文件放在.tmp目录下。这个过程涉及到磁盘IO *** 作,相对比较耗时

1.5.2.3、commit阶段

把临时文件移动到指定的CF目录下。再清空快照数据。

1.5.3、MemStore Flush对业务的影响

1.5.3.1、大部分MemStore Flush *** 作都不会对业务读写产生太大影响,

1.5.3.2、Region Server级别呆滞的flush,会对用户请求产生较大影响,会阻塞落在该RS上的写入 *** 作。

1.6、HLog写入模型

1.6.1、HLog持久化级别

SKIP_WAL:只写缓存,不写HLog,不可取

ASYNC_WAL:异步写入HLog

SYNC_WAL:同步写入日志文件,数据只是被写入文件系统缓存中并没有真正落盘。默认是此级别

FSYNC_WAL:同步将数据写入日志文件并强制落盘,这是最严格的写入级别,保证数据不丢失,性能相对较差

USER_DEFAULT:如果用户没有指定持久化级别,默认HBase使用SYN_WAL等级持久化数据put.setDurability(Durability.SYNC_WAL)

1.6.2、HLog写入模型

1、HLog写入需要经过3个阶段:手写将数据写入本地缓存,然后将本地缓存写入文件系统,最后执行syn *** 作同步到磁盘

2、HBase使用LMAX Disruptor框架实现了无锁有界队列 *** 作,写入模型如下图

2、BulkLoad 流程

2.1、BulkLoad使用场景:用户数据位于HDFS中,业务需要定期将这部分海量数据导入HBase系统.

2.2、核心流程分两步

2.2.1、HFile生成阶段:运行一个MapReduce任务,map需要自己实现,将HDFS文件中的数据读取出来组装一个复合KV,其中Key是rowkey,Value可以是KeyValue对象、Put对象甚至Delete对象;reduce由HBase负责,他会根据表信息配置一个全局有序的partitioner,将partitioner文件上传到HDFS集群,设置reduce task个数为目标表的Region个数。为每个Region生成一个对应的HFile文件

2.2.2、HFile导入阶段:HFile主备就绪后,将HFile加载到在线集群。

2.3、Bulkload遇到的一些常见问题

2.3.1、设置正确的权限

2.3.1、BulkLoad *** 作过程涉及到的用户:

第一步,通过MapReduce任务生成HFile。假设这个过程使用的HDFS账号为:u_mapreduce.

第二步,将HFile加载到HBase集群,假设这个步骤使用的账号为:u_load。

一般地:HBase集群由一个专门的账号用来管理HBase数据,该账号拥有HBase集群的所有表的最高权限,

同时可以读写HBase root目录下的所有文件,假设这个账号为:hbase_srv

2.3.2、权限设置

2.3.2.1、通过MapReduce任务生成HFile,HFile文件的owner为u_mapreduce。

2.3.2.2、u_load需要HFile文件以及目录的读、写权限。写的权限是因为在HFile跨越多个Region时,需要对HFile进行split *** 作。

另外u_load账号需要HBase表的Create权限

2.3.2.3、hbase_srv账号把HFile文件从用户的数据目录rename到HBase的数据目录,所以hbase_sHrv需要有用户数据目录及HFile的读取

权限,但事实上仅读取权限还不够,应为加载到HBase数据目录的HFile目录的owner仍为u_mapreduce。一旦执行完compaction *** 作

之后,这些文件无法挪动到archive目录,导致文件越来越多。这个问题在HBase 2.x 上修复。

2.3.2、影响Locality

如果生成HFile都在的HDFS集群和HBase所在HDFS集群时同一个,则MapReduce生成HFile,能够保证HFile与目标Region落在同一个机器上。这样就保证了Locality。由hbase.bulkload.locality.sensitive.enabled的参数控制整个逻辑,默认是true.所以默认保证locality的。

如果用户MapReduce在A集群上生成HFile,通过distcp拷贝到集群B.这样BulkLoad到HBase集群数据是没法保证Locality的。需要跑完BulkLoad之后再手动执行major compact,来提升loaclity。

2.3.3、BulkLoad数据复制

在1.3之前版本中,BulkLoad到HBase集群的数据并不会复制到备集群,这样可能无意识的导致备集群比主集群少了很多数据。在HBase1.3版本之后开始支持BulkLoad数据复制。需要开启开关:hbase.replicatition.bulkload.enabled=true。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11373365.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存