Apache Hadoop (3.3.0)

http://hadoop.apache.org/

创建用户 (由于配置文件设置 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

  1. 下载 java 包 解压至 /app/tools/java
  2. vim /etc/profile
  1. export JAVA_HOME=/app/tools/java/jdk1.8.0_77
  2. export PATH=$PATH:$JAVA_HOME/bin
  3. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  4. export JRE_HOME=$JAVA_HOME/jre
  1. 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

  1. export HADOOP_HOME=/app/hadoop/hadoop-3.3.0

其他两个节点也配置

  1. 编辑 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 网络拓扑脚本名称
  1. <configuration>
  2. <property>
  3. <name>fs.defaultFS</name>
  4. <value>hdfs://platform-010-030-050-084:8020</value>
  5. </property>
  6. <property>
  7. <name>io.file.buffer.size</name>
  8. <value>131072</value>
  9. </property>
  10. <property>
  11. <name>fs.trash.interval</name>
  12. <value>360</value>
  13. </property>
  14. <property>
  15. <name>hadoop.http.authentication.simple.anonymous.allowed</name>
  16. <value>true</value>
  17. </property>
  18. <property>
  19. <name>io.compression.codecs</name>
  20. <value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.SnappyCodec</value>
  21. </property>
  22. <property>
  23. <name>ipc.client.connect.max.retries</name>
  24. <value>50</value>
  25. </property>
  26. <property>
  27. <name>ipc.client.connection.maxidletime</name>
  28. <value>30000</value>
  29. </property>
  30. <property>
  31. <name>ipc.client.idlethreshold</name>
  32. <value>8000</value>
  33. </property>
  34. <property>
  35. <name>ipc.client.tcpnodelay</name>
  36. <value>true</value>
  37. </property>
  38. </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>
<configuration>
    <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
    </property>
</configuration>
<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
  1. hdfs 块大小的含义?
    块-hdfs将文件分成若干块进行存储,除最后一个块可能未填满设置的块大小,其余都一样大。2.7.2之前默认大小64m 新版128m,过大会导致文件切分块过小,运行速度则会慢。过小会导致块过多,namenode寻址慢。块的设置应该考虑
    减少硬盘寻道时间(disk seek time)

    HDFS设计前提是应对大数据量操作,若数据块大小设置过小,那需要读取的数据块数量就会增多,从而间接增加底层硬盘的寻道时间

  2. 减少Namenode内存消耗

    由于NameNode记录着DataNode中的数据块信息,若数据块大小设置过小,则数据块数量增多,需要维护的数据块信息就会增多,从而消耗NameNode的内存。

  3. Map崩溃问题

    系统需要重新启动,启动过程中需要重新加载数据,数据块越大,数据加载时间越长,系统恢复过程越长

  4. 监管时间问题

    主节点监管其他节点的情况,每个节点会周期性的与主节点进行汇报通信。倘若某一个节点保持沉默的时间超过一个预设的时间间隔,主节点会记录这个节点状态为死亡,并将该节点的数据转发给别的节点。而这个“预设时间间隔”是从数据块的角度大致估算的。

  5. 问题分解问题

    数据量的大小与问题解决的复杂度呈线性关系。对于同一个算法,处理的数据量越大,时间复杂度越高。

  6. 约束Map输出

    在Map Reduce框架里,Map之后的数据是要经过排序才执行Reduce操作的。这通常涉及到归并排序,而归并排序的算法思想便是“对小文件进行排序,然后将小文件归并成大文件”,因此“小文件”不宜过大。

  7. 将一个文件 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

  8. 将200MB的文件下载到本地。(get的原理说明一下)hadoop fs -get
    向 namenode 发送请求,namenode 返回 block 位置:
    block1:host2,host1,host3
    block2:host7,host8,host4
    优选读取本机架上的数据。
  9. 按照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 /