Apache Hadoop (3.3.0)
创建用户 (由于配置文件设置 hdfs 用户访问)
创建用户
hdfs
adduser hdfs passwd hdfs gpasswd -a hdfs hdfs
SSH 无密码访问
将三台机器设置SSH无密码访问
在 10.30.50.84 生成 ssh 密钥
ssh-keygen ssh-copy-id hdfs@platform-010-030-050-084 ssh-copy-id hdfs@platform-010-030-050-085 scp -r .ssh hdfs@platform-010-030-050-085:~/.ssh
JAVA
- 下载 java 包 解压至
/app/tools/java
- vim /etc/profile
export JAVA_HOME=/app/tools/java/jdk1.8.0_77
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre
- java -version 检查是否成功
复制至其他两个节点
cd /app scp -r tools/ root@10.30.50.85:/app/tools scp -r tools/ root@10.30.50.86:/app/tools 在其他两个节点配置 /etc/profile
Hadoop
下载 https://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz
tar -zxvf hadoop-3.3.0.tar.gz
vim /etc/profile
export HADOOP_HOME=/app/hadoop/hadoop-3.3.0
其他两个节点也配置
- 编辑 etc/hadoop/hadoop-env.sh 替换 export JAVA_HOME=/app/tools/java/jdk1.8.0_77
配置项:
- etc/hadoop/core-site.xml
https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/core-default.xml
配置项 | 说明 | 备注 |
---|---|---|
fs.defaultFS | 文件系统地址 | hdfs://host:port/ |
io.file.buffer.size | 文件读写区大小 | 131072 |
fs.trash.interval | checkpoint删除后刷新时间, 0则禁用该功能 | 360 |
hadoop.http.authentication.simple.anonymous.allowed | 是否允许匿名请求 | true |
io.compression.codecs | 可用于压缩/解压的压缩编解码器类的逗号分隔列表 | org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.SnappyCodec |
io.serializations | 可用于获取序列化器和反序列化器的序列化类列表 | org.apache.hadoop.io.serializer.WritableSerialization |
ipc.client.connect.max.retries | 客户端重连次数 | 10 |
ipc.client.connection.maxidletime | 客户端重连最大时间间隔 | 1000 |
ipc.client.idlethreshold | 客户端空闲连接数 | 4000 |
ipc.client.tcpnodelay | 是否使用传输延迟 | true |
net.topology.script.file.name | 网络拓扑脚本名称 |
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://platform-010-030-050-084:8020</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>360</value>
</property>
<property>
<name>hadoop.http.authentication.simple.anonymous.allowed</name>
<value>true</value>
</property>
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<property>
<name>ipc.client.connect.max.retries</name>
<value>50</value>
</property>
<property>
<name>ipc.client.connection.maxidletime</name>
<value>30000</value>
</property>
<property>
<name>ipc.client.idlethreshold</name>
<value>8000</value>
</property>
<property>
<name>ipc.client.tcpnodelay</name>
<value>true</value>
</property>
</configuration>
- etc/hadoop/hdfs-site.xml
https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
配置项 | 说明 | 备注 |
---|---|---|
dfs.block.access.token.enable | 是否校验token | false |
dfs.blockreport.initialDelay | 块报告延迟 | 0s |
dfs.blocksize | 块大小,默认 byte | 134217728 |
dfs.client.read.shortcircuit | 短路本地读取 | false |
dfs.client.read.shortcircuit.streams.cache.size | 文件描述符的缓存 | 256 |
dfs.client.retry.policy.enabled | 是否打开重试策略 | false |
dfs.cluster.administrators | 管理员列表, 控制可以访问namenode的用户和组 | |
dfs.content-summary.limit | 最大内容摘要数, 0或者负数表示不限制 | 5000 |
dfs.datanode.address | datanode地址 | 0.0.0.0:9866 |
dfs.replication | 默认的块复制。实际的复制数量可以在创建文件时指定。如果在创建时没有指定复制,则使用默认值。 | 3 |
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/app/hadoop/hdfs/namenode</value>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/app/hadoop/hdfs/data</value>
<final>true</final>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>platform-010-030-050-085:50090</value>
</property>
<property>
<name>dfs.namenode.secondary.https-address</name>
<value>platform-010-030-050-085:50490</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>platform-010-030-050-084:50070</value>
<final>true</final>
</property>
<property>
<name>dfs.namenode.https-address</name>
<value>platform-010-030-050-084:50470</value>
</property>
</configuration>
- etc/hadoop/mapred-site.xml
https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- etc/hadoop/yarn-site.xml
https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle,spark_shuffle,spark2_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>platform-010-030-050-084:8050</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>platform-010-030-050-084:8141</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>platform-010-030-050-084:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>platform-010-030-050-084:8030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>platform-010-030-050-084:8088</value>
</property>
</configuration>
works 增加三个节点host
将文件权限修改给 hdfs
chown -R hdfs:hdfs /app/hadoop
复制 hadoop 至其他两个节点
cd /app scp -r hadoop/ hdfs@10.30.50.85:/app/hadoop scp -r hadoop/ hdfs@10.30.50.86:/app/hadoop
初始化hadoop
$HADOOP_HOME/bin/hdfs namenode -format $HADOOP_HOME/bin/hdfs —daemon start namenode $HADOOP_HOME/bin/hdfs —daemon start datanode
启动
$HADOOP_HOME/sbin/start-dfs.sh $HADOOP_HOME/sbin/start-yarn.sh
WEB : http://10.30.50.84:8088/
NAMENODE : http://10.30.50.84:50070/
安装Spark (http://spark.apache.org/)
解压缩 spark-3.0.0-bin-hadoop3.2.tgz
tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz
配置spark-env.sh
export JAVA_HOME=/app/tools/java/jdk1.8.0_77
export HADOOP_HOME=/app/hadoop/hadoop-3.3.0
export HADOOP_CONF_DIR=/app/hadoop/hadoop-3.3.0/etc/hadoop/
export SPARK_LOCAL_DIRS=/app/spark/spark-3.0.0-bin-hadoop3.2
export SPARK_CLASSPATH=/app/spark/spark-3.0.0-bin-hadoop3.2/bin
- 配置 slaves
platform-010-030-050-084
platform-010-030-050-085
platform-010-030-050-086
- 复制到另两台机器
- 启动
cd sbin ./start-all.sh
WEB : http://10.30.50.84:8080/
yarn 不同用户
hadoop fs -cat /user/data/yiqi/ladybird/app/20200819/*.gz | zcat | wc -l
- MAPReduce 一次读取一个小块
- 计算块大小公式
- 备份分配策略 - 负载
- on yarn 提交 => txt
hdfs 块大小的含义?
块-hdfs将文件分成若干块进行存储,除最后一个块可能未填满设置的块大小,其余都一样大。2.7.2之前默认大小64m 新版128m,过大会导致文件切分块过小,运行速度则会慢。过小会导致块过多,namenode寻址慢。块的设置应该考虑
减少硬盘寻道时间(disk seek time)HDFS设计前提是应对大数据量操作,若数据块大小设置过小,那需要读取的数据块数量就会增多,从而间接增加底层硬盘的寻道时间
减少Namenode内存消耗
由于NameNode记录着DataNode中的数据块信息,若数据块大小设置过小,则数据块数量增多,需要维护的数据块信息就会增多,从而消耗NameNode的内存。
Map崩溃问题
系统需要重新启动,启动过程中需要重新加载数据,数据块越大,数据加载时间越长,系统恢复过程越长
监管时间问题
主节点监管其他节点的情况,每个节点会周期性的与主节点进行汇报通信。倘若某一个节点保持沉默的时间超过一个预设的时间间隔,主节点会记录这个节点状态为死亡,并将该节点的数据转发给别的节点。而这个“预设时间间隔”是从数据块的角度大致估算的。
问题分解问题
数据量的大小与问题解决的复杂度呈线性关系。对于同一个算法,处理的数据量越大,时间复杂度越高。
约束Map输出
在Map Reduce框架里,Map之后的数据是要经过排序才执行Reduce操作的。这通常涉及到归并排序,而归并排序的算法思想便是“对小文件进行排序,然后将小文件归并成大文件”,因此“小文件”不宜过大。
将一个文件 200MB的 放入到hdfs中(副本是如何存储的,分配策略,实际存储的位置要标明,hdfs实际的存储策略,就是块和副本的分布)
先将 200MB 文件进行切块,按128M块大小计算,则切成 128M + 72M。默认使用 3 副本,也可以单独设置(hdfs dfs -setrep -w 5 [-R] /path/to/file)
HDFS的存放策略是一个副本存放在本地机架节点上,另一个副本存放在同一机架的另一个节点上,第三个副本存放在在不同机架的节点上。这种策略减少了机架间的数据传输,提高了写操作的效率。
hdfs storagepolicies命令来管理存储策略,默认 DISK列出所有存储策略 hdfs storagepolicies -listPolicies 设置存储策略 hdfs storagepolicies -setStoragePolicy -path -policy 取消存储策略 hdfs storagepolicies -unsetStoragePolicy -path 之后该目录或者文件,以其上级的目录为准,如果是根目录,那么就是HOT 获取存取策略 hdfs storagepolicies -getStoragePolicy -path 存储的位置 hdfs fsck /app/hadoop/countsResult.txt -files -blocks -locations
- 将200MB的文件下载到本地。(get的原理说明一下)hadoop fs -get
向 namenode 发送请求,namenode 返回 block 位置:
block1:host2,host1,host3
block2:host7,host8,host4
优选读取本机架上的数据。 - 按照spark 并提交一个 on yarn的任务。统计单词数量(200MB 自己生成一个存文本的逗号分割的单词文件)
Name node is in safe mode
bin目录下
./hadoop dfsadmin -safemode leave
Permission denied: user=hdfs, access=WRITE, inode=”/“:root:supergroup:drwxr-xr-x
$HADOOP_HOME/bin/hadoop fs -chmod 777 /