一、Intellij Idea
--------------------------------------------
1.下载idea: https://www.jetbrains.com/idea/download/download-thanks.html
2.安装idea
3.获取在线注册码:http://idea.lanyus.com/
或者直接拷贝代码
K71U8DBPNE-eyJsaWNlbnNlSWQiOiJLNzFVOERCUE5FIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IkZvciBlZHVjYXRpb25hbCB1c2Ugb25seSIsImNoZWNrQ29uY3VycmVudFVzZSI6ZmFsc2UsInByb2R1Y3RzIjpbeyJjb2RlIjoiSUkiLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifSx7ImNvZGUiOiJSUzAiLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifSx7ImNvZGUiOiJXUyIsInBhaWRVcFRvIjoiMjAxOS0wNS0wNCJ9LHsiY29kZSI6IlJEIiwicGFpZFVwVG8iOiIyMDE5LTA1LTA0In0seyJjb2RlIjoiUkMiLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifSx7ImNvZGUiOiJEQyIsInBhaWRVcFRvIjoiMjAxOS0wNS0wNCJ9LHsiY29kZSI6IkRCIiwicGFpZFVwVG8iOiIyMDE5LTA1LTA0In0seyJjb2RlIjoiUk0iLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifSx7ImNvZGUiOiJETSIsInBhaWRVcFRvIjoiMjAxOS0wNS0wNCJ9LHsiY29kZSI6IkFDIiwicGFpZFVwVG8iOiIyMDE5LTA1LTA0In0seyJjb2RlIjoiRFBOIiwicGFpZFVwVG8iOiIyMDE5LTA1LTA0In0seyJjb2RlIjoiR08iLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifSx7ImNvZGUiOiJQUyIsInBhaWRVcFRvIjoiMjAxOS0wNS0wNCJ9LHsiY29kZSI6IkNMIiwicGFpZFVwVG8iOiIyMDE5LTA1LTA0In0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifSx7ImNvZGUiOiJSU1UiLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifV0sImhhc2giOiI4OTA4Mjg5LzAiLCJncmFjZVBlcmlvZERheXMiOjAsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-Owt3/+LdCpedvF0eQ8635yYt0+ZLtCfIHOKzSrx5hBtbKGYRPFDrdgQAK6lJjexl2emLBcUq729K1+ukY9Js0nx1NH09l9Rw4c7k9wUksLl6RWx7Hcdcma1AHolfSp79NynSMZzQQLFohNyjD+dXfXM5GYd2OTHya0zYjTNMmAJuuRsapJMP9F1z7UTpMpLMxS/JaCWdyX6qIs+funJdPF7bjzYAQBvtbz+6SANBgN36gG1B2xHhccTn6WE8vagwwSNuM70egpahcTktoHxI7uS1JGN9gKAr6nbp+8DbFz3a2wd+XoF3nSJb/d2f/6zJR8yJF8AOyb30kwg3zf5cWw==-MIIEPjCCAiagAwIBAgIBBTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE1MTEwMjA4MjE0OFoXDTE4MTEwMTA4MjE0OFowETEPMA0GA1UEAwwGcHJvZDN5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQC9WZuYgQedSuOc5TOUSrRigMw4/+wuC5EtZBfvdl4HT/8vzMW/oUlIP4YCvA0XKyBaCJ2iX+ZCDKoPfiYXiaSiH+HxAPV6J79vvouxKrWg2XV6ShFtPLP+0gPdGq3x9R3+kJbmAm8w+FOdlWqAfJrLvpzMGNeDU14YGXiZ9bVzmIQbwrBA+c/F4tlK/DV07dsNExihqFoibnqDiVNTGombaU2dDup2gwKdL81ua8EIcGNExHe82kjF4zwfadHk3bQVvbfdAwxcDy4xBjs3L4raPLU3yenSzr/OEur1+jfOxnQSmEcMXKXgrAQ9U55gwjcOFKrgOxEdek/Sk1VfOjvS+nuM4eyEruFMfaZHzoQiuw4IqgGc45ohFH0UUyjYcuFxxDSU9lMCv8qdHKm+wnPRb0l9l5vXsCBDuhAGYD6ss+Ga+aDY6f/qXZuUCEUOH3QUNbbCUlviSz6+GiRnt1kA9N2Qachl+2yBfaqUqr8h7Z2gsx5LcIf5kYNsqJ0GavXTVyWh7PYiKX4bs354ZQLUwwa/cG++2+wNWP+HtBhVxMRNTdVhSm38AknZlD+PTAsWGu9GyLmhti2EnVwGybSD2Dxmhxk3IPCkhKAK+pl0eWYGZWG3tJ9mZ7SowcXLWDFAk0lRJnKGFMTggrWjV8GYpw5bq23VmIqqDLgkNzuoog==
4.配置和使用idea
a.修改自动补全代码
editor --> KeyMap --> 选择 Eclipse copy --> Mian menu --> code --> completion --> basic --> 修改为 alt + /
b.修改快捷输入
syso --> System.out.println("");
main --> public static main ...
editor --> live templates --> + --> group --> java --> + --> live templates --> ...
5.新建项目 -- 新建模块
File --> new --> project --> new --> module
6.配置Maven
file --> setting --> maven --> user setting file --> local repository
7.设置文件的编码为utf-8
file --> setting --> File Encodings --> global : utf-8 -->Project : utf - 8
--> Default encoding for properties files : utf-8 后面Transparent打钩 --> ok
8.自己的资源请放入main/java/resources 下,以便于加载。比如core-site.xml文件等
~.常用快捷键,持续更新...
Alt + Enter --> //错误提示,自动解析错误.光标位于行尾时可自动补全变量名及其引用
Ctrl + Alt + Enter --> //自动完成一行代码(包括自动填写行尾的分号)
shift + shift --> //强大的搜索功能,只要是项目中有的,啥都能搜
ctrl + shift + r --> //搜索类
ctrl + e --> //最近文件
ctrl + o --> //打开等级树
二、hadoop 常用指令
----------------------------------------------------
1.获取配置文件选项
$> hdfs getConf -confkey ...
2.配置最小块大小[hdfs-site.xml]
dfs.namenode.fs-limits.min-block-size = 512 * n;
注意:此选项值,必须是512的倍数。因为校验和是每512字节一校验。
注意:此选项值,需要去修改集群的配置文件。修改客户端配置文件无意义
3.配置辅助名称节点[hdfs-site.xml]
dfs.namenode.secondary.http-address = 50090
注意:此选项值,需要去修改集群的配置文件。修改客户端配置文件无意义
4.查看镜像文件和编辑日志
$> hdfs oiv -i fs_path/../fsimage -o out_path -p XML //使用xml解析镜像文件
$> hdfs oev -i edit_path/../edit -o out_path -p XML //使用xml解析日志文件
5.dfsadmin 管理命令
a.手动滚动日志文件
$> hdfs dfsadmin -rollEdits
b.启动hdfs时,镜像文件和日志文件会自动融合,并滚动镜像文件
c.安全模式
$> hdfs dfsadmin -safemode enter //进入
$> hdfs dfsadmin -safemode get //查看
$> hdfs dfsadmin -safemode leave //离开
$> hdfs dfsadmin -safemode wait //等待
注意:安全模式下,不能修改文件(增删改查)
d.保存名称空间(目录树),需要安全模式
$> hdfs dfsadmin -saveNamespace
e.namenode上刷新节点
$> hdfs dfsadmin -refreshNodes
6.配置名称节点和数据节点目录
a.配置名称节点文件存放目录
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/ubuntu/hadoop/dfs/name1,file:///home/ubuntu/hadoop/dfs/name2</value>
</property>
注意:name1和name2是副本的关系,也就是说,两个文件夹中的文件时一模一样的。是目录的2个副本
b.配置数据节点文件存放目录
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/ubuntu/hadoop/dfs/data1,file:///home/ubuntu/hadoop/dfs/data2</value>
</property>
注意:data1 和 data2没有关系,谁也不是谁的副本。只不过data1存满了,会接着往data2中存储
三、节点的服役和退役(hdfs)
---------------------------------------------------------------
1.添加新节点(服役)
a.查看配置文件[hdfs-site.xml] 的属性
<property>
<name>dfs.hosts</name>
<value>/soft/hadoop/etc/dfs-hosts-include.conf</value>
</property>
<property>
<name>dfs.hosts.exclude</name>
<value>/soft/hadoop/etc/dfs-hosts-exclude.conf</value>
</property>
b.在/soft/hadoop/etc/dfs-hosts-include.conf配置文件中,添加新节点的节点名称
注意:该文件在namenode的本地目录下
c.在namenode上刷新节点
$> hdfs dfsadmin -refreshNodes
d.在slaves文件中,添加新节点的主机名或者ip
e.单独启动新的节点中的datanode[在新节点中操作]
$> hadoop-daemon.sh start datanode
2.退役一个节点
a.查看配置文件[hdfs-site.xml] 的属性
<property>
<name>dfs.hosts</name>
<value>/soft/hadoop/etc/dfs-hosts-include.conf</value>
</property>
<property>
<name>dfs.hosts.exclude</name>
<value>/soft/hadoop/etc/dfs-hosts-exclude.conf</value>
</property>
b.在/soft/hadoop/etc/dfs-hosts-exclude.conf配置文件中,添加要退役的节点的节点名称
注意:该文件在namenode的本地目录下,没有就创建一个
注意:此时先不要动白名单(dfs-hosts-include.conf)
c.在namenode上刷新节点
$> hdfs dfsadmin -refreshNodes
d.去WebUI上查看节点的状态是否为退役(Decommission In Progress),
刷新,等待,直到所有要退役的节点的状态已经变成 Decommissioned 了.
这时说明,退役节点的数据已经在其他服役的节点上重新完成了备份。
数据转移工作已经完成
e.从白名单[dfs-hosts-include.conf]中删除已经退役的节点,并且刷新节点
f.在slaves文件中,删除退役节点的主机名或者ip
四、节点的服役和退役(yarn)
--------------------------------------------------
1.请参照三。
2.配置文件变成[yarn-site.xml]
<property>
<description>Path to file with nodes to include.</description>
<name>yarn.resourcemanager.nodes.include-path</name>
<value></value>
</property>
<property>
<description>Path to file with nodes to exclude.</description>
<name>yarn.resourcemanager.nodes.exclude-path</name>
<value></value>
</property>
3.刷新节点命令变成:yarn rmadmin -refreshNodes
五、MapReduce
-------------------------------------------------------
1.shuffle: M 和 R之间进行数据分发
2.分区: Map端的工作,预先对产生的kv进行分组。相同的k进入同一个reduce中
六、运行本地MR作业流程
----------------------------------------------------------
1.MR.Job提交作业并等待完成
2.通过作业提交器jobsubmitter,将MR.Job的所需的环境和(job.xml,job.jar,spilt等数据信息)的文件,写入到临时目录,供后续流程加载使用
3.通过作业提交器jobsubmitter,将MR.Job提交给本地任务运行器LocalJobRunner
4.本地任务运行器LocalJobRunner将MR.Job封装,转成自己内部的job对象(LocalJobRunner$Job)
5.内部Job(本质是线程),开启自身分线程;
6.内部Job执行run(),分别计算Map和Reduce的任务MapTask,ReduceTask信息(TaskID,TaskInfo等信息)
7.内部Job通过线程池孵化新线程,执行MapTask和ReduceTask任务
七、Intellij Idea 使用Maven打Jar包
----------------------------------------------------
1.在项目的pom.xml文件中,添加
<packaging>jar</packaging>
注意:此选项与<dependencies>...</dependencies>同级位置
2.找到Maven Project面板 --> lifecycle --> 双击package
3.注意,此时打包之前会默认先执行Test单元测试,可以禁用
4.禁用单元测试:skip test mode 一个蓝色闪电图标
5.jar包位置:target --> *.jar文件就是了
6.注意:jar包中会包含resources中的文件
八、hdfs的切片计算方式
------------------------------------------------
1.返回值就是1: getFormatMinSplitSize() = 1
2.获取配置文件设置的切片最小值,与1对比 (mapreduce.input.fileinputformat.split.minsize>=1)
long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
3.获取配置文件设置的切片最大值(<= Long.Max , mapreduce.input.fileinputformat.split.maxsize=)
long maxSize = getMaxSplitSize(job);
4.获取hdfs的blocksize大小
long blockSize = file.getBlockSize();
5.比较,然后取minSplit maxSplit blockSize 三者中的中间值
Math.max(minSize, Math.min(maxSize, blockSize));
6.最大和最小切片,可以通过代码指定
FileInputFormat.setMaxInputSplitSize(job,maxSize);
FileInputFormat.setMinInputSplitSize(job,minSize);