环境搭建
相比之前搭建Hadoop环境的Windows系统的相对繁琐步骤,Mac下显得简单不少。
虽然我们需要搭建的是Spark环境,但是因为Spark依赖了Hadoop的HDFS以及YARN计算框架,当然还有类似软件包管理软件。
安装前必备
操作系统: Mac OS X
JDK:1.8.0_251
命令终端:iTerm2
(Mac自带的命令终端也一样,只是配置环境参数需要到~/.bash_profile
下添加,对于iTerm2需要到~/.zshrc
中添加)
软件包管理工具:brew
(能够方便的安装和卸载软件,使用brew cash
还可以安装图形化的软件,类似于Ubuntu下的apt-get以及前端里的npm
)
安装Hadoop
上面步骤和条件如果都具备的话,就可以安装Hadoop了,这也是我唯一遇到坑的地方。
1. 配置ssh
配置ssh就是为了能够实现免密登录,这样方便远程管理Hadoop并无需登录密码在Hadoop集群上共享文件资源。
如果你的机子没有配置ssh的话,在命令终端输入ssh localhost
是需要输入你的电脑登录密码的。配置好ssh后,就无需输入密码了。
第一步就是在终端执行ssh-keygen -t rsa -P ''
,之后一路enter
键,当然如果你之前已经执行过这样的语句,那过程中会提示是否要覆盖原有的key,输入y
即可。
第二步执行语句cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
用于授权你的公钥到本地可以无需密码实现登录。
理论上这时候,你在终端输入ssh lcoalhost
就能够免密登录了。
但是,我在这里遇到了个问题,折腾了我蛮久。当我执行cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
的时候,总是出现如下警告zsh: permission denied: /Users/jackie/.ssh/authorized_keys
。
显然这是权限问题,我直接为ssh目录赋予777
、740
和700
都无效,还是报同样的错。于是查了下资料在这里看到了解决方案。
设置authorized_keys
权限——$ chmod 600 authorized_keys
设置.ssh
目录权限——$ chmod 700 -R .ssh
参考资料给出的解释是:文件和目录的权限千万别设置成chmod 777.
这个权限太大了,不安全,数字签名也不支持–!。
如果是别人电脑ssh到我的电脑,那么除了要把自己的私钥复制给别人,还需要执行cat id_rsa.pub >> authorized_keys
命令才行。
生成ssh后,使用 ssh localhost 来测试 ssh 是否成功。给出提醒如下:ssh: connect to host localhost port 22: Connection refused
这是因为mac电脑的共享配置未打开,在系统偏好设置 ->共享
中打开如下配置:
此时再次使用 ssh localhost
命令来测试已经成功。
2. 下载安装Hadoop
这时候brew的好处就体现出来了,你无需到Hadoop官网去找下载链接,只要在命令终端输入brew install hadoop
等命令执行完,你就可以看到在/usr/lcoal/Cellar
目录下就有了hadoop目录,表示安装成功。(当然命令执行过程中会因为网络或其他原因中断,这时候你只需要重新执行一次brew install hadoop
即可)
3. 配置Hadoop
3.1 进入安装目录/usr/local/Cellar/hadoop/2.8.0/libexec/etc/hadoop
,找到并打开hadoop-env.sh文件,将export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"
改为
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc="
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home"
(java_home请写上你本机上jdk安装的位置)
3.2 配置hdfs地址和端口
进入目录/usr/local/Cellar/hadoop/2.8.0/libexec/etc/hadoop
,打开core-site.xml
将<configuration></configuration>
替换为
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/Cellar/hadoop/hdfs/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:8020</value>
</property>
</configuration>
3.3 配置mapreduce中jobtracker的地址和端口
在相同的目录下,你可以看到一个mapred-site.xml.template
首先将文件重命名为mapred-site.xml
,同样将<configuration></configuration>
替换为
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:8021</value>
</property>
</configuration>
3.4 修改hdfs备份数
相同目录下,打开hdfs-site.xml
加上
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
4. 格式化HDFS
这个操作相当于一个文件系统的初始化,执行命令hdfs namenode -format
在终端最终会显示成功
20/10/17 10:30:46 INFO common.Storage: Storage directory /Users/zhangbin19/software/hadoop-2.6.0-cdh5.15.1/tmp/dfs/name has been successfully formatted.
20/10/17 10:30:46 INFO namenode.FSImageFormatProtobuf: Saving image file /Users/zhangbin19/software/hadoop-2.6.0-cdh5.15.1/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 using no compression
20/10/17 10:30:46 INFO namenode.FSImageFormatProtobuf: Image file /Users/zhangbin19/software/hadoop-2.6.0-cdh5.15.1/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 327 bytes saved in 0 seconds .
20/10/17 10:30:46 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
20/10/17 10:30:46 INFO util.ExitUtil: Exiting with status 0
20/10/17 10:30:46 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at bj-m-218760a.local/10.233.2.93
************************************************************/
5. 配置Hadoop环境变量
因为我用的是iTerm2,所以打开~/.zshrc
添加
export HADOOP_HOME=/usr/local/Cellar/hadoop/2.8.0
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
再执行source ~/.zhsrac
以确保配置生效
配置这个是方便在任意目录下全局开启关闭hadoop相关服务,而不需要到/usr/local/Cellar/hadoop/2.8.0/sbin
下执行。
6. 启动关闭Hadoop服务
启动/关闭HDSF服务
./start-dfs.sh
./stop-dfs.sh
启动成功后,我们在浏览器中输入http://localhost:50070
可以看到
这里执行启动命令时报错如下:
/usr/local/Cellar/hadoop/3.3.0/sbin ./start-dfs.sh
WARNING: log4j.properties is not found. HADOOP_CONF_DIR may be incomplete.
ERROR: Invalid HADOOP_COMMON_HOME
解决方法:在vim ~/.zshrc
里面配置环境变量HADOOP_COMMON_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
修改完之后执行:source ~/.zshrc
笔者按照原博走的时候启动命令
./start-dfs.sh
没有任何反应,访问http://localhost:50070也打不开,最后参照的之前另一篇文章搞定的。。。
启动/关闭YARN服务
./start-yarn.sh
./stop-yarn.sh
启动成功后,我们在浏览器中输入http://localhost:8088
可以看到
启动/关闭Hadoop服务(等效上面两个)
./start-all.sh
./stop-all.sh
注意,如果从别人电脑往我的电脑里传文件,出现connection refused提示。则可能需要把电脑的hosts文件中的 localhost 127.0.0.1
改为 localhost 0.0.0.0
。
另外,可以通过jps
命令看到当前hadoop启动的节点。
可以通过hdfs dfs -mkdir -p /input
命令来在 HDFS 文件系统中创建目录。注意这个目录是在HDFS的文件系统中的目录,而不是你电脑上的目录。
安装Scala
同样的配方,执行brew install scala
你就可以拥有Scala。
在终端执行scala -version
,如果出现类似Scala code runner version 2.12.2 -- Copyright 2002-2017, LAMP/EPFL and Lightbend, Inc.
说明你安装成功了。
同样,不要忘了配置Scala的环境变量,打开~/.zshrc
添加
export SCALA_HOME=/usr/local/Cellar/scala/2.12.2
export PATH=$PATH:$SCALA_HOME/bin
安装Spark
有了前面这么多的准备工作,终于可以安装Spark了。也是比较简单,起码我没有遇到坑。
到Spark官网下载你需要的Spark版本,注意这里我们看到需要有依赖的Hadoop,而且还让你选择Hadoop的版本。
下载完直接双击压缩包就会解压(建议安装一个解压软件),将其重命名为spark放到/usr/local
下面。
毫无例外,我们还需要一个环境参数配置,打开~/.zshrc
添加
export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$SPARK_HOME/bin
走到这一步,我们终于可以启动spark了,打开终端,输入spark-shell
,这时候会看到
另外也可以通过brew install apache-spark
来安装。
配置号环境变量vim ~/.zshrc
# spark的配置
export SPARK_PATH=/usr/local/Cellar/apache-spark/3.0.1
export PATH=$SPARK_PATH/bin:$PATH
source ~/.zshrc
使环境变量生效。
通过spark-shell
命令就可以启动spark了
spark-shell
20/10/17 15:01:41 WARN Utils: Your hostname, bj-m-218760a.local resolves to a loopback address: 127.0.0.1; using 10.233.2.93 instead (on interface en0)
20/10/17 15:01:41 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.spark.unsafe.Platform (file:/usr/local/Cellar/apache-spark/3.0.1/libexec/jars/spark-unsafe_2.12-3.0.1.jar) to constructor java.nio.DirectByteBuffer(long,int)
WARNING: Please consider reporting this to the maintainers of org.apache.spark.unsafe.Platform
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
20/10/17 15:01:41 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://10.233.2.93:4040
Spark context available as 'sc' (master = local[*], app id = local-1602918106479).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 3.0.1
/_/
Using Scala version 2.12.10 (OpenJDK 64-Bit Server VM, Java 11.0.8)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
至此,安装全部结束。