Hadoop(01) Hadoop3

4.2 相对路径和绝对路径

请务必注意命令中的相对路径与绝对路径,本文后续出现的 ./bin/..../etc/... 等包含 ./ 的路径,均为相对路径,以 /usr/local/hadoop 为当前目录。

例如在 /usr/local/hadoop 目录中执行 ./bin/hadoop version 等同于执行 /usr/local/hadoop/bin/hadoop version。可以将相对路径改成绝对路径来执行,但如果你是在主文件夹 ~ 中执行 ./bin/hadoop version,执行的会是 /home/hadoop/bin/hadoop version,就不是我们所想要的了。

4.3 Hadoop的PATH变量配置

为了可以使系统能够在任何目录下都能直接运行Hadoop的可执行文件,即hadoop、hdfs等命令,需要完成PATH变量配置。

具体而言,export命令用于设置环境变量,PATH是一个特殊的环境变量,用于指定系统在哪些目录中查找可执行文件。通过将Hadoop所在的binsbin目录添加到PATH中,系统就能够在运行命令时自动搜索并找到Hadoop的可执行文件。

cd ~
vim ~/.bashrc

然后在该文件的最上面输入以下的内容:

export HADOOP_HOME=/usr/local/hadoop-3.3.6
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

最后一行是在原有配置JAVA_HOME的PATH路径(在上面JDK的配置中的PATH配置)的基础上,增加了 H A D O O P _ H O M E / b i n : HADOOP\_HOME/bin: HADOOP_HOME/bin:HADOOP_HOME/sbin:的路径,然后保存退出:

保存后执行命令“source ~/.bashrc”,使配置生效。

source ~/.bashrc
echo $PATH | tr ':' '\n'   # 查看所有的PATH配置

参数说明:

  1. export HADOOP_HOME=/usr/local/hadoop-3.3.6:设置HADOOP_HOME环境变量,将其指向Hadoop安装的根目录。
  2. export HADOOP_MAPRED_HOME=$HADOOP_HOME:设置HADOOP_MAPRED_HOME环境变量,指向Hadoop MapReduce组件的安装目录,这里与HADOOP_HOME相同。
  3. export HADOOP_COMMON_HOME=$HADOOP_HOME:设置HADOOP_COMMON_HOME环境变量,指向Hadoop Common组件的安装目录,这里与HADOOP_HOME相同。
  4. export HADOOP_HDFS_HOME=$HADOOP_HOME:设置HADOOP_HDFS_HOME环境变量,指向Hadoop HDFS组件的安装目录,这里与HADOOP_HOME相同。
  5. export YARN_HOME=$HADOOP_HOME:设置YARN_HOME环境变量,指向Hadoop YARN组件的安装目录,这里与HADOOP_HOME相同。
  6. export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native:设置HADOOP_COMMON_LIB_NATIVE_DIR环境变量,指向Hadoop本地库文件的路径,这里是Hadoop安装目录下的lib/native目录。
  7. export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib":设置HADOOP_OPTS环境变量,用于配置Hadoop的Java虚拟机选项。这里将java.library.path属性设置为Hadoop安装目录下的lib目录,以便Java虚拟机能够正确加载Hadoop所需的本地库文件。
  8. export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH:将Hadoop和Java的可执行文件路径添加到PATH环境变量中,以便系统可以在任意位置执行Hadoop和Java的命令。这里包括Java的binjre/bin目录,以及Hadoop的binsbin目录。

五、Hadoop的配置

5.1 Hadoop的单机配置(非分布式)

Hadoop 的单机模式是一种在单个节点上运行 Hadoop 的模式,是Hadoop 默认模式,用于本地开发、测试和学习目的。

在单机模式下,Hadoop 不会构建分布式集群,而是在单个节点上模拟分布式环境,无需进行额外的配置即可运行 Hadoop。非分布式即单 Java 进程,方便进行调试

运行Hadoop单机实例

现在我们可以执行例子来感受下 Hadoop 的运行。Hadoop 附带了丰富的例子(运行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar 可以看到所有例子),包括 wordcount、terasort、join、grep 等。

在此我们选择其中的一个实例来运行即可(grep) ,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中。

cd /usr/local/hadoop-3.3.6
mkdir ./input
cp ./etc/hadoop/*.xml ./input   # 将配置文件作为输入文件复制到input文件夹中
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep ./input ./output 'dfs[a-z.]+'
cat ./output/*          # 查看运行结果

注意,Hadoop 默认不会覆盖结果文件,因此如果想再次运行上面实例会提示出错,需要先将 ./output 删除。

rm -r ./output

5.2 Hadoop的伪分布式配置

Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。

Hadoop 的配置文件位于 /usr/local/hadoop-3.3.6/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。

切换目录到:cd /usr/local/hadoop-3.3.6/etc/hadoop/

①修改core-site.xml

原始core-site.xml

修改后的core-site.cml

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop-3.3.6/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

参数说明:

  1. hadoop.tmp.dir:指定了 Hadoop 临时目录的路径。临时目录被设置为 /usr/local/hadoop-3.3.6/tmp。临时目录用于存储 Hadoop 运行时产生的临时文件,如本地数据块、中间结果等。
  2. fs.defaultFS:指定了默认的文件系统的 URI。文件系统 URI 被设置为 hdfs://localhost:9000,表示使用 Hadoop 分布式文件系统(HDFS)作为默认文件系统,并且 HDFS 的 Namenode 服务器运行在本地主机的端口 9000 上。

②修改hdfs-site.xml 文件

原始的hdfs-site.xml文件

修改后的hdfs-site.xml文件

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop-3.3.6/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop-3.3.6/tmp/dfs/data</value>
    </property>
</configuration>

Hadoop的配置文件说明

Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。

此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行(官方教程如此),不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。所以我们进行了设置,同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。

③配置完成后,执行 NameNode 的格式化
cd /usr/local/hadoop-3.3.6/
./bin/hdfs namenode -format

如果成功则会显示如下的内容:

如果显示如下的内容:

 如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。

如果已经按照前面教程在.bashrc文件中设置了JAVA_HOME,还是出现 Error: JAVA_HOME is not set and could not be found. 的错误,那么,请到hadoop的安装目录修改配置文件“/usr/local/hadoop-3.3.6/etc/hadoop/hadoop-env.sh”,在里面找到“export JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成JAVA安装路径的具体地址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次启动Hadoop。

④开启 NameNode 和 DataNode 守护进程

以上的日志中包含一个警告:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable 表示无法加载与自己的平台兼容的本机Hadoop库。不过,Hadoop将使用内置的Java类来代替。 WARN 提示可以忽略,并不会影响正常使用。

现在,Hadoop分布式文件系统已经成功启动,可以使用Hadoop进行数据处理和分析。

成功启动后,可以访问 Web 界面 http://localhost:9870 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。此处的localhost替换为自己虚拟机系统的地址即可。

运行Hadoop伪分布式实例

在上面的单机模式实例中,grep 例子读取的是本地数据。而伪分布式读取的则是 HDFS 上的数据。要想使用 HDFS,首先需要在 HDFS 中创建用户目录:

①创建用户目录
cd /usr/local/hadoop-3.3.6  # 切换目录
./bin/hdfs dfs -mkdir -p /user/hadoop  # 在HDFS中创建用户目录
./bin/hdfs dfs -ls /user     # 查看是否创建成功

注意: 教材《大数据技术原理与应用》的命令是以"./bin/hadoop dfs"开头的Shell命令方式,实际上有三种shell命令方式。

  1. hadoop fs
  2. hadoop dfs
  3. hdfs dfs

hadoop fs:适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
hadoop dfs:只能适用于HDFS文件系统
hdfs dfs:跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统。

hadoop fshadoop dfs 和 hdfs dfs 命令实际上是指相同的命令,用于与 Hadoop 分布式文件系统(HDFS)进行交互。这些命令是 Hadoop 提供的命令行工具,用于管理和操作 HDFS 上的文件和目录。

在早期版本的 Hadoop 中,hadoop fs 和 hadoop dfs 是等效的,都用于执行文件系统操作。后来,为了更好地反映操作对象是分布式文件系统,官方推荐使用 hdfs dfs 命令来代替。

所以,hadoop fs 和 hadoop dfs 可以视为过时的命令,而 hdfs dfs 是推荐的用于与 HDFS 交互的命令。

②将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中

即将 /usr/local/hadoop-3.3.6/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:

cd /usr/local/hadoop-3.3.6/  # 切换目录
./bin/hdfs dfs -mkdir input   # 创建 "input" 的目录
./bin/hdfs dfs -put ./etc/hadoop/*.xml input  # 复制到目标目录input
./bin/hdfs dfs -ls input   # 列出input中的信息

 伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。

③执行
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep input output 'dfs[a-z.]+'
④查看运行结果

查看的是位于 HDFS 中的输出结果

./bin/hdfs dfs -cat output/*

 结果如上所示,注意到刚才因为我们已经更改了配置文件,所以运行结果和在单机实例中的略有不同。

⑤可以将运行结果取回到本地
rm -r ./output    # 先删除本地的 output 文件夹(如果存在)
./bin/hdfs dfs -get output ./output     # 将 HDFS 上的 output 文件夹拷贝到本机
cat ./output/*

如果想要再次执行相同的命令  ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep input output ‘dfs[a-z.]+’ ,就会产生错误。

Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:

./bin/hdfs dfs -rm -r output    # 删除 output 文件夹

运行程序时,输出目录不能存在: 运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作:

Configuration conf = new Configuration();
Job job = new Job(conf);
 
/* 删除输出目录 */


![img](https://img-blog.csdnimg.cn/img_convert/983b6bd5902473522d76ad06d62966a9.png)
![img](https://img-blog.csdnimg.cn/img_convert/8f6d00a92831426bdd1be9354f812236.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作:



Configuration conf = new Configuration();
Job job = new Job(conf);

/* 删除输出目录 */

[外链图片转存中…(img-arZkjifH-4701984831655)]
[外链图片转存中…(img-7acBgWzB-4701984831656)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值