Hadoop
快来分享你的内容吧~
- 2025-01-31·后端开发
Hadoop3的配置信息
## 一、修改配置文件 ### 1.hadoop-env.sh ```shell export JAVA_HOME=/export/server/jdk1.8.0_65 #文件最后添加 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root ``` ### 2.core-site.xml ```xml <!-- 设置默认使用的文件系统 Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系统 --> <property> <name>fs.defaultFS</name> <value>hdfs://node1:8020</value> </property> <!-- 设置Hadoop本地保存数据路径 --> <property> <name>hadoop.tmp.dir</name> <value>/export/data/hadoop-3.3.0</value> </property> <!-- 设置HDFS web UI用户身份 --> <property> <name>hadoop.http.staticuser.user</name> <value>root</value> </property> <!-- 整合hive 用户代理设置 --> <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property> ``` ### 3.hdfs-site.xml ```xml <!-- 指定secondarynamenode运行位置 --> <!-- 设置SNN进程运行机器位置信息 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>node2:9868</value> </property> ``` ### 4.mapred-sit.xml ```xml <!-- 设置MR程序默认运行模式: yarn集群模式 local本地模式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- MR程序历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>node1:10020</value> </property> <!-- 历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>node1:19888</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> ``` ### 5.yarn-site.xml ```xml <!-- 设置YARN集群主角色运行机器位置 --> <property> <name>yarn.resourcemanager.hostname</name> <value>node1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 是否将对容器实施物理内存限制 --> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <!-- 是否将对容器实施虚拟内存限制。 --> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <!-- 开启日志聚集 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 设置yarn历史服务器地址 --> <property> <name>yarn.log.server.url</name> <value>http://node1:19888/jobhistory/logs</value> </property> <!-- 保存的时间7天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property> ``` ### 6.workers ```shell vi workers node1 node2 node3 ``` ## 二、分发安装包并启动 ```shell cd /export/server scp -r hadoop-3.3.0 root@node2:$PWD scp -r hadoop-3.3.0 root@node3:$PWD # 添加环境变量 vim /etc/proflie # Hadoop3 export HADOOP_HOME=/export/server/hadoop-3.3.0 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native:$HADOOP_COMMON_LIB_NATIVE_DIR" export YARN_HOME=$HADOOP_HOME export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop #有个警告信息就是处理不了,解决了踢我谢谢 #WARNING: YARN_CONF_DIR has been replaced by HADOOP_CONF_DIR. Using value of YARN_CONF_DIR.Stopping nodemanagers #export YARN_CONF_DIR=$YARN_HOME/etc/hadoop export HADOOP_LOG_DIR=$HADOOP_HOME/logs export HDFS_CONF_DIR=$HADOOP_HOME/etc/hadoop export PATH=.:$JAVA_HOME/lib:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$PATH source /etc/profile # 首次启动 格式化namenode hdfs namenode -format # 一键启动 start-dfs.sh start-yarn.sh ``` Web UI页面 + HDFS集群:[http://node1:9870/](http://node1:9870/) + YARN集群:[http://node1:8088/](http://node1:8088/) ### 所需要的文件 [jdk-8u65-linux-x64.tar.gz](https://www.yuque.com/attachments/yuque/0/2024/gz/34310486/1708587800524-9f18f67f-2832-4abd-af54-e5c4189992d6.gz) [hadoop-3.3.0-src.tar.gz](https://www.yuque.com/attachments/yuque/0/2024/gz/34310486/1708587914996-b503c3fb-283e-4109-a43a-d878e2c4650e.gz)
面经题目-详细描述下Hadoop的checkpoint流程
Hadoop的Checkpoint流程是HDFS(Hadoop Distributed File System)中维护元数据一致性的核心机制,主要用于合并NameNode的内存元数据(FsImage)与编辑日志(EditLog),从而缩短系统启动时间和降低故障恢复成本。以下是其详细流程: --- ### **1. Checkpoint触发条件** - **时间周期触发**:默认每3600秒(1小时)执行一次(通过`dfs.namenode.checkpoint.period`配置)。 - **事务数量触发**:当EditLog的事务操作数量达到100万次(通过`dfs.namenode.checkpoint.txns`配置)。 --- ### **2. Checkpoint执行流程** #### **步骤1:Secondary NameNode发起请求** - Secondary NameNode(或Checkpoint Node)定期向Active NameNode发送HTTP GET请求,查询是否需要执行Checkpoint。 - NameNode返回当前EditLog的状态信息(如最后的事务ID)。 #### **步骤2:滚动EditLog** - NameNode停止写入当前EditLog文件(如`edits_inprogress_001`),并创建一个新的EditLog文件(如`edits_inprogress_002`)继续记录后续操作。 #### **步骤3:传输元数据文件** - Secondary NameNode通过HTTP GET请求从NameNode下载以下文件: - **最新的FsImage文件**(如`fsimage_000000001`)。 - **待合并的EditLog文件**(如`edits_001-002`)。 #### **步骤4:合并FsImage与EditLog** - Secondary NameNode将FsImage加载到内存,并按顺序重放EditLog中的所有事务操作,生成新的合并后的FsImage文件(如`fsimage.ckpt_000000002`)。 - 合并完成后,生成新的MD5校验文件(如`fsimage.ckpt_000000002.md5`)。 #### **步骤5:上传合并结果** - Secondary NameNode通过HTTP PUT将新生成的FsImage和校验文件上传至NameNode。 #### **步骤6:完成Checkpoint** - NameNode接收新FsImage后: 1. 用新FsImage替换旧的FsImage文件。 2. 删除已合并的EditLog文件。 3. 更新`seen_txid`文件以记录最新事务ID。 --- ### **3. 关键目录与文件** - **NameNode目录结构**: ``` /hadoop/namenode/ ├── current/ │ ├── fsimage_000000000 │ ├── fsimage_000000000.md5 │ ├── edits_000001-000002 │ └── seen_txid └── in_use.lock ``` - **Secondary NameNode工作目录**: ``` /hadoop/namesecondary/ └── current/ ├── fsimage.ckpt_000000002 └── fsimage.ckpt_000000002.md5 ``` --- ### **4. 注意事项** - **非实时备份**:Secondary NameNode并非热备节点,仅用于离线合并元数据。 - **高可用(HA)场景**:在启用HA的集群中,Checkpoint由Standby NameNode自动完成,无需Secondary NameNode。 - **手动触发命令**:可通过`hdfs dfsadmin -saveNamespace`强制触发Checkpoint。 --- ### **5. 配置参数示例** ```xml <!-- hdfs-site.xml --> <property> <name>dfs.namenode.checkpoint.period</name> <value>3600</value> <!-- Checkpoint时间间隔 --> </property> <property> <name>dfs.namenode.checkpoint.txns</name> <value>1000000</value> <!-- 触发Checkpoint的事务数阈值 --> </property> ``` 通过Checkpoint机制,Hadoop确保了元数据的高效管理和灾难恢复能力,是保障HDFS稳定运行的核心环节。
统计一篇文章中单词个数。
要使用 Hadoop 来统计一篇文章中的单词个数,可以编写一个 MapReduce 程序。MapReduce 是 Hadoop 的核心计算框架,用于处理大规模数据集。以下是一个简单的 MapReduce 程序示例,用于统计文章中的单词个数。 编写 MapReduce 程序 Mapper 类 Mapper 类负责将输入的文本分割成单词,并输出每个单词及其出现次数(初始为 1)。 ```java import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); @Override public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasMoreTokens()) { word.set(tokenizer.nextToken()); context.write(word, one); } } } ``` Reducer 类 Reducer 类负责汇总每个单词的出现次数。 ```java import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); } } ``` 驱动程序 驱动程序负责配置和启动 MapReduce 作业。 ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCountDriver { public static void main(String[] args) throws Exception { if (args.length != 2) { System.err.println("Usage: WordCount <input path> <output path>"); System.exit(-1); } Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCountDriver.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ```
给定 a、b 两个文件,各存放 50 亿个 url,每个 url 各占 64 字节,内存限 制是 4G,让你找出 a、b 文件共同的 url?
在内存限制为 4GB 的情况下,直接将 50 亿个 URL 读入内存是不可行的。每个 URL 占 64 字节,50 亿个 URL 总共需要约 3.2TB 的内存。因此,我们需要使用外部排序和 MapReduce 等技术来解决这个问题。以下是使用 Hadoop 的解决方案: 解决方案 数据预处理:将文件 a 和 b 分成多个小文件,每个小文件的大小适合内存处理。 MapReduce 任务:使用 MapReduce 来找出两个文件中的共同 URL。 步骤 1. 数据预处理 将文件 a 和 b 分成多个小文件,每个小文件的大小适合内存处理。假设每个小文件的大小为 1GB,那么每个文件可以分成 32 个小文件(因为 4GB 内存可以处理 1GB 的数据)。 ```bash split -b 1G a a_ split -b 1G b b_ ``` 2. 编写 MapReduce 程序 编写一个 MapReduce 程序来找出两个文件中的共同 URL。 Mapper Mapper 读取输入文件中的 URL,并输出 (URL, 文件标识) 对。 ```java import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class CommonURLMapper extends Mapper<LongWritable, Text, Text, Text> { private final static Text fileMarker = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasMoreTokens()) { String url = tokenizer.nextToken(); if (context.getInputSplit().toString().contains("a_")) { fileMarker.set("a"); } else { fileMarker.set("b"); } context.write(new Text(url), fileMarker); } } } ``` Reducer Reducer 收集来自 Mapper 的 (URL, 文件标识) 对,并找出同时出现在文件 a 和 b 中的 URL。 ```java import java.io.IOException; import java.util.HashSet; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class CommonURLReducer extends Reducer<Text, Text, Text, Text> { private HashSet<String> seenFiles = new HashSet<>(); @Override protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { for (Text val : values) { seenFiles.add(val.toString()); } if (seenFiles.contains("a") && seenFiles.contains("b")) { context.write(key, new Text("common")); } seenFiles.clear(); } } ``` 3. 配置和运行 MapReduce 作业 编写一个主类来配置和运行 MapReduce 作业。 ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class CommonURLJob { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "Common URL Finder"); job.setJarByClass(CommonURLJob.class); job.setMapperClass(CommonURLMapper.class); job.setReducerClass(CommonURLReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` 4. 运行作业 将上述代码编译并打包成 JAR 文件,然后在 Hadoop 集群上运行。 ```bash hadoop jar common-url-finder.jar CommonURLJob /input /output ```
部署单机hadoop遇到的一个小问题
<html> <head></head> <body> <div class="content ql-editor"> <p style="font-style;font-variant-ligatures;font-variant-caps;font-weight; font-size: 14px; font-family: PingFangSC-Regular;">今天云服务器上部署单机hadoop的时候,使用Big Data Tools连接HDFS上传文件时出现only be written to 0 of the 1 minreplication nodes. there are 1 datanode(s) running and 1 node(s) are excluded in this operation 这个问题。 需要在windows的hosts文件中添加</p> <p style="font-style;font-variant-ligatures;font-variant-caps;font-weight; font-size: 14px; font-family: PingFangSC-Regular;"><br></p> <p><strong>124.221.192.10 node1</strong></p> <p><br></p> <p style="font-style;font-variant-ligatures;font-variant-caps;font-weight; font-size: 14px; font-family: PingFangSC-Regular;">外网ip workers中记录的dataNode名字</p> <p style="font-style;font-variant-ligatures;font-variant-caps;font-weight; font-size: 14px; font-family: PingFangSC-Regular;"><br></p> <p style="font-style;font-variant-ligatures;font-variant-caps;font-weight; font-size: 14px; font-family: PingFangSC-Regular;">具体原因是在stackoverflow上找到的</p> <p style=""><span style="font-size: 14px;">https://stackoverflow.com/questions/5293446/hdfs-error-could-only-be-replicated-to-0-nodes-instead-of-1</span></p> <p style=""><span style="font-size: 14px;"><br></span></p> <p style=""><span style="font-size: 14px;"><br></span></p> <p style="margin-bottom;font-style;font-variant-ligatures;font-variant-caps;font-weight; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI Adjusted", "Segoe UI", "Liberation Sans", sans-serif; font-size: 15px;vertical-align;box-sizing;clear;--_pr-img-mb; color: rgb(35, 38, 41);white-space;">It take me a week to figure out the problem in my situation.</p> <p style="margin-bottom;font-style;font-variant-ligatures;font-variant-caps;font-weight; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI Adjusted", "Segoe UI", "Liberation Sans", sans-serif; font-size: 15px;vertical-align;box-sizing;clear;--_pr-img-mb; color: rgb(35, 38, 41);white-space;">When the client(your program) ask the nameNode for data operation, the nameNode picks up a dataNode and navigate the client to it, by giving the dataNode's ip to the client.</p> <p style="margin-bottom;font-style;font-variant-ligatures;font-variant-caps;font-weight; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI Adjusted", "Segoe UI", "Liberation Sans", sans-serif; font-size: 15px;vertical-align;box-sizing;clear;--_pr-img-mb; color: rgb(35, 38, 41);white-space;">But, when the dataNode host is configured to has multiple ip, and the nameNode gives you the one your client CAN'T ACCESS TO, the client would add the dataNode to exclude list and ask the nameNode for a new one, and finally all dataNode are excluded, you get this error.</p> <p style="font-style;font-variant-ligatures;font-variant-caps;font-weight; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI Adjusted", "Segoe UI", "Liberation Sans", sans-serif; font-size: 15px;vertical-align;box-sizing;clear;--_pr-img-mb; color: rgb(35, 38, 41);white-space;">So check node's ip settings before you try everything!!!</p> <p style=""><span style="font-size: 14px;"><br></span></p> <p style="">以下是百度翻译:</p> <p style="">我花了一个星期的时间才弄清楚我的处境中的问题。 当客户端(您的程序)向nameNode请求数据操作时,nameNode会拾取一个dataNode,并通过将dataNode的ip提供给客户端来将客户端导航到它。 但是,当dataNode主机被配置为具有多个ip,并且nameNode给了你一个客户端无法访问的ip时,客户端会将dataNode添加到排除列表中,并向nameNode请求一个新的ip,最后所有的dataNode都被排除在外,你会得到这个错误。 所以,在尝试所有操作之前,请检查节点的ip设置!!!</p> <p style="font-style;font-variant-ligatures;font-variant-caps;font-weight; font-size: 14px; font-family: PingFangSC-Regular;">#经验# #大数据#</p> </div> </body> </html>
